0%

Kubernetes內自動化TLS憑證建立與管理

前言

cert-manager主要是用來在k8s上管理證書並且能夠自動更新證書

而config-syncer則可以跨namespace同步證書

一般來說每個namespace只能使用自己namespace底下的證書

但透過config-syncer可以將某個namespace的證書同步到其他的namespace

這樣就可以不用定期的去更換k8s的憑證了🎉

安裝cert-manager

下載cert-manager的yaml檔

1
wget https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml
1
kubectl apply -f cert-manager.yaml

確認cert-manager是否已正確部屬

1
kubectl get pods -n cert-manager

get-pod

前往cloudflare產生api token

建立Token => 自訂 Token

1
2
3
4
5
6
7
8
9
需要開啟的範圍為:


權限:
區域 - DNS - 編輯
區域 - 區域 - 讀取

區域資源:
包含 - 所有區域

如下圖:
cloudflare-api-token

建立完成後會得到一個token,這個token在你關閉視窗後就看不到了,所以要記得保存好!

建立cloudflare-secret.yaml

1
vim cloudflare-secret.yaml

cloudflare-secret.yaml的內容如下:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: "你剛才建立的token"

檔案建好後即可部屬secret

1
kubectl apply -f cloudflare-secret.yaml

建立issuer

1
vim prod-issuer.yaml

prod-issuer.yaml的內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: "輸入你cloudflare的信箱"
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- selector:
dnsZones:
- '輸入你的域名'
dns01:
cloudflare:
email: "輸入你cloudflare的信箱"
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
1
kubectl apply -f prod-issuer.yaml

查看ClusterIssuer是否有正確部屬

1
kubectl describe ClusterIssuer letsencrypt-prod

clusterIssuer

安裝config-syncer

config-syncer是用helm安裝的,需要先安裝helm

1
2
3
4
5
6
7
helm repo add appscode https://charts.appscode.com/stable/
helm repo update
#查看 repo
helm search repo appscode/kubed --version v0.13.2

# 將config-syncer的yaml檔案下載下來
helm template kubed appscode/kubed --version v0.13.2 --namespace kube-system > config-syncer.yaml

編輯config-syncer.yaml

將192行左右的”image: appscode/kubed:v0.13.2”

改為

“rancher/mirrored-appscode-kubed:v0.13.2”

會這樣改是因為官方的image連結已失效,目前是使用其他開發者先前備份的image

建立Certificate

1
vim certificate.yaml

certificate.yaml的內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: weipocheng
namespace: cert-manager
spec:
secretName: weipocheng
commonName: "*.weipocheng.xyz"
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
group: cert-manager.io
dnsNames:
- "*.weipocheng.xyz"
- "weipocheng.xyz"
secretTemplate:
annotations:
kubed.appscode.com/sync: "cert-manager-tls=weipocheng" # Sync certificate to matching namespaces

上面的名稱和網域可以改為你自己的名稱

另外kubed.appscode.com/sync裡面定義的”cert-manager-tls=weipocheng”是用來跟其他namespace同步的

只要其他namespace的meta.labels內有定義cert-manager-tls: weipocheng

config-syncer都會將”weipocheng”這個證書同步給其他的namespace

但也要記得在對應的ingress設定中

tls的secretName要記得設成相同的secret name

以k8s的dashboard為例子

dashboard的namespace:

dashboard-1

dashboard的ingress部分內容:

dashboard-2

將service部屬上後,確認網站的證書

dashboard-3

dashboard-4

查看該secret可發現來源為cert-manager的tls secret

dashboard-5

重要

如果源secret(cert-manager的secret)有任何變動,包含更新證書、刪除證書、刪除證書所在的ns..等等,已同步的其他ns的secret都會跟著更新、刪除!