Kubernetes/EKSに入門してみる

# EKSとは？
コンテナオーケストレーターとは？やk8sの簡単な構成や動きについて記載。
JAWS-UG初心者支部#53 新年LTスペシャル会の登壇資料です。

https://speakerdeck.com/toru_kubota/k8s-eks-basic-438a5092-c336-496a-b395-1c390bf750fc


# EKSの簡単な試し方
## １．Cloud9の準備

### Cloud9環境の作成
```Name```のみ入力してあとはデフォルトのまま作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/d3652b47-5244-e412-60be-cc9a1debf4b3.png)

### AMTC無効化

環境作成が完了し、Cloud9のコンソール画面に接続後、```歯車のアイコン```→```AWS Settings```の順に選択し```AWS managed temporary credentials```を無効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/d13792e8-dfa5-cc64-efb1-f996281ad312.png)

### kubectlのインストール
Cloud9のコンソールで下記コマンドを入力します。
```shell
curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.7/2022-06-29/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
kubectl version --short --client
```

**参考(入力例)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5399a3db-4e14-f934-8eb7-e70829a42d76.png)

**参考(AWS公式手順)**

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html


### eksctlのインストール

Cloud9のコンソールで下記コマンドを入力します。
```shell
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
```

**参考(AWS公式手順)**

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eksctl.html

### IAMロール作成
一般的なユースケースで```EC2```を選択してIAMロールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/a962ad14-2720-dc30-0d5f-f589d3136c4b.png)

テスト用途なので```AdministratorAccess```を追加して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/9af7bb0f-3aa8-df60-c183-f54d9d7155b8.png)

ロール名を入力してロールの作成を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/9b0a09f7-f5b7-ecfa-9aa3-c99db262e9b3.png)

### IAMロール割当
EC2のコンソール画面に移動後、Cloud9のインスタンスをチェックして、```アクション```→```セキュリティ```→```IAMロールを変更```の順に選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/be1e58a1-5359-4370-ca2c-e08e7cfdb2c8.png)

先ほど作成したIAMロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/6373482f-1641-59ec-5614-ec4dbce09519.png)


## ２．クラスタの作成
Cloud9のコンソールから下記コマンドを入力します。
```shell
eksctl create cluster \
    --region ap-northeast-1 \
	--name  eks-clu \
	--version 1.23 \
	--nodegroup-name eks-ng \
	--node-type t3.micro \
	--nodes 2 \
	--nodes-min 2
```
プロンプトが返ってきたら作成完了です。（20分位かかります。）
CloudFormationでスタックのステータスが```CREATE_COMPLETE```になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/f3182c1e-a608-8078-928a-1ff9ef9b0d72.png)


またEKSコンソールから作成したクラスタの確認、EC2コンソールからデータプレーン用のEC2が作成されていることを確認出来ます。


## ３．リソースの作成

### マニフェストの作成
Cloud9の```File```→```New File```という箇所から新しいファイルが作成できますので、下記の内容で```nginx-deployment.yml```と```nginx-service.yml```を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/4624a9c6-9869-a065-beaf-15220e00385f.png)

```yaml:nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx-app
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
```

```yaml:nginx-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
```
### マニフェストの適用

```kubectl apply```コマンドでマニフェストファイル適用後、```kubectl get pod```でPodが作成されていることを確認します。

```shell
kubectl apply -f nginx-deployment.yml

kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6c588ccdf7-bghpc   1/1     Running   0          18s
nginx-deployment-6c588ccdf7-nq244   1/1     Running   0          18s
```

```kubectl apply```コマンドでマニフェストファイル適用後、```kubectl get service```でLoadBalancerが作成されていることを確認します。


```shell
kubectl apply -f nginx-service.yml

kubectl get service
kubectl get service
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)        AGE
kubernetes      ClusterIP      10.100.0.1      <none>                                                                         443/TCP        15m
nginx-service   LoadBalancer   10.100.34.217   xxxxxxxxx.ap-northeast-1.elb.amazonaws.com   80:30276/TCP   8s
```

上記LoadBalancerのDNS名```xxxxxxxxx.ap-northeast-1.elb.amazonaws.com```にアクセスして、nginxのTOP画面が表示されることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/fae396c0-377e-a2b5-b01a-55ddda125d11.png)



## ４．クラスタの削除

忘れないようにクラスタの削除を実施します。Cloud9コンソールで下記コマンドを実行します。

```shell
eksctl delete cluster \
    --region ap-northeast-1 \
	--name  eks-clu
```

プロンプトが返ってきたら念のため下記を確認しておきます。

* CloudFormationの画面からスタックがなくなっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/d8ca470e-7e94-467e-efb7-515f5ba71f81.png)
※Cloud9は最後に削除します。

* EKSコンソールからクラスタがなくなっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0f6ce2a4-0b75-dfa9-58e6-7aeb027afa5d.png)

* EC2コンソールからインスタンスが終了になっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/028f9f09-e9cc-001b-ab90-509fe6fb862e.png)


作成したCloud9の環境とIAMロールも削除します。

* Cloud9の削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/9379f85c-7480-cd45-202f-608c97a6d605.png)


* IAMロールの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0290cc0a-02b7-a782-2857-4074485af0fd.png)