cert-manager Найден модуль с аннотацией acme-order-url, установленной для сертификата, но он не принадлежит ресурсу Certificate - PullRequest
0 голосов
/ 14 марта 2019

Я работаю с cert-manager в моем кластере kubernetes, чтобы получить сертификаты, подписанные let'sencrypt CA, для моего приложения службы внутри моего кластера.

1. Создайте cert-manager пространство имен

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

2. Я создал CRD, которые должны использовать Helm для реализации функций CA и сертификатов.

⟩ 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. Отключить проверку ресурса в пространстве имен диспетчера сертификатов

⟩ 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. Я установил cert-manager в своем кластере k8s, используя helm:

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

6. Я создал эмитента ACME, включающего http challenger provider, который был получен путем выполнения проверки на сервере ACME, такого как Let 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 и Status равны True и Ready
⟩ 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>

Мы видим, что Status равен False и выдача сертификата временная.

  • В этом сертификате создайте секрет с именем zcrm365-lets-encrypt-staging-tls, в котором есть моя личная пара ключей tls.crt и tls.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 ingress, потому что достигается с моим доменом test1kongletsencrypt.possibilit.nl.

Но, как вы видите, я не получаю https сертификат на свою службу. https является небезопасным соединением

  • Я проверил логи моего модуля cert-manager и у меня есть следующее:
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.

Как я могу решить эту проблему, чтобы получить TLS с letsencrypt? Возможно ли, что мне нужно использовать функциональность ingress-shim в моем helm cert-manager и / или WebhookValidation?


ВАЖНОЕ ОБНОВЛЕНИЕ

В настоящее время я использую kong-ingress-controller как вход в мое развертывание.

Я установил этот способ в этой сущности .

Но я не уверен, как мне интегрировать мой kong-ingress-controller для работы с cert-manager при создании запроса на подпись сертификата zcrm365-lets-encrypt-staging.

Это мой текущий взгляд на мои ресурсы в Конге

⟩ 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, этот вход получает этот внешний IP-адрес, предоставленный kong-proxy. Но, конечно, во входе я указываю, что использую nginx, а не kong-ingress-controller.

И, кстати, я не установил входной контроллер nginx, я немного запутался здесь.

Если кто-то может указать мне правильный адрес, его помощь будет высоко оценена.

1 Ответ

2 голосов
/ 14 марта 2019
First check if using nginx ingress then nginx ingress controller is tunning

Вы правы, но добавили ли входной контроллер для входа? если вы используете вход nginx, вам нужно добавить контроллер в кластер K8s.

Ваш подход и подход - идеальный сертификат-менеджер и все. здесь, делясь ссылкой на один урок, посмотрите, что это из цифрового океана:

эта ссылка такая же, как и вы, просто сравните шаги

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes

если есть проблема, оставьте комментарий для более

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...