Kubernetes 集群自動生成更新HTTPS證書教程,單域名,通配符域名證書申請

簡介

詳情請到GitHub查看:https://github.com/PowerDos/k8s-cret-manager-aliyun-webhook-demo

這里介紹如何在K8s中通過cret-manager自動創(chuàng)建HTTPS證書,提供兩種方式赏寇,一種是單域名證書,一種是通過阿里云DNS驗證實現(xiàn)通配符域名證書申請

我們這里通過Helm安裝cret-manager,請注意查看k8s版本正確安裝對應(yīng)版本的應(yīng)用

1.安裝Helm 3

官方安裝教程: https://helm.sh/docs/intro/install/

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

2.安裝cert-manager

前期準(zhǔn)備

添加命名空間

kubectl create namespace cert-manager

添加cret-manager源

helm repo add jetstack https://charts.jetstack.io

更新源

helm repo update

安裝CRDs

注意安裝對應(yīng)的版本

# Kubernetes 1.15+
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.1/cert-manager.crds.yaml

# Kubernetes <1.15
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.1/cert-manager-legacy.crds.yaml

安裝cert-manager

$ helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v0.15.1

驗證是否安裝成功

以下結(jié)果為成功,你也可以看看鏡像日志脐彩,是否正常啟動碎乃,是否正常

$ kubectl get pods --namespace cert-manager

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6344597-zw8kh               1/1     Running   0          2m
cert-manager-cainjector-348f6d9fd7-tr77l   1/1     Running   0          2m
cert-manager-webhook-893u48fcdb-nlzsq      1/1     Running   0          2m

3.安裝證書

官方介紹這中 Issuer 與 ClusterIssuer 的概念:

Issuers, and ClusterIssuers, are Kubernetes resources that represent certificate authorities (CAs) that are able to generate signed certificates by honoring certificate signing requests. All cert-manager certificates require a referenced issuer that is in a ready condition to attempt to honor the request.

Issuer 與 ClusterIssuer 的區(qū)別是 ClusterIssuer 可跨命名空間使用荠锭,而 Issuer 需在每個命名空間下配置后才可使用共虑。這里我們使用 ClusterIssuer蓬蝶,其類型選擇 Let‘s Encrypt

測試證書

# cluster-issuer-letsencrypt-staging.yaml

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # 務(wù)必將此處替換為你自己的郵箱, 否則會配置失敗。當(dāng)證書快過期時 Let's Encrypt 會與你聯(lián)系
    email: gavin.tech@qq.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # 將用來存儲 Private Key 的 Secret 資源
      name: letsencrypt-staging
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
    - http01:
        ingress:
          class: nginx

正式證書

# cluster-issuer-letsencrypt-prod.yaml

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email:  gavin.tech@qq.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            class: nginx

這里安裝兩個環(huán)境的證書的作用

這里分別配置了測試環(huán)境與生產(chǎn)環(huán)境兩個 ClusterIssuer谍咆, 原因是 Let’s Encrypt 的生產(chǎn)環(huán)境有著非常嚴(yán)格的接口調(diào)用限制禾锤,最好是在測試環(huán)境測試通過后,再切換為生產(chǎn)環(huán)境供嚎。生產(chǎn)環(huán)境和測試環(huán)境的區(qū)別:https://letsencrypt.org/zh-cn/docs/staging-environment/

在Ingress中使用證書

在ingress配置后黄娘,會自動生成證書

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    # 務(wù)必添加以下兩個注解, 指定 ingress 類型及使用哪個 cluster-issuer
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer:"letsencrypt-staging" # 這里先用測試環(huán)境的證書測通后,就可以替換成正式服證書

    # 如果你使用 issuer, 使用以下注解 
    # cert-manager.io/issuer: "letsencrypt-staging"
spec:
  tls:
  - hosts:
    - example.example.com                # TLS 域名 - 這里僅支持單域名查坪,下面會講通配符的域名配置
    secretName: quickstart-example-tls   # 用于存儲證書的 Secret 對象名字寸宏,可以是任意名稱,cert-manager會自動生成對應(yīng)名稱的證書名稱
  rules:
  - host: example.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kuard
          servicePort: 80

4.通過DNS配置通配符域名證書

這里樣式的是阿里云DNS操作的流程偿曙,如果需要其他平臺的方法氮凝,可以自行開發(fā),或者找已開源webhook望忆,這是官方的例子:https://github.com/jetstack/cert-manager-webhook-example

這里用的是這個包:https://github.com/pragkent/alidns-webhook

安裝WebHook

不同cret-manager的安裝辦法不同

cret-manager 版本大于等于v0.11

安裝
# Install alidns-webhook to cert-manager namespace. 
kubectl apply -f https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml
添加阿里云RAM賬號

子賬號需要開通HTTPS管理權(quán)限(AliyunDNSFullAccess,管理云解析(DNS)的權(quán)限)

apiVersion: v1
kind: Secret
metadata:
  name: alidns-secret
  namespace: cert-manager
data:
  access-key: YOUR_ACCESS_KEY # 需要先base64加密
  secret-key: YOUR_SECRET_KEY # 需要先base64加密
創(chuàng)建ClusterIssuer

測試證書申請

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging-dns
spec:
  acme:
    email: gavin.tech@qq.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-staging-dns
    solvers:
    - dns01:
        webhook:
          groupName: acme.yourcompany.com # 注意這里要改動罩阵,在https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml中也要改動對應(yīng)的groupName
          solverName: alidns
          config:
            region: ""
            accessKeySecretRef:
              name: alidns-secret
              key: access-key
            secretKeySecretRef:
              name: alidns-secret
              key: secret-key

正式證書申請

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod-dns
spec:
  acme:
    email: gavin.tech@qq.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-dns
    solvers:
    - dns01:
        webhook:
          groupName: acme.yourcompany.com
          solverName: alidns
          config:
            region: "" # 這里可以不填 或者填對應(yīng)的區(qū)域:cn-shenzhen
            accessKeySecretRef:
              name: alidns-secret
              key: access-key
            secretKeySecretRef:
              name: alidns-secret
              key: secret-key
創(chuàng)建Certificate

測試證書

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: ditigram-com-staging-tls
spec:
  secretName: ditigram-com-staging-tls
  commonName: ditigram.com
  dnsNames:
  - ditigram.com
  - "*.ditigram.com"
  issuerRef:
    name: letsencrypt-staging-dns
    kind: ClusterIssuer

正式證書

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: ditigram-com-prod-tls
spec:
  secretName: ditigram-com-prod-tls
  commonName: ditigram.com
  dnsNames:
  - ditigram.com
  - "*.ditigram.com"
  issuerRef:
    name: letsencrypt-prod-dns
    kind: ClusterIssuer
在Ingress中應(yīng)用
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    # 務(wù)必添加以下兩個注解, 指定 ingress 類型及使用哪個 cluster-issuer
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer:"letsencrypt-staging-dns" # 這里先用測試環(huán)境的證書測通后,就可以替換成正式服證書
spec:
  tls:
  - hosts:
    - "*.ditigram.com"                     # 如果填寫單域名就只會生產(chǎn)單域名的證書启摄,如果是通配符請?zhí)顚?*.example.com", 注意:如果填寫example.com只會生成www.example.com一個域名稿壁。
    secretName: ditigram-com-staging-tls   # 測試的證書,填寫剛剛創(chuàng)建Certificate的名稱歉备,注意更換環(huán)境時證書也要一起更換傅是,這里并不會像單域名一樣自動生成
  rules:
  - host: example.ditigram.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kuard
          servicePort: 80

cret-manager 版本小于v0.11

安裝
# Install alidns-webhook to cert-manager namespace. 
kubectl apply -f https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/legacy.yaml
添加阿里云RAM賬號

子賬號需要開通HTTPS管理權(quán)限(AliyunDNSFullAccess,管理云解析(DNS)的權(quán)限)

apiVersion: v1
kind: Secret
metadata:
  name: alidns-secret
  namespace: cert-manager
data:
  access-key: YOUR_ACCESS_KEY # 需要先base64加密
  secret-key: YOUR_SECRET_KEY # 需要先base64加密
創(chuàng)建ClusterIssuer

測試證書申請

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging-dns
spec:
  acme:
    email: gavin.tech@qq.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-staging-dns
    solvers:
    - dns01:
        webhook:
          groupName: acme.yourcompany.com # 注意這里要改動,在https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml中也要改動對應(yīng)的groupName
          solverName: alidns
          config:
            region: ""
            accessKeySecretRef:
              name: alidns-secret
              key: access-key
            secretKeySecretRef:
              name: alidns-secret
              key: secret-key

正式證書申請

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod-dns
spec:
  acme:
    email: gavin.tech@qq.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-dns
    solvers:
    - dns01:
        webhook:
          groupName: acme.yourcompany.com
          solverName: alidns
          config:
            region: "" # 這里可以不填 或者填對應(yīng)的區(qū)域:cn-shenzhen
            accessKeySecretRef:
              name: alidns-secret
              key: access-key
            secretKeySecretRef:
              name: alidns-secret
              key: secret-key
創(chuàng)建Certificate

測試證書

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: ditigram-com-staging-tls
spec:
  secretName: ditigram-com-staging-tls
  commonName: ditigram.com
  dnsNames:
  - ditigram.com
  - "*.ditigram.com"
  issuerRef:
    name: letsencrypt-staging-dns
    kind: ClusterIssuer

正式證書

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: ditigram-com-prod-tls
spec:
  secretName: ditigram-com-prod-tls
  commonName: ditigram.com
  dnsNames:
  - ditigram.com
  - "*.ditigram.com"
  issuerRef:
    name: letsencrypt-prod-dns
    kind: ClusterIssuer
在Ingress中應(yīng)用
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    # 務(wù)必添加以下兩個注解, 指定 ingress 類型及使用哪個 cluster-issuer
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer:"letsencrypt-staging-dns" # 這里先用測試環(huán)境的證書測通后蕾羊,就可以替換成正式服證書
spec:
  tls:
  - hosts:
    - "*.ditigram.com"                     # 如果填寫單域名就只會生產(chǎn)單域名的證書喧笔,如果是通配符請?zhí)顚?*.example.com", 注意:如果填寫example.com只會生成www.example.com一個域名。
    secretName: ditigram-com-staging-tls   # 測試的證書龟再,填寫剛剛創(chuàng)建Certificate的名稱书闸,注意更換環(huán)境時證書也要一起更換,這里并不會像單域名一樣自動生成
  rules:
  - host: example.ditigram.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kuard
          servicePort: 80
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末利凑,一起剝皮案震驚了整個濱河市浆劲,隨后出現(xiàn)的幾起案子嫌术,更是在濱河造成了極大的恐慌,老刑警劉巖牌借,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件度气,死亡現(xiàn)場離奇詭異,居然都是意外死亡膨报,警方通過查閱死者的電腦和手機蚯嫌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丙躏,“玉大人,你說我怎么就攤上這事束凑∩孤茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵汪诉,是天一觀的道長废恋。 經(jīng)常有香客問我,道長扒寄,這世上最難降的妖魔是什么鱼鼓? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮该编,結(jié)果婚禮上迄本,老公的妹妹穿的比我還像新娘。我一直安慰自己课竣,他們只是感情好嘉赎,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著于樟,像睡著了一般公条。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迂曲,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天靶橱,我揣著相機與錄音,去河邊找鬼路捧。 笑死关霸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鬓长。 我是一名探鬼主播谒拴,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涉波!你這毒婦竟也來了英上?” 一聲冷哼從身側(cè)響起炭序,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苍日,沒想到半個月后惭聂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡相恃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年辜纲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦耐。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耕腾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杀糯,到底是詐尸還是另有隱情扫俺,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布固翰,位于F島的核電站狼纬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骂际。R本人自食惡果不足惜疗琉,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歉铝。 院中可真熱鬧盈简,春花似錦、人聲如沸太示。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽先匪。三九已至种吸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀非,已是汗流浹背坚俗。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岸裙,地道東北人猖败。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像降允,于是被迫代替她去往敵國和親恩闻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354