Traefik автоматически подает заявку на получение сертификатов в Kubernetes (K8S)
Traefik автоматически подает заявку на получение сертификатов в Kubernetes (K8S)

Traefik автоматически подает заявку на получение сертификатов в Kubernetes (K8S)

Ван Сяньсэн2023-08-292023-08-29

Traefik автоматически подает заявку на получение сертификатов

TraefikВнедрить автоматическое применениеHTTPS-сертификатхотетьиспользоватьLet’s EncryptАвтоматически генерировать сертификаты,Обязательно использовать ACME. Требуется статическая конфигурация, определенная в «парсере сертификатов».,TraefikОтветственный заACMEСлужить Получить сертификат с сервера。

Затем каждый «маршрутизатор» настраивается на включение TLS и связывается с преобразователем сертификатов с помощью параметра конфигурации tls.certresolver.

Методы проверки ACME Traefik в основном включают следующие три:

  • tlsChallenge
  • httpChallenge
  • dnsChallenge

Если вы используете tlsChallenge, порт 443 от Let’s Encrypt к Traefik должен быть доступен. Если вы используете httpChallenge, порт 80 от Let’s Encrypt к Traefik должен быть доступен. При использовании dnsChallenge требуются соответствующие поставщики.

Развертывание диспетчера сертификатов

С помощью Kubernetes,Мы получаем мощный и масштабируемыйизплатформа для решения многих сложныхизсцена。cert-managerда Мощныйизрешение,Нам может помочь автоматизация управления с TLS Связанные с сертификатомизпочти все。этопоставлять Понятно Один набор для разныхсценаиз Пользовательское определение ресурса(CRD),И с роднымIngressилиGatewayРесурсы хорошо интегрированы。

cert-manager хранит и кэширует сертификаты и закрытые ключи в секретах Kubernetes, обеспечивая их высокую доступность для дальнейшего использования входными контроллерами (такими как Traefik Proxy) или приложениями.

Уведомление:По умолчанию,cert-manager Секрет не очищается автоматически, что позволяет повторно присоединить его к уже выданному сертификату и избежать выдачи нового сертификата. Это становится очень удобно, когда вам нужно создавать и удалять большое количество ресурсов и вы не хотите ограничивать скорость.

cert-manager Может взаимодействовать с различными источниками для выдачи сертификатов, в том числе Let's EncryptHashiCorpVault и частный ПКИ. Для АВС Частный центр сертификации, Google Cloud Служба центра сертификации или Cloudflare Origin CA Внешние эмитенты позволяют расширять функциональные возможности диспетчера сертификатов, если они не поддерживаются.

Предварительные условия

Чтобы следовать этому руководству, вам необходимо следующее:

  • Kubernetes кластер >= v1.20
  • Let’s Encrypt публичный хостинг DNS домен — Для целей этой статьи я буду использовать Тенсент Облако
  • Traefik 2.10,Вы можете установить развертывание, прочитав эту статью. Обновление развертывания Kubernetes Traefik2.6

Вы можете установить cert-manager 1.12, используя следующую команду:

Язык кода:javascript
копировать
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.3/cert-manager.yaml

Предоставляет услуги веб-порта. В этом уроке я буду использовать whoami в качестве примера.

Язык кода:javascript
копировать
cat > whoami.yml <<EOF 
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: containous/whoami
          ports:
            - name: web
              containerPort: 80
EOF

Прокси Traefik с менеджером сертификатов и Let’s Encrypt

Давайте разберемся, как объединить Kubernetes Входной контроллер (например. Traefik Proxy и диспетчер сертификатов) для защиты Web Безопасность приложений. Давайте Encrypt поставлять РазличныйТип соревнованияПриходитьпроверятьдоменное имяизконтроль。в соответствии стыизхотетьпросить,Вы можете выбратьHTTP-01тыиз Служить Когда он появится в публичном доступе?илиDNS-01частная конечная точка。

использовать Let Encrypt Обратите внимание на ограничения по тарифам. для Во избежание неприятных сюрпризов рекомендуется использовать Let’s Encryptпромежуточная среда

Язык кода:javascript
копировать
#тест(staging): https://acme-staging-v02.api.letsencrypt.org/directory
#Производство(производство): https://acme-v02.api.letsencrypt.org/directory

Автоматизированный HTTPS

Let’s Encrypt использовать ACME протокол для проверки того, действительно ли доменное имя принадлежит вам. После успешной проверки может быть автоматически выдан бесплатный сертификат. Сертификат действителен только для. 90 дней, его необходимо еще раз подтвердить до истечения срока действия, чтобы добиться продления, и cert-manager Его можно автоматически продлить, поэтому вам не придется беспокоиться об истечении срока действия сертификата. В настоящее время существуют в основном HTTP и DNS Два метода проверки.

Контрольная сумма HTTP-01

HTTP-01 Проверка осуществляется путем указания вашего доменного имени. HTTP Сервис добавляет временный местоположение: во время проверки Let’s Encrypt отправлю http просил http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>,в YOUR DOMAIN Это доменное имя, которое проверяется, TOKEN. да ert-manager Путь, созданный путем изменения Ingress Правила для добавления этого временного пути проверки и указания на предоставленный ТОКЕН. услуги. Давайте Encrypt Сравню TOKEN Если да соответствует ожиданиям, сертификат будет выдан после успешной проверки, но этот метод не поддерживает пан-доменное имя Сертификат。

использовать HTTP проверить таким способом сначала нужно добавить доменное анализ имени Конфигурация хорошая, то есть нужно обеспечить ACME Сервер может получить доступ к вашему серверу в обычном режиме HTTP-сервис. Здесь мы используем вышеизложенное Для примера приложения whoami у нас есть whoami.boysec.cn Доменное имя разрешено правильно.

Публичный IP-адрес должен быть привязан сюда.

Способ первый

потому что Let’s Encrypt В производственной среде действуют строгие ограничения на вызовы интерфейсов, поэтому обычно нам необходимо сначала staging После прохождения теста среды переключитесь в производственную среду. Сначала мы создаем тестовую среду по умолчанию и производственную среду. HTTP-1 Центр сертификации для метода проверки:

среда тестирования среда сборки

Язык кода:javascript
копировать
cat <<EOF >staging-http.yml 
apiVersion: cert-manager.io/v1
kind: Issuer  # Выберите весь кластер (ClusterIssuer) или одно пространство имен.
metadata:
 name: staging-http01
spec:
 acme:
   email: wangxiansen@boysec.cn  # используется для ACME Зарегистрированный адрес электронной почты
   # ACME Служитьконецадрес
   server: https://acme-staging-v02.api.letsencrypt.org/directory
   privateKeySecretRef: 
     # используется для Хранения ACME номер счета private key из secret
     name: boysec-staging-http01
   solvers:
     - http01:  # ACME HTTP-01 тип
         ingress:
           class: traefik # Укажите входное имя
EOF
Язык кода:javascript
копировать
cat <<EOF >production-http.yml 
apiVersion: cert-manager.io/v1
kind: Issuer  # Выберите весь кластер (ClusterIssuer) или одно пространство имен.
metadata:
 name: production-http01
spec:
 acme:
   email: wangxiansen@boysec.cn  # используется для ACME Зарегистрированный адрес электронной почты
   # ACME Служитьконецадрес
   server: https://acme-v02.api.letsencrypt.org/directory
   privateKeySecretRef: 
     # используется для Хранения ACME номер счета private key из secret
     name: boysec-http01
   solvers:
     - http01:  # ACME HTTP-01 тип
         ingress:
           class: traefik # Укажите входное имя
EOF

После создания вы можете увидеть два объекта эмитентов:

Язык кода:javascript
копировать
kubectl get issuers

Понятно Issuer/ClusterIssuer Центр сертификации, затем мы можем сгенерировать бесплатный сертификат, cert-manager предоставил нам Certificate Это используется длягенерировать Сертификатиз Пользовательский объект ресурса,Однако этот объект требуетхотетьсуществоватьконкретныйизв пространстве имениспользовать,Сертификатв конце концов будетсуществоватьэтотв пространстве именк Secret из Хранилище объектов ресурсов。Вот мы здесьдахотетьобъединить traefik вместе использовать, на самом деле нам просто нужно изменить Ingress объект, добавить cert-manager Просто обратите внимание на соответствующие комментарии и не нужно создавать их вручную. Certificate Объект, измените вышеуказанное приложение whoami Ingress Объект ресурса, как показано ниже:

Язык кода:javascript
копировать
cat << EOF >ing.yml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami
  annotations:
    cert-manager.io/issuer: "staging-http01"
spec:
  tls:
    - hosts:
        - whoami.boysec.cn
      secretName: whoami-tls
  rules:
    - host: whoami.boysec.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  name: web
EOF

проверять

Язык кода:javascript
копировать
$ kubectl get issuer -o wide
NAME                READY   STATUS                                                 AGE
production-http01   True    The ACME account was registered with the ACME server   18m
staging-http01      True    The ACME account was registered with the ACME server   19m
$ kubectl get certificateRequest -o wide
NAME                            APPROVED   DENIED   READY   ISSUER            STATUS
tls-whoami-ingress-http-fdw2x   True                True    le-example-http   Certificate fetched from issuer successfully

$ kubectl get certificates
NAME                      READY   SECRET                    ISSUER            STATUS
tls-whoami-ingress-http   True    tls-whoami-ingress-http   le-example-http   Certificate is up to date and has not expired

Способ 2 (рекомендуется)

путем измененияtraefik ConfigMapдокумент

Язык кода:javascript
копировать
entryPoints:
      web:
        address: ":80"          ## Конфигурация 80 порт и установите имя записи для web
      websecure:
        address: ":443"         # Конфигурация443порт и установите имя записи для websecure
    certificatesResolvers:
      wangxiansen-test: # Вы можете изменить его на свое любимое имя
        acme:
          caServer: https://acme-staging-v02.api.letsencrypt.org/directory # ACME Служитьконецадрес
          email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
          storage: acme-staging-web.json           # место хранения
          httpChallenge:
            entryPoint: web
      wangxiansen: # Вы можете изменить его на свое любимое имя
        acme:
          email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
          storage: acme-web.json           # место хранения
          httpChallenge:
            entryPoint: web

создать входной маршрут

Язык кода:javascript
копировать
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoamiauto-tls-http
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`whoami.boysec.cn`)
    kind: Rule
    services:
      - name: whoami
        port: 80
  tls:
    certResolver: wangxiansen-test

Откройте браузер и вы найдете приложениетестиз Сертификат Понятно,а затем изменитьcertResolverдля wangxiansen

проверка DNS-01

DNS-01 проверь, чтобы пройти DNS провайдера API возьми свое DNS разрешения на управление, существовать Let’s Encrypt для cert-manager поставлять TOKEN После этого сертификат-менеджер будет создан из этого TOKEN получение ключа вашей учетной записи из TXT Запишите и поставьте запись в существование _acme-вызов. Затем Let’s Encrypt воля DNS Система запрашивает запись, и если совпадение найдено, сертификат может быть выдан. Этот подход поддерживает пан-доменное. имя Сертификатиз。

Способ первый

среда тестирования среда сборки

Язык кода:javascript
копировать
cat <<EOF >staging-dns.yml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
 name: boysec-staging-dns
 namespace: whoami
spec:
 acme:
   email: user@example.com
   # We use the staging server here for testing to avoid hitting
   server: https://acme-staging-v02.api.letsencrypt.org/directory
   privateKeySecretRef:
     # if not existing, it will register a new account and stores it
     name: boysec-staging-key
   solvers:
     - dns01:
         cloudflare:
           apiTokenSecretRef:
             name: cloudflare-api-token-secret
             key: api-token

EOF
Язык кода:javascript
копировать
cat <<EOF >production-dns.yml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
 name: boysec-dns
 namespace: whoami
spec:
 acme:
   email: user@example.com
   # We use the staging server here for testing to avoid hitting
   server: https://acme-v02.api.letsencrypt.org/directory
   privateKeySecretRef:
     # if not existing, it will register a new account and stores it
     name: boysec-key
   solvers:
     - dns01:
         cloudflare:
           apiTokenSecretRef:
             name: cloudflare-api-token-secret
             key: api-token

EOF

Способ 2 (рекомендуется)

путем измененияtraefik ConfigMapдокумент

Язык кода:javascript
копировать
entryPoints:
      web:
        address: ":80"          ## Конфигурация 80 порт и установите имя записи для web
      websecure:
        address: ":443"         # Конфигурация443порт и установите имя записи для websecure
      certificatesResolvers:
        tencent-test: # Вы можете изменить его на свое любимое имя
          acme:
            email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
            storage: acme-staging-dns.json 
            caServer: https://acme-staging-v02.api.letsencrypt.org/directory
            dnsChallenge:
              provider: tencentcloud # Тенсент Облакоиз кодирования
              delayBeforeCheck: 0
              resolvers:         
                - "119.29.29.29:53" # Тенсент Облакоиз DNS адрес
        tencent: # Вы можете изменить его на свое любимое имя
          acme:
            email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
            storage: acme-dns.json
            dnsChallenge:
              provider: tencentcloud # Тенсент Облакоиз кодирования
              delayBeforeCheck: 0
              resolvers:         
                - "119.29.29.29:53" # Тенсент Облакоиз DNS адрес

Затем создайте ключ

Язык кода:javascript
копировать
kubectl create secret generic tencent-token --from-literal=TENCENTCLOUD_SECRET_ID=AKIDoSadfsafdsfasdfsdfLBj23 --from-literal=TENCENTCLOUD_SECRET_KEY=lFTP4afafasdfsfdfsgasfgfMK1Ra7NM -n kube-system

$ kubectl edit -n kube-system pods traefik-v2-6996759d46-d9czt 
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 1
      containers:
        - name: traefik-v2
          image: traefik:v2.10
          args:
            - --configfile=/config/traefik.yaml
          envFrom:          # Добавьте переменные среды
            - secretRef:
                name: tencent-token

создать входной маршрут

Язык кода:javascript
копировать
cat << EOF > auto-tls-dns.yml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami-auto-tls-dns
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(\`who.boysec.cn\`)
      kind: Rule
      services:
        - name: whoami
          port: 80
  tls:
    certResolver: tencent-test
    domains:
    - main: boysec.cn        
      sans:
      - '*.boysec.cn'        # Соответствует всем сайтам boysec.cn из Вторичного доменного имени. имя
EOF

Откройте его и вы увидите, что сертификат испытаний выдан.,可кзаменятьгенерироватьсреда Сертификат ВоляcertResolverзаменятьдля Производствосреда Сертификат

Вы узнаете, когда приедете снова Сертификатда Доверенныйиз Понятно

потому чтописать статьитест Слишком много одеялаОграничения на дублирование заявок на доменное имя,Итак, сначала сделайте снимок экрана диаграммы тестовой среды.,Сгенерированная карта среды будет добавлена ​​позже.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.