0

我正在我的 kubernetes 集群中使用 cert-manager,以便让 let'sencrypt CA 签署的证书到我的集群内的服务应用程序。

1.创建cert-manager命名空间

⟩ kubectl create namespace cert-manager
namespace/cert-manager created

2. 我已经创建了 helm 实现 CA 和证书功能所需的 CRD。

⟩ kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml

customresourcedefinition.apiextensions.k8s.io/certificates.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/challenges.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/issuers.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/orders.certmanager.k8s.io created
[I] 
⟩ 

3. 在 cert-manager 命名空间上禁用资源验证

⟩ kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true 
namespace/cert-manager labeled
[I] 

4.添加Jetstack Helm存储库并更新本地缓存

⟩ helm repo add jetstack https://charts.jetstack.io 
"jetstack" has been added to your repositories
[I] 
~
⟩ 

⟩ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 
[I] 

5. 我已经使用 helm 在我的 k8s 集群中安装了 cert-manager:

     helm install \ 
    --name cert-manager \ 
    --namespace cert-manager \ 
    --version v0.7.0 \ 
    jetstack/cert-manager 

6. 我创建了一个 ACME 颁发者,包括http challenger provider通过对 ACME 服务器(例如 Let's Encrypt)执行质询验证来获得。

apiVersion: certmanager.k8s.io/v1alpha1
kind: Issuer 
metadata:
  name: letsencrypt-staging
spec:
 acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: b.garcia@possibilit.nl
    privateKeySecretRef:
      name: letsencrypt-staging 
    # Enable the HTTP-01 challenge provider
    http01: {}
  • 在我想要获取证书的服务应用程序所在的相同命名空间(默认)中应用。
⟩ kubectl apply -f 01-lets-encrypt-issuer-staging.yaml  
issuer.certmanager.k8s.io/letsencrypt-staging created 

⟩ kubectl get issuer --namespace default 

NAME                  AGE 

letsencrypt-staging   22s 

  • 这有以下描述:我们可以看到,the ACME account was registered with the ACME并且StatusTrueReady
⟩ kubectl describe issuer letsencrypt-staging --namespace default 

Name:         letsencrypt-staging 
Namespace:    default 
Labels:       <none> 
Annotations:  kubectl.kubernetes.io/last-applied-configuration: 

                {"apiVersion":"certmanager.k8s.io/v1alpha1","kind":"Issuer","metadata":{"annotations":{},"name":"letsencrypt-staging","namespace":"default... 

API Version:  certmanager.k8s.io/v1alpha1 
Kind:         Issuer 
Metadata: 
  Creation Timestamp:  2019-03-13T10:12:01Z 
  Generation:          1 
  Resource Version:    247916 
  Self Link:           /apis/certmanager.k8s.io/v1alpha1/namespaces/default/issuers/letsencrypt-staging 

  UID:                 7170a66e-4578-11e9-b6d4-2aeecf80bb69 

Spec: 
  Acme: 
    Email:  b.garcia@myemail.com 
    Http 01: 
    Private Key Secret Ref: 
      Name:  letsencrypt-staging 
    Server:  https://acme-staging-v02.api.letsencrypt.org/directory 
Status: 
  Acme: 
    Uri:  https://acme-staging-v02.api.letsencrypt.org/acme/acct/8550675 
  Conditions: 
    Last Transition Time:  2019-03-13T10:12:02Z 

    Message:               The ACME account was registered with the ACME server 

    Reason:                ACMEAccountRegistered 
    Status:                True 
    Type:                  Ready 

Events:                    <none> 

7. 我在创建颁发者的同一命名空间中创建了证书(默认)并引用它:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: zcrm365-lets-encrypt-staging
  #namespace: default 
spec:
  secretName: zcrm365-lets-encrypt-staging-tls 
  issuerRef:
    name: letsencrypt-staging
  commonName: test1kongletsencrypt.possibilit.nl

  # http01 challenge
  acme:
    config:
    - http01:
        ingressClass: nginx
        # ingress: nginx # kong-ingress-controller # nginx

      domains:
      - test1kongletsencrypt.possibilit.nl 

  • 申请证书
⟩ kubectl apply -f 02-certificate-staging.yaml  
certificate.certmanager.k8s.io/zcrm365-lets-encrypt-staging created 
  • 我执行了 kubectl describe certificate zcrm365-lets-encrypt-staging,我可以看到以下内容:
⟩ kubectl describe certificate zcrm365-lets-encrypt-staging 
Name:         zcrm365-lets-encrypt-staging
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"certmanager.k8s.io/v1alpha1","kind":"Certificate","metadata":{"annotations":{},"name":"zcrm365-lets-encrypt-staging","names...
API Version:  certmanager.k8s.io/v1alpha1
Kind:         Certificate
Metadata:
  Creation Timestamp:  2019-03-13T19:32:25Z
  Generation:          1
  Resource Version:    321283
  Self Link:           /apis/certmanager.k8s.io/v1alpha1/namespaces/default/certificates/zcrm365-lets-encrypt-staging
  UID:                 bad7f778-45c6-11e9-b6d4-2aeecf80bb69
Spec:
  Acme:
    Config:
      Domains:
        test1kongletsencrypt.possibilit.nl
      Http 01:
        Ingress Class:  nginx
  Common Name:          test1kongletsencrypt.possibilit.nl
  Issuer Ref:
    Name:       letsencrypt-staging
  Secret Name:  zcrm365-lets-encrypt-staging-tls
Status:
  Conditions:
    Last Transition Time:  2019-03-13T19:32:25Z
    Message:               Certificate issuance in progress. Temporary certificate issued.
    Reason:                TemporaryCertificate
    Status:                False
    Type:                  Ready
Events:                    <none>

我们可以看到StatusisFalse并且证书颁发是临时的。

  • 这个证书,创建一个名为的秘密zcrm365-lets-encrypt-staging-tls,其中包含我的私钥对tls.crttls.key
⟩ kubectl describe secrets zcrm365-lets-encrypt-staging-tls 

Name:         zcrm365-lets-encrypt-staging-tls 
Namespace:    default 
Labels:       certmanager.k8s.io/certificate-name=zcrm365-lets-encrypt-staging 

Annotations:  certmanager.k8s.io/alt-names: test1kongletsencrypt.possibilit.nl 
              certmanager.k8s.io/common-name: test1kongletsencrypt.possibilit.nl 
              certmanager.k8s.io/ip-sans:  
              certmanager.k8s.io/issuer-kind: Issuer 
              certmanager.k8s.io/issuer-name: letsencrypt-staging 
Type:  kubernetes.io/tls
Data 
==== 
ca.crt:   0 bytes 
tls.crt:  1029 bytes 
tls.key:  1679 bytes

8. 为我的服务应用程序创建入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kong-ingress-zcrm365
  namespace: default
  annotations:
    # kubernetes.io/ingress.class: "nginx" 
    certmanager.k8s.io/issuer: "letsencrypt-staging"
    certmanager.k8s.io/acme-challenge-type: http01
    # certmanager.k8s.io/acme-http01-ingress-class: "true" 

    # kubernetes.io/tls-acme: true
    # this annotation requires additional configuration of the 
    # ingress-shim (see above). Namely, a default issuer must 
    # be specified as arguments to the ingress-shim container.
spec:
  rules: 
  - host: test1kongletsencrypt.possibilit.nl
    http:
      paths:
      - backend:
          serviceName: zcrm365dev
          servicePort: 80
        path: / 
  tls: 
  - hosts: 
    - test1kongletsencrypt.possibilit.nl
    secretName: zcrm365-lets-encrypt-staging-tls 
  • 应用入口
⟩ kubectl apply -f 03-zcrm365-ingress.yaml  
ingress.extensions/kong-ingress-zcrm365 created 
  • 我可以看到我们的入口
⟩ kubectl get ingress -n default
NAME                        HOSTS                                ADDRESS         PORTS     AGE
cm-acme-http-solver-2m6gl   test1kongletsencrypt.possibilit.nl                   80        3h3m
kong-ingress-zcrm365        test1kongletsencrypt.possibilit.nl   52.166.60.158   80, 443   3h3m
[I] 

我的入口的详细信息如下:

⟩ kubectl describe ingress cm-acme-http-solver-2m6gl
Name:             cm-acme-http-solver-2m6gl
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host                                Path  Backends
  ----                                ----  --------
  test1kongletsencrypt.possibilit.nl  
                                      /.well-known/acme-challenge/br0Y8eEsuZ5C2fKoeNVL2y03wn1ZHOQwKQCOOkyWabE   cm-acme-http-solver-9cwhm:8089 (<none>)
Annotations:
  kubernetes.io/ingress.class:                         nginx
  nginx.ingress.kubernetes.io/whitelist-source-range:  0.0.0.0/0
Events:                                                <none>
[I] 
~/workspace/ZCRM365/Deployments/Kubernetes/cert-manager · (Deployments)

---

⟩ kubectl describe ingress kong-ingress-zcrm365
Name:             kong-ingress-zcrm365
Namespace:        default
Address:          52.166.60.158
Default backend:  default-http-backend:80 (<none>)
TLS:
  zcrm365-lets-encrypt-staging-tls terminates test1kongletsencrypt.possibilit.nl
Rules:
  Host                                Path  Backends
  ----                                ----  --------
  test1kongletsencrypt.possibilit.nl  
                                      /   zcrm365dev:80 (<none>)
Annotations:
  certmanager.k8s.io/acme-challenge-type:            http01
  certmanager.k8s.io/issuer:                         letsencrypt-staging
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"certmanager.k8s.io/acme-challenge-type":"http01","certmanager.k8s.io/issuer":"letsencrypt-staging"},"name":"kong-ingress-zcrm365","namespace":"default"},"spec":{"rules":[{"host":"test1kongletsencrypt.possibilit.nl","http":{"paths":[{"backend":{"serviceName":"zcrm365dev","servicePort":80},"path":"/"}]}}],"tls":[{"hosts":["test1kongletsencrypt.possibilit.nl"],"secretName":"zcrm365-lets-encrypt-staging-tls"}]}}

Events:  <none>

当我执行所有这些操作时,我可以看到我的应用程序服务通过 kong-ingress-zcrm365入口公开,因为我的 test1kongletsencrypt.possibilit.nl 域可以访问。

但正如你所看到的,我没有获得https我的服务证书。这https是一个不安全的连接

  • 我检查了我的 cert-manager pod 的日志,我有以下内容:
kubectl logs pod/cert-manager-6f68b58796-hlszm -n cert-manager

I0313 19:40:39.254765       1 controller.go:206] challenges controller: syncing item 'default/zcrm365-lets-encrypt-staging-298918015-0'
    I0313 19:40:39.254869       1 logger.go:103] Calling Discover
    I0313 19:40:39.257720       1 pod.go:89] Found pod "default/cm-acme-http-solver-s6s2n" with acme-order-url annotation set to that of Certificate "default/zcrm365-lets-encrypt-staging-298918015-0"but it is not owned by the Certificate resource, so skipping it.
    I0313 19:40:39.257735       1 pod.go:64] No existing HTTP01 challenge solver pod found for Certificate "default/zcrm365-lets-encrypt-staging-298918015-0". One will be created.
    I0313 19:40:39.286823       1 service.go:51] No existing HTTP01 challenge solver service found for Certificate "default/zcrm365-lets-encrypt-staging-298918015-0". One will be created.
    I0313 19:40:39.347204       1 ingress.go:49] Looking up Ingresses for selector certmanager.k8s.io/acme-http-domain=4095675862,certmanager.k8s.io/acme-http-token=919604798
    I0313 19:40:39.347437       1 ingress.go:98] No existing HTTP01 challenge solver ingress found for Challenge "default/zcrm365-lets-encrypt-staging-298918015-0". One will be created.
    I0313 19:40:39.362118       1 controller.go:178] ingress-shim controller: syncing item 'default/cm-acme-http-solver-2m6gl'
    I0313 19:40:39.362257       1 sync.go:64] Not syncing ingress default/cm-acme-http-solver-2m6gl as it does not contain necessary annotations
    I0313 19:40:39.362958       1 controller.go:184] ingress-shim controller: Finished processing work item "default/cm-acme-http-solver-2m6gl"
    I0313 19:40:39.362702       1 pod.go:89] Found pod "default/cm-acme-http-solver-s6s2n" with acme-order-url annotation set to that of Certificate "default/zcrm365-lets-encrypt-staging-298918015-0"but it is not owned by the Certificate resource, so skipping it.
    I0313 19:40:39.363270       1 ingress.go:49] Looking up Ingresses for selector certmanager.k8s.io/acme-http-domain=4095675862,certmanager.k8s.io/acme-http-token=919604798
    I0313 19:40:46.279269       1 controller.go:206] challenges controller: syncing item 'default/zcrm365-lets-encrypt-staging-tls-1561329142-0'
    E0313 19:40:46.279324       1 controller.go:230] ch 'default/zcrm365-lets-encrypt-staging-tls-1561329142-0' in work queue no longer exists
    I0313 19:40:46.279332       1 controller.go:212] challenges controller: Finished processing work item "default/zcrm365-lets-encrypt-staging-tls-1561329142-0"
    [I] 

我认为没有执行 http 质询过程,因为 let'sencrypt 不相信我是https://test1kongletsencrypt.possibilit.nl/index.html域的所有者。

我该如何解决这个问题才能使用letsencrypt获得TLS?我是否可能需要ingress-shim在我的 helm cert-manager 和/或中使用功能WebhookValidation


重要更新

我目前正在对我的部署使用kong-ingress-controller 之类的入口。

我在这个 gist 中安装了这种方式

但是我不确定在创建证书签名请求kong-ingress-controller时如何将我的集成到 cert-manager中。zcrm365-lets-encrypt-staging

这是我目前对我的kong资源的看法

⟩ kubectl get all -n kong 
NAME                                           READY   STATUS      RESTARTS   AGE
pod/kong-7f66b99bb5-ldp4v                      1/1     Running     0          2d16h
pod/kong-ingress-controller-667b4748d4-sptxm   1/2     Running     782        2d16h
pod/kong-migrations-h6qt2                      0/1     Completed   0          2d16h
pod/konga-85b66cffff-6k6lt                     1/1     Running     0          41h

NAME                              TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE
service/kong-ingress-controller   NodePort       10.0.48.131   <none>          8001:32257/TCP               2d16h
service/kong-proxy                LoadBalancer   10.0.153.8    52.166.60.158   80:31577/TCP,443:32323/TCP   2d16h

NAME                                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kong                      1         1         1            1           2d16h
deployment.apps/kong-ingress-controller   1         1         1            0           2d16h
deployment.apps/konga                     1         1         1            1           41h

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/kong-7f66b99bb5                      1         1         1       2d16h
replicaset.apps/kong-ingress-controller-667b4748d4   1         1         0       2d16h
replicaset.apps/konga-85b66cffff                     1         1         1       41h

NAME                        COMPLETIONS   DURATION   AGE
job.batch/kong-migrations   1/1           86s        2d16h

该服务service/kong-proxy为我提供外部或公共 IP,当我创建时kong-ingress-zcrm365,此入口将采用 kong-proxy 提供的外部 IP 地址。但当然在入口中,我表示使用 nginx 而不是 kong-ingress-controller。

顺便说一句,我没有安装 nginx 入口控制器,我在这里有点困惑。

如果有人能指出我正确的地址,他们的帮助将不胜感激。

4

1 回答 1

2
于 2019-03-14T03:39:16.640 回答