SSL/TLS証明書取得-DigitalOceanのkubernetes環境にwordpressを構築する05
SSL/TLS証明書取得
cert-managerのインストール
- manifestからの場合
- https://cert-manager.io/docs/installation/kubectl/
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.2/cert-manager.yaml
 
- https://cert-manager.io/docs/installation/kubectl/
- helmの場合
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.13.3 \
  --set installCRDs=truehelm ls -n cert-managercd ~/work/doks-wp/dev/k8s
mkdir ignore && cd ignoreletsencrypt設定
本番用の証明書は[staging]の部分を[prod]に変更します。
name:及びserver:はテスト用と本番用で分けること。
テスト用
ocarina@ab350-pro4:~/work/doks-wp/dev/k8s$ cat ignore/letsencrypt.yaml apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-staging
  namespace: doks-wp
spec:
  acme:
    # The ACME server URL
    # staging
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # prod
    #server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: 自分のメールアドレス
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-staging-private-key
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx本番用
vi ignore/letsencrypt.yaml apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-prod
  namespace: doks-wp
spec:
  acme:
    # The ACME server URL
    # staging
    #server: https://acme-staging-v02.api.letsencrypt.org/directory
    # prod
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: 自分のメールアドレス
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod-private-key
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginxkubectl apply -f letsencrypt.yamlclusterissuer.cert-manager.io/letsencrypt-staging created
ingressのmanifestをSSL用にアップデート
diff -c Ingress-doks-wp-web.yaml{.bk,}*** Ingress-doks-wp-web.yaml.bk 2023-12-30 16:46:28.691557641 +0900
--- Ingress-doks-wp-web.yaml    2024-01-05 23:04:21.092681076 +0900
***************
*** 1,22 ****
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
!   name: doks-wp-web-ingress
    namespace: doks-wp
    labels:
      app: doks-wp
    annotations:
!     nginx.ingress.kubernetes.io/rewrite-target: /$1
  spec:
    ingressClassName: nginx
    rules:
!     - host: 
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                 name: doks-wp-dev-web
                  port:
                    number: 80
--- 1,29 ----
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
!   name: doks-wp-dev-web-ingress
    namespace: doks-wp
    labels:
      app: doks-wp
    annotations:
! #    nginx.ingress.kubernetes.io/rewrite-target: /$1 # これが有効だとwordpressでは動きません
!     nginx.ingress.kubernetes.io/proxy-body-size: "0" # client_max_body_size. "413 Request Entity Too Large"
!     cert-manager.io/issuer: "letsencrypt-staging"
  spec:
    ingressClassName: nginx
+   tls:
+   - hosts:
+     - dev-memo.frzl.net
+     secretName : quickstart-dev-memo.frzl.net-tls
+   ingressClassName: nginx
    rules:
!     - host: dev-memo.frzl.net
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                 name: doks-wp-dev-web
                  port:
                    number: 80これnginx.ingress.kubernetes.io/rewrite-target: /$1
kubectl get certificate -n doks-wpNAME READY SECRET AGE
quickstart-dev-memo.frzl.net-tls True quickstart-dev-memo.frzl.net-tls 6d21h
証明書発行ステータスの確認
発行されない...
ocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl get challenges -n doks-wp -o wide
NAME                                                   STATE     DOMAIN          REASON                                                                                                                                                                                                                                                                                      AGE
quickstart-memo.frzl.net-tls-1-2816179123-3296559884   pending   memo.frzl.net   Waiting for HTTP-01 challenge propagation: failed to perform self check GET request 'http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY': Get "http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY": EOF   30mroot@instance-1:~# curl http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY
3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY.05MCbP8eciO5_TvJ5EnxQogdKYj_J-NFEvEJC7u_0K0root@instance-1:~# 問題ないようですけど.....
https://cert-manager.io/v1.9-docs/faq/acme/
HTTP01 と DNS01 は両方とも、cert-manager が ACME プロバイダーにチャレンジを提示する前に、まず「セルフチェック」を通過します。これは、DNS またはロードバランサーの伝播による失敗したチャレンジによって ACME プロバイダーに過負荷がかからないようにするために行われます。このステータスは、説明のステータス ブロックで確認できます。
確かに外部からはget出来たけどpod自身からはerrorになっている
ocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl exec -it pods/doks-wp-prod-web-5565c8949-9jz92 -n doks-wp -- /bin/bash
root@doks-wp-prod-web-5565c8949-9jz92:/var/www/html# curl http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY
curl: (52) Empty reply from serverocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl get secret -n doks-wp
NAME                                 TYPE                             DATA   AGE
dev-msmtprc                          Opaque                           1      4d5h
letsencrypt-prod                     Opaque                           1      83m
letsencrypt-staging                  Opaque                           1      6d22h
ocarina                              kubernetes.io/dockerconfigjson   1      7d5h
prod-msmtprc                         Opaque                           1      81m
quickstart-dev-memo.frzl.net-tls     kubernetes.io/tls                2      6d21h
quickstart-memo.frzl.net-tls-t2w7f   Opaque                           1      18mocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl get certificate -n doks-wp
NAME                               READY   SECRET                             AGE
quickstart-dev-memo.frzl.net-tls   True    quickstart-dev-memo.frzl.net-tls   6d21h
quickstart-memo.frzl.net-tls       False   quickstart-memo.frzl.net-tls       18mkubectl describe certificaterequest quickstart-memo.frzl.net-tls -n doks-wp | lessLBとingress-nginxのconfigmapでリアルIPアドレス取得設定を行ったため、内部から内部への通信が出来なくなったことによるもの。
hairpin-proxyのインストールで改善しました。
