CKA試験、Pod

# Pod

## チートシート
https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates

- コンテナを表現するk8s APIの最小の単位
- Podには1つ、または、複数のコンテナが含まめる場合がある

## Pod生成方法
```shell
kubectl run web --image=nginx:1.14 --port=80
```
nginxのイメージで80ポートを設定する

## Pod確認
```shell
kubectl get pods
```

## Pod削除方法
```shell
kubectl delete pod web
```
web というPodを削除する

## Pod作成Yaml方法
```shell
kubectl run web --image=nginx:1.14 --port=80 --dry-run=client -o > web.yaml
```
dry run実行計画をweb.yamlファイルで出力

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
```

```sh
kubectl apply -f web.yaml
```
作成したYamlファイルを元に、Podを作成

# CKA試験例1
`cka-exam`というnamespaceを作成し、`cka-exam`namespaceに下のようなPodを作成しなさい
```
pod 名: pod-01
image: buxybox
環境変数: CERT="CKA-cert"
command: /bin/sh
args: -c "while true; do echo $(CERT); sleep 10; done"
```

```shell
kubectl config use-context k8s

kubectl create namespace cka-exam

kubectl run pod-01 --image=busybox --dry-run=client -o yaml > 3-1.yaml
```
- 環境変数に関する[Docs](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/#define-an-environment-variable-for-a-container)
- コマンドに関する[Docs](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/)

```3-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-01
  namespace: cka-exam
spec:
  containers:
  - name: pod-o1
    image: busybox
    env: 
      - name: CERT
        value: "CKA-cert"
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(CERT); sleep 10; done"]
```

```shell
kubectl apply -f 3-1.yaml
```


# CKA試験例2
pod `custom-app`のLogをモニタリングし、`file not found`メッセージを含むログラインを`opt/REPORT/2022/custom-app/log`に記録しなさい

```shell
kubectl get logs custom-app | grep 'file not found' > opt/REPORT/2022/custom-app/log
```


# Static Pod
- APIサバーなしに、特定のノードにある`kubelet`によって、直接管理する
- `/etc/kubernetes/manifests/`ディレクトリにPod Yamlファイルを保存したら、適応される
- 上記の`ディレクトリ(/etc/kubernetes/manifests/)`は`/var/lib/kubelet/config.yaml`にて設定可能
- Static Podを置いておくディレクトリを修正したら、Kubeletでデモンを再実行する必要ある`systemctl restart kubelet`

```shell
sudo su - 
cd /etc/kubernetes/manifest
kubectl run webserver --image=nginx:1.14 --port=80 --dry-run=client -o yaml > webserver.yaml
```
![스크린샷 2023-03-05 18.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961840/d8fb84bc-a323-4661-d645-685721ffdb33.png)
static podが存在することを確認

# Multi-Container
- ひとつのPodに幾つかのコンテナが含まめて一緒に実行される

## チートシート
https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/#creating-a-pod-that-runs-two-containers

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
```
![스크린샷 2023-03-05 18.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961840/9a0c0b15-f41b-ba24-6452-3b36aba84efe.png)


# CKA試験例3

4つのコンテナを動作する　`eshop-frontend` Pod を作成しなさい

- nginx
- redis
- memcached
- consul


```shell
kubectl run eshop-frontend --image=nginx --dry-run=client -o yaml > 3-2.yaml
``` 

```3-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: eshop-frontend
spec:
  containers:
  - image: nginx
    name: nginx-container
  - image: redis
    name: redis-container
  - image: memcached
    name: memcached-container
  - image: consul
    name: consul-container
```

```shell
kubectl apply -f 3-2.yaml
kubectl get pod eshop-frontend
```

# Sidecarコンテナ
- 基本コンテナ機能を拡張するために利用。本来のコンテナは基本サービスを実行し、追加機能を別途コンテナを利用して適応

# CKA試験例4
現在の運用中の`eshop-cart-app` PodのログをKubernetes built in loggingアーキテクチャに統合するログストリミんぐサイドカーコンテナを運営しなさい
- `busybox`イメージを利用した`price`という名前のサイドカーコンテナを既存の`eshop-cart-app`に追加します
- 新たな`price`コンテナは次のコマンドを実行する必要があります`/bin/sh, -c, "tail -n+1 -f /var/log/cart-app.log"
- `/var/log`にマウントしたVolumeを利用し、サイドカーコンテナでログファイル`cart-app.log`うぃ利用する必要があります
- `eshop-cart-app`PODと`cart-app`コンテナを修正しないでください

```shell
kubectl get pod eshop-cart-app -o yaml > 3-3.yaml
```

```3-3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: eshop-cart-app
  namespace: default
  resourceVersion: "978814"
  uid: a9800501-c50e-4168-a142-347ea9173433
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - 'i=1;while :;do  echo -e ": Price: 1875" >> /var/log/cart-app.log; i=1; sleep
      2; done'
    image: busybox
    name: cart-app
    volumeMounts:
    - mountPath: /var/log
      name: varlog
  - name: price
    image: busybox:1.28
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/cart-app.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}
```

```shell
kubectl apply -f 3-3.yaml
```

## チートシート
https://kubernetes.io/docs/concepts/cluster-administration/logging/#sidecar-container-with-logging-agent