[IBMCloud] もう期限切れで焦らない！IKSのTLS証明書を自動更新する仕組みを作る Part5

## 作業概要
Part4:「IKSからパブリック証明書の参照と自動更新」にてカスタムドメイン証明書の発行ができたので、この証明書を利用しPublic IngressALBでSecretManagerの作成した証明書をインポートし、TLS終端とアプリケーションへのアクセスが正常に実施可能か確認する

参考ページ：[セットアップ・ステップ](https://cloud.ibm.com/docs/containers?topic=containers-managed-ingress-setup#managed-ingress-steps)

インターネットのクライアントからPODまでのアクセスルートは下記の通り
```
[Client]
   │  HTTP/HTTPS (443)
   ▼
[Load Balancer / Ingress Controller]
   │  受信したリクエストをIngressルールに従ってルーティング
   ▼
[Ingress Resource]
   │    host: www.acspaas.site
   │    backend: service-iks-nginx:30081
   ▼
[Service: service-iks-nginx]
   │  Serviceポート：30081  →  TargetPort：80
   ▼
[Pod (コンテナ)]
   │  コンテナがリッスンしているポート：80
★アプリケーション表示
```

## 全体の流れ
ボリュームがあるので、全5回で記事を記載します。
本記事では「4.カスタムドメインパブリック証明書の発行と自動更新」の内容を記載

**前回**
1.[自動証明書管理環境（ACME）のセットアップと認証局の構成](https://qiita.com/khoshina/items/c435a155b7048d8a9069)
2.[DNS Providerの設定と自動更新カスタムドメイン証明書(パブリック)の発行](https://qiita.com/khoshina/items/65ac174f20924b486b4c)
3.[IKSとSecret Managerの連携設定と自動更新の確認](https://qiita.com/khoshina/items/f994d2e413363e48cf26)
4.[IKSからパブリック証明書の参照と自動更新](https://qiita.com/khoshina/items/c2e5b22877a48629a671)

**本記事はこちら**
<font color="red">**5.**作成後公開**:[IngressALBから証明書の利用とアプリケーションへのHTTPS動作確認]**</font>

**全体図**
IKSでSecret Managerを利用して、IngressALBにPublic証明書を適用し、証明書の自動更新を行う一例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a0522f04-e045-44c9-a439-b012b6ddb589.png)

## カスタムドメイン用のIngress Secretの登録
参考ページ：[カスタム・サブドメインの TLS シークレットのセットアップ](https://cloud.ibm.com/docs/containers?topic=containers-secrets#tls-custom)

前回、SecretManagerからIKSに取り込んだ証明書を調べる
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
testcert-namespace-after                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ad685e86-e7dd-6286-31b0-597b0dd77309   2025-06-04T15:54:31+0000   acspaas.site                                                                          created   TLS
testcert-namespace-before                           test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ad685e86-e7dd-6286-31b0-597b0dd77309   2025-06-04T15:54:31+0000   acspaas.site                                                                          created   TLS
testcert                                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest.jp-tok.containers.appdomain.cloud                                         created   TLS
```

新規でシークレットを作る場合は、下記の通り実施できる
```
% ibmcloud ks ingress secret create --name ingress-alb-tls --cluster cv4ef49t0jeirigoaasg --cert-crn crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ad685e86-e7dd-6286-31b0-597b0dd77309 --namespace default
OK
```

今回は、新規で「www.acspaas.site」の証明書をSecretManagerからIKS Secretにインポートする
```
% ibmcloud ks ingress secret create --cluster cv4ef49t0jeirigoaasg --cert-crn crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:9c7badcb-e482-d25c-93fe-943b73e4d520 --name www.acspaas.site --namespace default
OK

% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
testcert-namespace-after                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ad685e86-e7dd-6286-31b0-597b0dd77309   2025-06-04T15:54:31+0000   acspaas.site                                                                          created   TLS
testcert-namespace-before                           test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ad685e86-e7dd-6286-31b0-597b0dd77309   2025-06-04T15:54:31+0000   acspaas.site                                                                          created   TLS
testcert                                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest.jp-tok.containers.appdomain.cloud                                         created   TLS
www.acspaas.site                                    default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:9c7badcb-e482-d25c-93fe-943b73e4d520   2025-06-09T01:19:16+0000   www.acspaas.site                                                                      created   TLS
```

## Cluster IPサービスの作成
構成図で言うと「Service: service-iks-nginx」の部分を作る
```
[Ingress Resource]
   │    host: www.acspaas.site
   │    backend: service-iks-nginx:30081
   ▼
[Service: service-iks-nginx]
   │  Serviceポート：30081  →  TargetPort：80
   ▼
[Pod (コンテナ)]
   │  コンテナがリッスンしているポート：80
★アプリケーション表示
```

IngressALBとワーカーノード(POD)間のネットワークを作成する
```
% kubectl expose deploy iks-nginx --name service-iks-nginx --port 30081 --target-port=80 -n default
service/service-iks-nginx exposed
```

yaml
```yaml
% ku get svc service-iks-nginx
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
service-iks-nginx   ClusterIP   172.21.152.141   <none>        30081/TCP   7m6s

% ku get svc service-iks-nginx -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2025-03-11T03:17:54Z"
  name: service-iks-nginx
  namespace: default
  resourceVersion: "696506"
  uid: bcc71434-2dc6-4f59-9a18-cad163e2f208
spec:
  clusterIP: 172.21.152.141
  clusterIPs:
  - 172.21.152.141
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 30081
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}
```

## Ingressの作成
構成図で言うと「Ingress Resource」の部分を作る
```
[Ingress Resource]
   │    host: www.acspaas.site
   │    backend: service-iks-nginx:30081
   ▼
[Service: service-iks-nginx]
   │  Serviceポート：30081  →  TargetPort：80
   ▼
[Pod (コンテナ)]
   │  コンテナがリッスンしているポート：80
★アプリケーション表示
```

ドメイン名、Serviceおよび作成したシークレットの情報を書き込み作成する
```yaml
% ku apply -f ingress-acspaas.yaml
ingress.networking.k8s.io/my-ingress-resource created

% cat ingress-acspaas.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-resource
spec:
  ingressClassName: public-iks-k8s-nginx
  tls:
  - hosts:
    - www.acspaas.site
    secretName: www.acspaas.site
  rules:
  - host: www.acspaas.site
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service-iks-nginx
            port:
              number: 30081

% ku describe ingress my-ingress-resource
Name:             my-ingress-resource
Labels:           <none>
Namespace:        default
Address:          3bc64147-jp-tok.lb.appdomain.cloud
Ingress Class:    public-iks-k8s-nginx
Default backend:  <default>
TLS:
  www.acspaas.site terminates www.acspaas.site
Rules:
  Host              Path  Backends
  ----              ----  --------
  www.acspaas.site
                    /   service-iks-nginx:30081 (172.17.90.16:80,172.17.122.35:80)
Annotations:        <none>
Events:
  Type    Reason  Age               From                      Message
  ----    ------  ----              ----                      -------
  Normal  Sync    1s (x2 over 30s)  nginx-ingress-controller  Scheduled for sync
  Normal  Sync    1s (x2 over 30s)  nginx-ingress-controller  Scheduled for sync
```

作成したシークレットを正常にIngressが参照し、サービスでネットワークに関連付けられることで
インターネット上からIngressを経由し、WorkerNodeのPODにアクセス可能な状態となる
```
% curl https://www.acspaas.site
Hostname: iks-nginx-76cf8d4869-7kmwj Current Time: 2025-03-11 03:33:05
```

ingressALBが二台のPODでロードバランスしている
podA:iks-nginx-76cf8d4869-7kmwj
podB:iks-nginx-76cf8d4869-59nww
```
% while true; do curl --max-time 1 -s https://www.acspaas.site || echo "Request timed out or failed."; sleep 1; done
Hostname: iks-nginx-76cf8d4869-7kmwj Current Time: 2025-03-11 03:34:02
Hostname: iks-nginx-76cf8d4869-59nww Current Time: 2025-03-11 03:34:03
Hostname: iks-nginx-76cf8d4869-7kmwj Current Time: 2025-03-11 03:34:05
Hostname: iks-nginx-76cf8d4869-59nww Current Time: 2025-03-11 03:34:05
Hostname: iks-nginx-76cf8d4869-7kmwj Current Time: 2025-03-11 03:34:07
Hostname: iks-nginx-76cf8d4869-59nww Current Time: 2025-03-11 03:34:08
Hostname: iks-nginx-76cf8d4869-7kmwj Current Time: 2025-03-11 03:34:09
Hostname: iks-nginx-76cf8d4869-59nww Current Time: 2025-03-11 03:34:10
Hostname: iks-nginx-76cf8d4869-59nww Current Time: 2025-03-11 03:34:11
```