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=true
helm ls -n cert-manager
cd ~/work/doks-wp/dev/k8s
mkdir ignore && cd ignore
letsencrypt設定
本番用の証明書は[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: nginx
kubectl apply -f letsencrypt.yaml
clusterissuer.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
これ
があると画像やcss,wp-admin等にアクセスできませんでしたので外しています。nginx.ingress.kubernetes.io/rewrite-target: /$1
kubectl get certificate -n doks-wp
NAME 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 30m
root@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 server
ocarina@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 18m
ocarina@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 18m
kubectl describe certificaterequest quickstart-memo.frzl.net-tls -n doks-wp | less
LBとingress-nginxのconfigmapでリアルIPアドレス取得設定を行ったため、内部から内部への通信が出来なくなったことによるもの。
hairpin-proxyのインストールで改善しました。