0
点赞
收藏
分享

微信扫一扫

Kubernetes之scert-manager证书控制器(证书自动颁发)


cert-manager证书控制器

cert-manager作为一系列部署资源在Kubernetes集群中运行。它 ​​​CustomResourceDefinitions​​​ 用于配置证书颁发机构和请求证书。

它使用常规的YAML清单进行部署,就像Kubernetes上的任何其他应用程序一样。

部署证书管理器后,您必须配置​​Issuer​​​或​​ClusterIssuer​​​ 代表证书颁发机构的资源。有关配置不同​​Issuer​​​类型的更多信息,请参见​​各自的配置指南​​。


注意:从cert-manager​​v0.14.0​​​开始,Kubernetes的最低支持版本是​​v1.11.0​​​。仍在运行Kubernetes​​v1.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-manager​​CustomResourceDefinition​​​资源中的字段 有关的验证错误 。这是一个良性错误,由于​​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



举报

相关推荐

0 条评论