前言
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
前往cloudflare產生api token
建立Token => 自訂 Token1
2
3
4
5
6
7
8
9需要開啟的範圍為:
權限:
區域 - DNS - 編輯
區域 - 區域 - 讀取
區域資源:
包含 - 所有區域
如下圖:
建立完成後會得到一個token,這個token在你關閉視窗後就看不到了,所以要記得保存好!
建立cloudflare-secret.yaml
1 | vim cloudflare-secret.yaml |
cloudflare-secret.yaml的內容如下:1
2
3
4
5
6
7
8apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: "你剛才建立的token"
檔案建好後即可部屬secret1
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
24apiVersion: 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-token1
kubectl apply -f prod-issuer.yaml
查看ClusterIssuer是否有正確部屬1
kubectl describe ClusterIssuer letsencrypt-prod
安裝config-syncer
config-syncer是用helm安裝的,需要先安裝helm1
2
3
4
5
6
7helm 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
18apiVersion: 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的ingress部分內容:
將service部屬上後,確認網站的證書
查看該secret可發現來源為cert-manager的tls secret