cert-manager证书控制器
cert-manager作为一系列部署资源在Kubernetes集群中运行。它 CustomResourceDefinitions
用于配置证书颁发机构和请求证书。
它使用常规的YAML清单进行部署,就像Kubernetes上的任何其他应用程序一样。
部署证书管理器后,您必须配置Issuer
或ClusterIssuer
代表证书颁发机构的资源。有关配置不同Issuer
类型的更多信息,请参见各自的配置指南。
注意:从cert-manager
v0.14.0
开始,Kubernetes的最低支持版本是v1.11.0
。仍在运行Kubernetesv1.10
或更低版本的用户应在安装cert-manager之前升级到受支持的版本。警告:您不应在单个群集上安装cert-manager的多个实例。这将导致不确定的行为,您可能会被诸如“让我们加密”之类的提供商禁止。
安装证书控制器
所有资源(CustomResourceDefinitions
,cert-manager,名称空间和webhook组件)都包含在单个YAML清单文件中:
注意:如果您使用的是
kubectl
以下版本v1.19.0-rc.1
,则更新CRD时会遇到问题。有关更多信息,请参见v0.16升级说明
安装CustomResourceDefinitions
和cert-manager本身:
# Kubernetes 1.16+
kubectl create namespace cert-manager
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.3/cert-manager.yaml
注意:如果您使用的是下面的Kubernetes版本
v1.15
,则需要安装清单的旧版本。此版本没有API版本转换,仅支持cert-manager.io/v1
API资源。注意:如果您正在运行Kubernetes
v1.15.4
或更低版本,则需要在上面--validate=false
的kubectl apply
命令中添加 标志,否则您将收到与x-kubernetes-preserve-unknown-fields
cert-managerCustomResourceDefinition
资源中的字段 有关的验证错误 。这是一个良性错误,由于kubectl
执行资源验证的方式而发生。注意:在GKE(Google Kubernetes Engine)上运行时,在创建其中一些资源时可能会遇到“权限被拒绝”错误。这是GKE处理RBAC和IAM权限的方式的细微差别,因此在运行上述命令之前,应将自己的特权“提升”为“ cluster-admin”的特权。如果您已经运行了上述命令,则应在提升权限后再次运行它们:
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user=$(gcloud config get-value core/account)
注意:默认情况下,cert-manager将安装到
cert-manager
名称空间中。尽管您需要对部署清单进行修改,但是可以在其他名称空间中运行cert-manager。
验证
kubectl get pods --namespace cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m
cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m
创建 CA 群集证书颁发者
证书管理器需要 Issuer 或 ClusterIssuer 资源,才能颁发证书。 这两种 Kubernetes 资源的功能完全相同,区别在于 Issuer
适用于单一命名空间,而 ClusterIssuer
适用于所有命名空间。 有关详细信息,请参阅证书管理器颁发者文档。
使用以下示例清单创建群集证书颁发者,例如 cluster-issuer.yaml
。 将电子邮件地址更新为组织提供的有效地址:
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: MY_EMAIL_ADDRESS
privateKeySecretRef:
name: letsencrypt
solvers:
- http01:
ingress:
class: nginx
podTemplate:
spec:
nodeSelector:
"kubernetes.io/os": linux
若要创建证书颁发者,请使用 kubectl apply
命令。
kubectl apply -f cluster-issuer.yaml
部署Ingress入口路由
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
#指定ca证书颁发者
cert-manager.io/cluster-issuer: letsencrypt
k8s.kuboard.cn/workload: web-phpipam
labels:
k8s.kuboard.cn/layer: web
k8s.kuboard.cn/name: web-phpipam
name: web-phpipam
namespace: ingress-basic
spec:
rules:
- host: phpipam.www.trusit.net
http:
paths:
- backend:
serviceName: web-phpipam
servicePort: 80
path: /
# 配置证书名称
tls:
- hosts:
- phpipam.www.trusit.net
secretName: tls-secret
使用 kubectl apply
命令创建入口资源。
kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
验证是否已创建证书对象
接下来,必须创建证书资源。 证书资源定义了必需的 X.509 证书。 有关详细信息,请参阅证书管理器证书。 证书管理器已使用 ingress-shim(自 v0.2.2 以来随证书管理器自动部署)为你自动创建了证书对象。 有关详细信息,请参阅 ingress-shim 文档。
若要验证证书是否已成功创建,请使用 kubectl get certificate --namespace ingress-basic
命令,并验证 READY 是否为 True,这可能需要数分钟
$ kubectl get certificate --namespace ingress-basic
NAME READY SECRET AGE
tls-secret True tls-secret 11m
测试入口配置
将 Web 浏览器打开到 Kubernetes 入口控制器的 hello-world-ingress.MY_CUSTOM_DOMAIN。 请注意,系统会将你重定向,让你使用 HTTPS。证书是受信任的,演示应用程序显示在 Web 浏览器中。 添加路径,并注意显示了自定义标题的第二个演示应用程序。
清理资源
本文使用 Helm 来安装入口组件、证书和示例应用。 在部署 Helm 图表时,会创建若干 Kubernetes 资源。 这些资源包括 pod、部署和服务。 若要清理这些资源,可以删除整个示例命名空间,也可以删除单个资源。
删除示例命名空间以及所有资源
若要删除整个示例命名空间,请使用 kubectl delete
命令并指定命名空间名称。 将会删除命名空间中的所有资源。
控制台复制
kubectl delete namespace ingress-basic
单独删除资源
也可采用更细致的方法来删除单个已创建的资源。 首先,删除群集颁发者资源:
控制台复制
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
使用 helm list
命令列出 Helm 版本。 查找名为“nginx”和“cert-manager”的图表,如以下示例输出中所示 :
复制
$ helm list --namespace ingress-basic
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
cert-manager ingress-basic 1 2020-01-15 10:23:36.515514 -0600 CST deployed cert-manager-v0.13.0 v0.13.0
nginx ingress-basic 1 2020-01-15 10:09:45.982693 -0600 CST deployed nginx-ingress-1.29.1 0.27.0
使用 helm uninstall
命令卸载这些版本。 以下示例将卸载 NGINX 入口和证书管理器部署。
复制
$ helm uninstall cert-manager nginx --namespace ingress-basic
release "cert-manager" uninstalled
release "nginx" uninstalled
接下来,删除两个示例应用程序:
控制台复制
kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic
kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
删除将流量定向到示例应用的入口路由:
控制台复制
kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
最后,可以删除自身命名空间。 使用 kubectl delete
命令并指定命名空间名称。
控制台复制
kubectl delete namespace ingress-basic