備忘録：kubernetes/EKS基礎④(CI/CD)

# 備忘録

下記のような簡単なCI/CD環境を構築する。
Deploymentを作成するマニフェストをCodeCommitにpushするとCodeBuildでEKSクラスタにDeploymentを作成する。試しにDeploymentの```replicas: 2 → replicas: 3```に変更後、CodePiplineが起動してPod数が更新されることを確認

![スクリーンショット 2022-12-22 17.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/b33d1b62-0e31-56e3-beef-a49e10713e2b.png)



**ハマるポイント：下記CodeBuildのaws-authの設定**

https://aws.amazon.com/jp/premiumsupport/knowledge-center/codebuild-eks-unauthorized-errors/

# CodeCommit

* リポジトリ名を```eks-cicd-test```で作成

* リポジトリ準備

```shell
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
pip install git-remote-codecommit
```

```shell
git clone codecommit::ap-northeast-1://eks-cicd-test
cd eks-cicd-test
vim .git/config
```

```shell:.git/config
[user]
        name = xxxxxx
        email = xxxxxx@example.com
```

* マニフェスト準備

```shell
vim nginx-deployment.yml
git add .
git commit -m "msg"
git push
```
```yml: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
```

# CodeBuild

* ```buildspec.yml```の準備

```shell
vim buildspec.yml
git add .
git commit -m "msg"
git push
```

```yml:buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto17
      docker: 20

  pre_build:
    commands:
      - 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
      - mv kubectl /usr/local/bin
      - aws --region ap-northeast-1 eks update-kubeconfig --name $EKS_CLUSTER_NAME

  build:
    commands:
      - kubectl apply -f nginx-deployment.yml
      - kubectl get all
```

* ビルドプロジェクト作成

|項目|設定値|備考|
|:---|:---|:---|
|プロジェクト名|eks-cicd-test||
|ソースプロバイダ|AWS CodeCommit||
|リポジトリ|eks-cicd-test||
|リファレンスタイプ|ブランチ||
|ブランチ|main||
|環境イメージ|マネージド型イメージ||
|オペレーティングシステム|Amazon Linux 2||
|ランタイム|Standard||
|イメージ|standard:4.0||
|イメージのバージョン|最新||
|環境タイプ|Linux||
|特権付与|チェック||
|サービスロール|新しいサービスロール||
|ロール名|codebuild-eks-cicd-test-service-role||
|環境変数|名前：EKS_CLUSTER_NAME / 値：eks-clu2||
|アーティファクトはなし|||

* eksアクセス用のポリシー作成
```json:eks-test
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "eks:DescribeCluster",
            "Resource": "arn:aws:eks:*:*:cluster/*"
        }
    ]
}
```

* ```codebuild-eks-cicd-test-service-role```にポリシー追加
上記で作成した```eks-test```を追加

* aws-authの設定

```shell
kubectl edit configmap aws-auth --namespace kube-system
```

```/service-role```を削除してrolearnを指定する。

```shell
data:
  mapRoles: |
    - groups:
      - system:masters
      rolearn: arn:aws:iam::{AWS_ACCOUNT_ID}:role/codebuild-eks-cicd-test-service-role
      username: codebuild-eks-cicd-test-service-role
```

* マッピング情報が設定されていることを確認

```shell
eksctl get iamidentitymapping --cluster eks-clu2 --region=ap-northeast-1
```

# CodePipline

* パイプライン作成

|項目|設定値|備考|
|:---|:---|:---|
|パイプライン名|eks-cicd-test-pl|Step1|
|サービスロール|新しいサービスロール|Step1|
|ロール名|デフォルト|Step1|
|ソースプロバイダー|AWS CodeCommit|Step2|
|リポジトリ名|eks-cicd-test|Step2|
|ブランチ名|main|Step2|
|プロバイダーを構築する|AWS CodeBuild|Step3|
|プロジェクト名|eks-cicd-test|Step3|
|デプロイステージはスキップ||Step4|

# 動作確認

* CodeBuild手動で実行
Podが作成されていることを確認
```shell
kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5c577ccdf7-kxlx9   1/1     Running   0          26s
nginx-deployment-5c577ccdf7-nrtlm   1/1     Running   0          26s
```

* マニフェストを変更してCodeCommitにPush

```yml:nginx-deployment.yml
replicas: 2 → replicas: 3
```
```shell
git add .
git commit -m "msg"
git push
```

* CodePipelineが起動する
![スクリーンショット 2022-12-22 17.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/62c224ec-ba92-0133-499d-c5f0b5aa2827.png)

* Pod数が更新されている

```shell
kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5c577ccdf7-hk27l   1/1     Running   0          2m47s
nginx-deployment-5c577ccdf7-kxlx9   1/1     Running   0          8m20s
nginx-deployment-5c577ccdf7-nrtlm   1/1     Running   0          8m20s
```

# 関連記事

https://qiita.com/tkubota/items/021b775e4b8b3fad9bab

https://qiita.com/tkubota/items/349d7529667870439e41

https://qiita.com/tkubota/items/46b487598a49039c76c5