[IBMCloud] IKS(kubernetes)バージョンアップ時の挙動確認

## テスト環境
東京リージョンの各ZoneにVSI for VPCのLinuxサーバを配置
* VSI for VPC(CentOS) TOK01 x 1台
* VSI for VPC(CentOS) TOK02 x 1台
* VSI for VPC(CentOS) TOK03 x 1台

サーバ側はIKS(Kubernetes)にてNginxのPodを各ゾーンに配置し、前段にIngressALBを配置
* Application load balancer for VPC x 1(TOK02/TOK03)
* IBM Cloud Kubernetes Service x 1Cluster(TOK02/TOK03)
    * Nginx Pod(TOK02) x 1台
    * Nginx Pod(TOK03) x 1台
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/19ba4bb5-1827-accc-1408-add382bfeb7e.png)

## テスト内容
バージョンアップ時に簡単なHTTP通信を発生させ、通信への影響がどの程度あるか確認する
通信経路としては４パターンとする
①VSI for VPC(TOK1) -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
②VSI for VPC(TOK2) -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
③VSI for VPC(TOK3) -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
④Internet Client PC -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)

構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/67a753cc-ade4-81a3-37d7-ee181f01375f.png)

## 事前動作確認
VSIとPCからALB(3cd5e244-jp-tok.lb.appdomain.cloud)の8080ポートにアクセスする
Nginxのホスト名が記載されたhtmlが表示されることで異なるPodのNginxにアクセスできていることを確認

Nginx-POD1:**iks-nginx-cd7748fdf-8mkx7**
Nginx-POD2:**iks-nginx-cd7748fdf-4nt2x**

### パターン①
VSI for VPC(TOK1) -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
```
[root@tok01-sv ~]# while true; do curl --max-time 1 -s http://3cd5e244-jp-tok.lb.appdomain.cloud:8080 || echo "Request timed out or failed."; sleep 1; done
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:01:20
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:01:21
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:01:22
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:01:23
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:01:24
```

### パターン②
VSI for VPC(TOK2) -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
```
[root@tok02-sv ~]# while true; do curl --max-time 1 -s http://3cd5e244-jp-tok.lb.appdomain.cloud:8080 || echo "Request timed out or failed."; sleep 1; done
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:06
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:07
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:08
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:09
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:02:10
```

### パターン③
VSI for VPC(TOK3) -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
```
[root@tok03-sv ~]# while true; do curl --max-time 1 -s http://3cd5e244-jp-tok.lb.appdomain.cloud:8080 || echo "Request timed out or failed."; sleep 1; done
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:52
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:53
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:02:54
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:02:55
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:02:56
```

### パターン④
④Internet Client PC -> IngressALB(TOK02/TOK03) -> POD(TOK02/TOK03)
```
% while true; do curl --max-time 1 -s http://3cd5e244-jp-tok.lb.appdomain.cloud:8080 || echo "Request timed out or failed."; sleep 1; done
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:03:10
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:03:11
Hostname: iks-nginx-7fbc7dfc94-pcmnh Current Time: 2024-06-26 07:03:12
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:03:13
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:03:15
```

## IKSのバージョンアップの準備
IKSのバージョンアップ方法については、下記ドキュメント通りに実施する
[クラスター・マスターを更新するための手順](https://cloud.ibm.com/docs/containers?topic=containers-update&interface=cli#master-steps)

### 現在のクラスター・マスター・バージョンの確認
ドキュメント:[CLI でのクラスター・マスター・バージョンの確認](https://cloud.ibm.com/docs/containers?topic=containers-flavor-os-check&interface=cli#cluster-version-cli)

現在は「1.28.11_1564」のバージョンであることがわかる
```
kh@khs-MacBook-Pro nginx-time % ibmcloud ks cluster ls
OK
名前                          ID                     状態     作成日         ワーカー   ロケーション   バージョン               リソース・グループ名   プロバイダー
acs-paascluster-jp-tok        co9j451t0t7uths6kb10   normal   2 months ago   2          Tokyo          1.28.11_1564             acs-paas               vpc-gen2
```

### 現在のワーカー・ノードのバージョンの確認
ドキュメント:[CLI でのワーカー・ノードのバージョンの確認](https://cloud.ibm.com/docs/containers?topic=containers-flavor-os-check&interface=cli#worker-version-cli)

現在は「1.28.11_1565」のバージョンであることがわかる
```
% ibmcloud ks worker ls -c co9j451t0t7xxx
OK
ID                                                       プライマリー IP   フレーバー   状態     状況    ゾーン     バージョン
kube-co9j451t0t7uths6kb10-acspaasclus-lowspec-000006c4   10.244.128.21     cx2.2x4      normal   Ready   jp-tok-3   1.28.11_1565
kube-co9j451t0t7uths6kb10-acspaasclus-lowspec-0000074c   10.244.64.28      cx2.2x4      normal   Ready   jp-tok-2   1.28.11_1565
```

### アドオンの確認
クラスター内のアドオンを確認
```
% ibmcloud ks cluster addon ls --cluster co9j451t0t7xxx
OK
名前                   バージョン   正常性の状態   正常性の状況
debug-tool             2.0.0        normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-block-csi-driver   5.1          normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
```

インストールされている各アドオンでサポートされている Kubernetes のバージョンを確認
```
kh@khs-MacBook-Pro ~ % ibmcloud ks addon-versions
OK
名前                        バージョン         サポートされる Kubernetes 範囲   サポートされる OpenShift 範囲   Kubernetes デフォルト   OpenShift デフォルト
alb-oauth-proxy             2.0.0 (default)    >=1.19.0 <1.31.0                 サポート対象外                  -                       -
cluster-autoscaler          1.2.0              >=1.24.0 <1.29.0                 >=4.10.0 <4.16.0                >=1.27.0 <1.29.0        >=4.12.0 <4.16.0
cluster-autoscaler          1.2.1              >=1.26.0 <1.30.0                 >=4.10.0 <4.16.0                >=1.29.0 <1.30.0        -
cluster-autoscaler          1.2.2              >=1.26.0 <1.31.0                 >=4.10.0 <4.16.0                >=1.30.0 <1.31.0        -
cluster-autoscaler          1.1.0              >=1.20.0 <1.24.0                 >=4.6.0 <4.13.0                 -                       -
csutil                      1.0.0 (default)    >=1.20.0 <1.31.0                 >=4.6.0 <4.16.0                 -                       -
csutil-experimental         1.0.0 (default)    >=1.20.0 <1.31.0                 >=4.6.0 <4.16.0                 -                       -
debug-tool                  2.0.0 (default)    >=1.23.0 <1.31.0                 >=4.11.0 <4.16.0                -                       -
image-key-synchronizer      1.0.0 (default)    サポート対象外                   >=4.4.0 <4.16.0                 -                       -
istio                       1.20               >=1.25.0 <1.30.0                 サポート対象外                  -                       -
istio                       1.22               >=1.27.0 <1.31.0                 サポート対象外                  -                       -
istio                       1.21 (default)     >=1.27.0 <1.30.0                 サポート対象外                  -                       -
openshift-data-foundation   4.12.0             サポート対象外                   >=4.12.0 <4.14.0                -                       -
openshift-data-foundation   4.13.0             サポート対象外                   >=4.13.0 <4.15.0                -                       -
openshift-data-foundation   4.14.0 (default)   サポート対象外                   >=4.14.0 <4.16.0                -                       -
openshift-data-foundation   4.15.0             サポート対象外                   >=4.15.0 <4.16.0                -                       -
static-route                1.0.0 (default)    >=1.23.0 <1.31.0                 >=4.11.0 <4.16.0                -                       -
vpc-block-csi-driver        5.1 (default)      >=1.22.0 <1.31.0                 >=4.9.0 <4.16.0                 -                       -
vpc-block-csi-driver        5.2                >=1.25.0 <1.31.0                 >=4.10.0 <4.16.0                -                       -
vpc-file-csi-driver         1.2 (default)      >=1.24.0 <1.31.0                 >=4.10.0 <4.16.0                -                       -
```

今使っているのは、「debug-tool」と「vpc-block-csi-driver」なので、下記の通りなので
1.28以降にバージョンアップしても問題ないことがわかる
```
名前                        バージョン         サポートされる Kubernetes 範囲   サポートされる OpenShift 範囲   Kubernetes デフォルト   OpenShift デフォルト
debug-tool                  2.0.0 (default)    >=1.23.0 <1.31.0                 >=4.11.0 <4.16.0                -                       -
vpc-block-csi-driver        5.2                >=1.25.0 <1.31.0                 >=4.10.0 <4.16.0                -                       -
```

## IKSバージョンアップの実施
### サポートされるバージョンの確認
```
% ibmcloud ks versions                                            
OK
Kubernetes バージョン
1.27.15 (推奨されておらず、84 日後にはサポート対象外)
1.28.11
1.29.6
1.30.2 (default)
```

### API サーバーと、関連するマスター・コンポーネントを更新
**ibmcloud ks cluster master update**コマンドを実行
ibmcloud ks cluster master update --cluster <ClusterID> --version <IKSバージョン>
```
% ibmcloud ks cluster master update --cluster co9j451t0t7xxx --version 1.29.6
更新中、クラスターにアクセスすることも変更することもできません。 ユーザーがデプロイしたワーカー・ノード、アプリ、リソースは変更されず、引き続き実行されます。
今後のデプロイメント用に、YAML ファイルを変更する必要がある場合があります。 詳しくは、次の資料を確認してください: 'https://ibm.biz/iks-versions'。
Kubernetes API サーバー co9j451t0t7xxx を 1.29.6 に更新しますか? [y/N]> y
クラスター co9j451t0t7uths6kb10 を更新中...
OK 
```

#### CLIで状況を確認
```
kh@khs-MacBook-Pro testenv % ibmcloud ks cluster ls 
OK
名前                          ID                     状態     作成日         ワーカー   ロケーション   バージョン                               リソース・グループ名   プロバイダー
acs-paascluster-jp-tok        co9j451t0t7xxx   normal   2 months ago   2          Tokyo          1.28.11_1564 --> 1.29.6_1545 (pending)   acs-paas               vpc-gen2
```

#### WebConsoleで状況を確認
![貼り付けた画像_2024_06_26_16_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/bcdbf719-18e7-906d-a68d-d727940f1ad2.png)

### アップデート完了
しばらくアップデートが完了するまで待つ
おおよそ25分でバージョンアップが完了した。
<font color="red">その間にパターン①〜④でHTTPアクセスの停止は見られなかった</font>
```
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:21:25
.
.
.
Hostname: iks-nginx-7fbc7dfc94-kf7dl Current Time: 2024-06-26 07:42:59
```

#### CLIでの完了確認
```
% ibmcloud ks cluster ls
OK
名前                          ID                     状態     作成日         ワーカー   ロケーション   バージョン               リソース・グループ名   プロバイダー
acs-paascluster-jp-tok        co9j451t0t7uths6kb10   normal   2 months ago   2          Tokyo          1.29.6_1545              acs-paas               vpc-gen2
```
#### WebConsoleでの完了確認
![貼り付けた画像_2024_06_26_16_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/0eac2f97-9cf1-0a21-e993-d29e7b7bcc73.png)


## バージョンアップ時の通信状況結果
:::note info
通信断は確認できなかった
:::

ibmcloud ks cluster master update --cluster <ClusterID> --version <IKSバージョン>実施時

パターン①
```
ダウンなし
```

パターン②
```
ダウンなし
```

パターン③
```
ダウンなし
```

パターン④
```
ダウンなし
```

## その他、検証環境について

### Nginx-Pod
index.html
```html
% cat index.html
Hostname: ${HOSTNAME} Current Time: ${CURRENT_TIME}
```

hostnameとcurrenttimeの表示スクリプト
```sh
% cat docker-entrypoint.sh
#!/bin/sh

while true; do
    # 環境変数を設定
    export HOSTNAME=$(hostname)
    export CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")

    # テンプレートファイルを実際のファイルに置き換え
    envsubst '${HOSTNAME} ${CURRENT_TIME}' < /usr/share/nginx/html/index.html > /usr/share/nginx/html/index.html

    # 一秒待機
    sleep 1
done &

# nginxを起動
nginx -g 'daemon off;'
```

Dockerfile
```dockerfile
% cat Dockerfile
FROM nginx:alpine

# 必要なツールをインストール
RUN apk add --no-cache gettext

# ファイルをコピー
COPY index.template.html /usr/share/nginx/html/index.template.html
COPY docker-entrypoint.sh /docker-entrypoint.sh

# エントリーポイントスクリプトを設定
ENTRYPOINT ["/docker-entrypoint.sh"]
```

### Deployment
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iks-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: iks-nginx-container
        image: jp.icr.io/xxx-cr/nginx-hosttime:latest
        ports:
        - containerPort: 80
```

### Service(ALB)
```yaml
apiVersion: v1
kind: Service
metadata:
  name: vpcalb-nginx
  annotations:
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets: "02f7-cfe80769-8c09-4099-a446-485e99baced4,02g7-c931fc19-1177-458d-9dda-0b8b46634222"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol: "http"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-port: "30080"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path: "/"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-delay: "5"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout: "2"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-retries: "2"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout: "50"
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 8080
    nodePort: 30080
    targetPort: 80
  externalTrafficPolicy: Cluster
```

## WorkerNodeのバージョンアップ
こちらは別記事にて記載する