当前位置: 首页 > 工具软件 > cert-manager > 使用案例 >

k8s-3:cert-manager安装使用

易骁
2023-12-01

一、安装

这里使用helm安装的1.6.1版本

先决条件

1. 添加 Jetstack Helm 存储库:

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

2. 更新您本地的 Helm 图表存储库缓存

$ helm repo update

3.安装 CustomResourceDefinitions

cert-manager 需要一些 CRD 资源,可以使用手动安装,也可以在安装 Helm chart 时kubectl使用installCRDs选项。

选项 1:安装 CRD kubectl

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.crds.yaml

选项 2:安装 CRD 作为 Helm 版本的一部分

要在 Helm 版本中自动安装和管理 CRD,您必须将--set installCRDs=true标志添加到 Helm 安装命令中。

在接下来的步骤中取消注释相关行以启用此功能。

请注意,如果您使用的是helm基于 Kubernetesv1.18或更低版本(Helm v3.2) 的版本,installCRDs则无法与 cert-manager 一起使用v0.16。有关更多详细信息,请参阅v0.16 升级说明

4.安装证书管理器

要安装 cert-manager Helm chart,请使用Helm install 命令,如下所述。

helm install \

  --name-template cert-manager \

  --namespace cert-manager \

  --set ingressShim.defaultIssuerName=letsencrypt-prod \

  --set ingressShim.defaultIssuerKind=ClusterIssuer \

  --version v1.6.1 \

  jetstack/cert-manager

--set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer:用于全自动TLS,在ingress.yaml中配置kubernetes.io/tls-acme: "true"后会自动创建证书

部署 cert-manager 后,您可以验证安装。

查看

root@master24:~# kubectl get pods --namespace cert-manager -o wide

NAME                                       READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES

cert-manager-57d89b9548-dq4k7              1/1     Running   0          3h    10.244.122.147   node26   <none>           <none>

cert-manager-cainjector-5bcf77b697-gwss2   1/1     Running   0          3h    10.244.122.146   node26   <none>           <none>

cert-manager-webhook-9cb88bd6d-djxxm       1/1     Running   0          3h    10.244.122.145   node26   <none>           <none>

验证

创建测试资源 kubectl apply -f test-resources.yaml

[root@master cert-manager]# cat <<EOF > test-resources.yaml

apiVersion: v1

kind: Namespace

metadata:

  name: cert-manager-test

---

apiVersion: cert-manager.io/v1alpha2

kind: Issuer

metadata:

  name: test-selfsigned

  namespace: cert-manager-test

spec:

  selfSigned: {}

---

apiVersion: cert-manager.io/v1alpha2

kind: Certificate

metadata:

  name: selfsigned-cert

  namespace: cert-manager-test

spec:

  commonName: example.com

  secretName: selfsigned-cert-tls

  issuerRef:

    name: test-selfsigned

EOF

检查新创建证书的状态。您可能需要等待几秒钟,然后cert-manager才能处理证书请求。

[root@master cert-manager]# kubectl describe certificate.cert-manager.io -n cert-manager-test

Name:         selfsigned-cert

Namespace:    cert-manager-test

Labels:       <none>

Annotations:  kubectl.kubernetes.io/last-applied-configuration:

                {"apiVersion":"cert-manager.io/v1alpha2","kind":"Certificate","metadata":{"annotations":{},"name":"selfsigned-cert","namespace":"cert-mana...

API Version:  cert-manager.io/v1alpha2

Kind:         Certificate

Metadata:

  Creation Timestamp:  2019-12-11T08:23:18Z

  Generation:          1

  Resource Version:    2363190

  Self Link:           /apis/cert-manager.io/v1alpha2/namespaces/cert-manager-test/certificates/selfsigned-cert

  UID:                 0c152ff9-184e-4b8f-9fe7-fc4fb4b2d86f

Spec:

  Common Name:  example.com

  Issuer Ref:

    Name:       test-selfsigned

  Secret Name:  selfsigned-cert-tls

Status:

  Conditions:

    Last Transition Time:  2019-12-11T08:23:18Z

    Message:               Certificate is up to date and has not expired

    Reason:                Ready

    Status:                True

    Type:                  Ready

  Not After:               2020-03-10T08:23:18Z

Events:

  Type    Reason        Age   From          Message

  ----    ------        ----  ----          -------

  Normal  GeneratedKey  10s   cert-manager  Generated a new private key

  Normal  Requested     10s   cert-manager  Created new CertificateRequest resource "selfsigned-cert-2334779822"

  Normal  Issued        10s   cert-manager  Certificate issued successfully

清理测试资源。

[root@master cert-manager]# kubectl delete -f test-resources.yaml

输出 YAML

可以使用Helm 模板命令创建静态 YAML 清单,而不是使用 Helm 直接安装 cert-manager 。可以通过提供覆盖默认 Helm 值的标志来调整此静态清单:

helm template \

  cert-manager jetstack/cert-manager \

  --namespace cert-manager \

  --create-namespace \

  --version v1.6.1 \

  # --set prometheus.enabled=false \   # Example: disabling prometheus using a Helm parameter

  # --set installCRDs=true \           # Uncomment to also template CRDs

  > cert-manager.custom.yaml

卸载

警告:要卸载 cert-manger,您应该始终使用相同的安装过程,但相反。从静态清单或 Helm 安装 cert-manager 是否偏离以下过程可能会导致问题和潜在的损坏状态。请确保在卸载时遵循以下步骤以防止发生这种情况。

在继续之前,请确保已删除用户创建的所有 cert-manager 资源。您可以使用以下命令检查任何现有资源:

kubectl get Issuers,ClusterIssuers,Certificates,CertificateRequests,Orders,Challenges --all-namespaces

删除所有这些资源后,您就可以使用由您的安装方式确定的过程卸载 cert-manager

使用 Helm 卸载

helm安装中卸载 cert-manager是运行安装过程的一种情况,相反,在kubectl 和上使用 delete 命令helm

helm --namespace cert-manager delete cert-manager

接下来,删除 cert-manager 命名空间:

kubectl delete namespace cert-manager

最后,CustomResourceDefinitions 使用vX.Y.Z您安装的版本的链接删除证书管理 器:

警告:此命令还将删除已安装的 cert-manager CRD。certificates.cert-manager.ioKubernetes 的垃圾收集器将删除所有证书管理器资源(例如资源)。

$ kubectl delete -f https://github.com/jetstack/cert-manager/releases/download/vX.Y.Z/cert-manager.crds.yaml

命名空间卡在终止状态

如果命名空间已被标记为删除,而没有先删除 cert-manager 安装,则命名空间可能会卡在终止状态。这通常是因为APIService资源仍然存在,但是 webhook 不再运行,因此不再可访问。要解决此问题,请确保您已正确运行上述命令,如果您仍然遇到问题,请运行:

$ kubectl delete apiservice v1beta1.webhook.cert-manager.io

二、配置

ACME配置

apiVersion: cert-manager.io/v1

kind: ClusterIssuer

metadata:

  name: letsencrypt-prod

spec:

  acme:

    # The ACME server URL

    server: https://acme-v02.api.letsencrypt.org/directory

    # Email address used for ACME registration

    email: 664269713@qq.com

    # Name of a secret used to store the ACME account private key from step 3

    privateKeySecretRef:

      name: letsencrypt-prod

    # Enable the HTTP-01 challenge provider

    solvers:

      - http01:

          ingress:

            class: traefik

  # 运行

[root@master cert-manager]# kubectl create -f production-issuer.yaml

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 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)

[root@master cert-manager]# kubectl get clusterissuer.cert-manager.io

NAME                  READY   AGE

letsencrypt-prod      True    3m46s

三、使用出现的问题以及解决方式

k8s集群是1.22.4的,使用这个会造成证书签发不成功

kubectl get certificate  查看READY对应的是False,好久都不会成功

解决方式:

在ingress.yaml加入以下配置

cert-manager.io/issue-temporary-certificate: "true"
acme.cert-manager.io/http01-edit-in-place: "true"

如:

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: third-platform-management
  annotations:
    acme.cert-manager.io/http01-edit-in-place: 'true'
    cert-manager.io/cluster-issuer: letsencrypt-prod
    cert-manager.io/issue-temporary-certificate: 'true'
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/redirect-entry-point: https
    traefik.ingress.kubernetes.io/router.middlewares: zmj-prod-scheme@kubernetescrd
    traefik.ingress.kubernetes.io/router.tls: 'true'
    traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
spec:
  tls:
    - hosts:
        - platfrom.zmarthome.cn
      secretName: third-platform-management-tls
  rules:
    - host: platfrom.zmarthome.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: third-platform-management
                port:
                  number: 80
status:
  loadBalancer: {}

 类似资料: