Давайте зашифруем сертификаты для сервисов kubernetes - PullRequest
0 голосов
/ 08 октября 2019

Добрый день, я новичок в kubernetes и пытаюсь настроить свою первую среду. Я хочу следующую схему:

  • У моей организации есть публичный IP (xxxx)
  • Этот IP направляется на сервер в частной локальной сети (то есть 192.168.0.10) с win server + IIS. В IIS у меня есть модуль перезаписи URL, и он действует как обратный прокси
  • У меня есть кластер kubernetes
  • У меня есть служба, развернутая на k8s
  • Я хочу получить доступ к этой службе изИнтернет с SSL, полученный из Давайте шифруем

Я уже настроил кластер k8s, развернул вход traefik (v1.7) и настроил их для шифрования давайте (перенаправление настройки http->https, вызов acme). Это работает нормально - я могу наблюдать это из локальной или глобальной сети, и нет никаких предупреждений о сертификате - я вижу зеленый замок. Теперь я развертываю службу (в моем случае это graylog). Опять же - я могу наблюдать это из LAN и WAN, но в этом случае я вижу предупреждение о сертификате (он был выдан TRAEFIK_DEFAULT_CERT). После того, как я увидел это, я пытаюсь найти дополнительную информацию и обнаружил, что мне нужен сертификат-менеджер. Я развертываю cert-manager, создаю зашифрованный издатель (с ролью ClusterIssuer), но затем пытаюсь выдать сертификат, я получаю следующую ошибку (находится в описании вызова):

Waiting for http-01 challenge propagation: wrong status code '404', expected '200'

Моя карта конфигурации traefik:

apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik-conf
  namespace: kube-system
data:
  traefik.toml: |
    # traefik.toml
    defaultEntryPoints = ["http","https"]
    [entryPoints]
      [entryPoints.http]
      address = ":80"
      [entryPoints.http.redirect]
        regex = "^http://(.*)"
        replacement = "https://$1"
      [entryPoints.https]
      address = ":443"
        [entryPoints.https.tls]
    [acme]
      email = "mymail@example.xyz"
      storage = "/acme/acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
    [[acme.domains]]
      main = "my-public-domain.com"

Я также пытаюсь использовать там подстановочный знак:

apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik-conf
  namespace: kube-system
data:
  traefik.toml: |
    # traefik.toml
    defaultEntryPoints = ["http","https"]
    [entryPoints]
      [entryPoints.http]
      address = ":80"
      [entryPoints.http.redirect]
        regex = "^http://(.*)"
        replacement = "https://$1"
      [entryPoints.https]
      address = ":443"
        [entryPoints.https.tls]
    [acme]
      email = "mymail@example.xyz"
      storage = "/acme/acme.json"
      entryPoint = "https"
      onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"
    [[acme.domains]]
      main = "*.my-public-domain.com"
      sans = ["my-public-domain.com"]

Мой эмитент кластера:

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dev
spec:
  acme:
    email: mymail@example.xyz
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Secret resource used to store the account's private key.
      name: example-issuer-account-key
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
    - http01:
        ingress:
          class: traefik

И мой тестовый сертификат:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: example-com
  namespace: default
spec:
  secretName: example-com-tls
  renewBefore: 360h # 15d
  commonName: logger.my-public-domain.com
  dnsNames:
  - logger.my-public-domain.com
  issuerRef:
    name: letsencrypt-dev
    kind: ClusterIssuer

У меня есть записи DNS для подстановочного домена, и я могу пропинговать его

Мои сертификаты застряли в состоянии OrderCreated:

Status:
  Conditions:
    Last Transition Time:  2019-10-08T09:40:30Z
    Message:               Certificate issuance in progress. Temporary certificate issued.
    Reason:                TemporaryCertificate
    Status:                False
    Type:                  Ready
Events:
  Type    Reason        Age   From          Message
  ----    ------        ----  ----          -------
  Normal  OrderCreated  47m   cert-manager  Created Order resource "example-com-3213698372"

Заказ застрял в состоянии Created:

Status:
  Challenges:
    Authz URL:  <url>
    Dns Name:   logger.my-public-domain.com
    Issuer Ref:
      Kind:  ClusterIssuer
      Name:  letsencrypt-dev
    Key:     <key>
    Solver:
      http01:
        Ingress:
          Class:  traefik
    Token:        <token>
    Type:         http-01
    URL:          <url>
    Wildcard:     false
  Finalize URL:   <url>
  State:          pending
  URL:            <url>
Events:
  Type    Reason   Age   From          Message
  ----    ------   ----  ----          -------
  Normal  Created  48m   cert-manager  Created Challenge resource "example-com-3213698372-0" for domain "logger.my-public-domain.com"

И, наконец, по вызову:

Spec:
  Authz URL:  <url>
  Dns Name:   logger.my-public-domain.com
  Issuer Ref:
    Kind:  ClusterIssuer
    Name:  letsencrypt-dev
  Key:     <key>
  Solver:
    http01:
      Ingress:
        Class:  traefik
  Token:        <token>
  Type:         http-01
  URL:          <url>
  Wildcard:     false
Status:
  Presented:   true
  Processing:  true
  Reason:      Waiting for http-01 challenge propagation: wrong status code '404', expected '200'
  State:       pending
Events:
  Type    Reason     Age   From          Message
  ----    ------     ----  ----          -------
  Normal  Started    55m   cert-manager  Challenge scheduled for processing
  Normal  Presented  55m   cert-manager  Presented challenge using http-01 challenge mechanism

Я вижу, что есть 404 ответа, но я не могу понять причину этого. На моем IIS у меня есть следующие правила перезаписи: Давайте зашифруем обход - все URL, совпадающие с .well-known/*, переписываются на хост kubernetes. http to https - все URL не совпадают с помощью шифрования, перенаправленного на перенаправление субдоменов https - все запросы субдоменов переписаны в kubernetes.

В моей локальной сети у меня есть собственный DNS-сервер, там все домены из my-public-domain.com имеют сопоставлениена внутренние адреса, поэтому я могу перенаправить общедоступное имя хоста logger.my-public-domain.com (x.x.x.x) на внутреннее logger.my-public-domain.com (192.168.0.y).

Когда вызов активен, я вижу новый бэкэнд и внешний интерфейс в панели мониторинга traefik.

Может быть, я неправильно понимаю, как этодолжно сработать, но я ожидал, что cert-manager выдаст сертификат с помощью команды «Зашифровать», и я смогу наблюдать за моим сервисом.

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