eksを使ってkubernetesの自己学習(随時更新予定)

# はじめに
k8sを業務で使うため、学習する。目標はCKAの取得とする。

#　環境
- AWS CloudShell
    - 最近、CloudShellの良さに気がついた

# 準備
kubectlのインストールのため、home直下に以下のshを配置

``` get_eksctl.sh 
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
```
CloudShellの仕様でホームディレクトリ以外の消えるので、学習開始する度に毎回shellを実行。

# 環境構築

``` bash
eksctl create cluster \
 --name test-cluster \
 --version 1.21 \
 --node-type t3.medium \
 --nodegroup-name test-nodegroup \
 --nodes 1 \
 --nodes-min 1 \
 --nodes-max 2 \
 --node-volume-size 20 \
 --node-volume-type gp3 \
 --region ap-northeast-1 \
 --zones ap-northeast-1c,ap-northeast-1d
```
コスト削減のため、ノード数1、インスタンスサイズ　t3.mediumとしている。

## 後片付け
練習なので、勉強が終わるたびに作成したeks clusterを削除する。

``` bash
$ eksctl get cluster
2021-10-02 17:03:46 [ℹ]  eksctl version 0.68.0
2021-10-02 17:03:46 [ℹ]  using region ap-northeast-1
NAME            REGION          EKSCTL CREATED
test-cluster    ap-northeast-1  True

$ eksctl delete cluster take-cluster
2021-10-02 17:06:43 [ℹ]  eksctl version 0.68.0
2021-10-02 17:06:43 [ℹ]  using region ap-northeast-1
(省略)
```

# 操作
##サンプルファイルを作成
``` sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
        name: sample-pod
spec:
        containers:
        - name: nginx-container
          image: nginx:1.17
```
## pod作成
```bash 
$ kubectl apply -f sample-pod.yaml 
pod/sample-pod created

$ kubectl get pod --watch
NAME        READY   STATUS      RESTARTS   AGE
sample-pod  1/1     Running     0          12s
```
pod作成するには**kubectl createコマンドは使わず、applyコマンドを使うようにする。**
watchのオプションを付けると、podが作られるまでの流れが閲覧できる。

## 現在のnodeを表示

```bash
$ kubectl get node
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-22-171.ap-northeast-1.compute.internal   Ready    <none>   50m   v1.21.2-eks-55daa9d
```

## 現在のpodを表示
```bash
$ kubectl get pod # podsでもいけるが複数形の有無による違いがまだ不明。。。
NAME        READY   STATUS      RESTARTS   AGE
sample-pod  1/1     Running     0          12s
```

## podの詳細情報表示
```bash
$ kubectl describe pod sample-pod
Name:         sample-pod
Namespace:    default
(省略....)
```
## podに入って操作
```bash
$ kubectl exec -it sample-pod -- /bin/bash 
root@sample-pod:/# exit
exit
#※複数コンテナがあるpodの場合はコンテナを指定することができる。
kubectl exec -it sample-pod -c nginx-container -- /bin/bash
```

## podに入らずにコマンド実行
```bash
$ kubectl exec -it sample-pod -- /bin/ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
```

## nginxコンテナにアクセスする。（ポートフォワーディングする）
```bash
$ kubectl port-forward sample-pod 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
# 上記の状態で別ターミナルを開いてcurlでアクセス
$ curl -I localhost:8888
HTTP/1.1 200 OK
Server: nginx/1.17.10
(省略)
```

## コンテナへのファイル転送
```bash
$ cat hoge.txt
fugafuga
$ kubectl cp hoge.txt sample-pod:/tmp/hoge.txt
$ kubectl exec -it sample-pod -- ls /tmp
hoge.txt
$ kubectl exec -it sample-pod -- cat /tmp/hoge.txt
fugafuga
```

## pod削除
```bash
$ kubectl apply -f sample-pod.yaml 
pod "sample-pod" deleted
```

## podを動かしているnode自体に入る
```bash
$ kubectl get node
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-22-171.ap-northeast-1.compute.internal   Ready    <none>   29m   v1.21.2-eks-55daa9d

$ kubectl debug node/ip-192-168-22-171.ap-northeast-1.compute.internal -it --image=busybox

# debugしたらpodを削除するのを忘れずに
$ kubectl delete pod node-debugger-ip-192-168-22-171.ap-northeast-1.compute.internal-5rl68
pod "node-debugger-ip-192-168-22-171.ap-northeast-1.compute.internal-5rl68" deleted
```

## ログ出力
```bash
#複数コンテナがあった場合はコンテナ名をする
$ kubectl logs sample-pod -c nginx-container
127.0.0.1 - - [02/Oct/2021:16:19:09 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.76.1" "-"

# -f オプションで tail -fと同等
$ kubectl logs -f sample-pod -c nginx-container

# 詳細に検索することも可能
$ kubectl logs --since=1h --tail=2 --timestamps=true sample-pod -c nginx-container
2021-10-02T16:19:15.283527114Z 127.0.0.1 - - [02/Oct/2021:16:19:15 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.76.1" "-"
2021-10-02T16:19:21.939423399Z 127.0.0.1 - - [02/Oct/2021:16:19:21 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.76.1" "-"
```

# kubectlコマンドが失敗する際のデバック方法
```bash
# ログレベルを6にした場合。8だとさらに詳細になる。
$ kubectl -v=6 get pod
I1002 16:50:09.745016    5895 loader.go:379] Config loaded from file:  /home/cloudshell-user/.kube/config
I1002 16:50:10.270984    5895 round_trippers.go:445] GET https://A2C7531B784B4794990D4EE17C805F50.gr7.ap-northeast-1.eks.amazonaws.com/api/v1/namespaces/default/pods?limit=500 200 OK in 517 milliseconds
```

ここまで。