CodeSnippet.Cn
代码片段
Csharp
架构设计
.NetCore
西班牙语
kubernetes
MySql
Redis
Algorithm
Ubuntu
Linux
Other
.NetMvc
VisualStudio
Git
pm
Python
WPF
java
Plug-In
分布式
CSS
微服务架构
JavaScript
DataStructure
Shared
k8s证书管理【Cert manager自动签发/更新证书】
0
kubernetes
小笨蛋
发布于:2021年09月11日
更新于:2021年09月11日
250
#custom-toc-container
> Cert manager使用的是免费证书Let's Encrypt,并支持在证书过期时自动更新。 ### 添加helm源 注意[stable/cert-manager](https://github.com/helm/charts/tree/master/stable/cert-manager "stable/cert-manager")已经过时不再维护了,转到[jetstack/cert-manager](https://github.com/jetstack/cert-manager/tree/master/deploy/charts/cert-manager "jetstack/cert-manager")。 `helm repo add jetstack https://charts.jetstack.io` ### 更新源 `helm repo update` ### 创建CRDs `kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml` `kubectl create -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml` 安装 ```csharp 这里设置了两个默认值 --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer --set ingressShim.defaultIssuerGroup=cert-manager.io 用于在后续创建Ingress时,配合annotations kubernetes.io/tls-acme: "true" kubernetes.io/ingress.class: "nginx" 实现自动创建证书。 ``` `helm install --name cert-manager --namespace cert-manager --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer --set ingressShim.defaultIssuerGroup=cert-manager.io jetstack/cert-manager` ### 查看安装是否完成 ```csharp [root@k8s-master cert]# kubectl get pod -n cert-manager NAME READY STATUS RESTARTS AGE cert-manager-5cd477f7bb-fxpvf 1/1 Running 0 22m cert-manager-cainjector-df4dc78cd-l527b 1/1 Running 0 22m cert-manager-webhook-5f78ff89bc-ggvqt 1/1 Running 0 22m ``` 创建默认签发机构([官方文档](https://cert-manager.io/docs "官方文档")) 刚刚安装时已经指定了默认签发类型是ClusterIssuer ,签发机构名称是letsencrypt-prod ,但是我们还没有创建,现在需要创建cluster-issuer.yaml。 > cert-manager 给我们提供了 Issuer 和 ClusterIssuer 这两种用于创建签发机构的自定义资源对象,Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书. ```yaml apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: zzm@codeSnippet.cn privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx ``` 上述配置:[参考链接](https://imroc.io/posts/kubernetes/let-ingress-enable-free-https-with-cert-manager/ "参考链接") - metadata.name 是我们创建的签发机构的名称,后面我们创建证书的时候会引用它 - spec.acme.email 是你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期 - spec.acme.server 是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行 - spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要 - spec.acme.http01 这里指示签发机构使用 HTTP-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书) `kubectl create -f cluster-issuer.yaml` `kubectl get clusterissuer` ### 配置ingress ```yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx kubernetes.io/tls-acme: "true" nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/ssl-redirect: "true" labels: app: kubernetes-dashboard chart: kubernetes-dashboard-1.10.0 heritage: Tiller release: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: rules: - host: k8s.deri.com http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 443 path: / tls: - hosts: - k8s.deri.com secretName: deri-com-tls-secret-cc ``` 由于添加了annotations kubernetes.io/tls-acme: "true",tls这个secret会自动创建。 ### 卸载 ```yaml helm delete --purge cert-manager kubectl delete -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml ``` ### Check ```yaml [root@master ~]# kubectl get certificate -n gateway NAME READY SECRET AGE consul-tls-test True consul-tls-test 19m [root@master ~]# kubectl get clusterissuer NAME READY AGE letsencrypt-prod True 157m [root@master ~]# kubectl get certificate -n gateway NAME READY SECRET AGE consul-tls-test True consul-tls-test 19m [root@master ~]# kubectl get Order -n gateway NAME STATE AGE consul-tls-test-3546184973-1845474898 valid 20m [root@master ~]# kubectl get CertificateRequest -n gateway NAME READY AGE consul-tls-test-3546184973 True 27m [root@master ~]# kubectl get secret -ngateway NAME TYPE DATA AGE consul-tls-test kubernetes.io/tls 3 29m ```
这里⇓感觉得写点什么,要不显得有点空,但还没想好写什么...
返回顶部
About
京ICP备13038605号
© 代码片段 2024