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

cert-manager证书控制器

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

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

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

注意:从cert-managerv0.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/v1API资源。

注意:如果您正在运行Kubernetesv1.15.4或更低版本,则需要在上面--validate=falsekubectl apply命令中添加 标志,否则您将收到与x-kubernetes-preserve-unknown-fieldscert-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 群集证书颁发者

证书管理器需要 IssuerClusterIssuer 资源,才能颁发证书。 这两种 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值