Kubernetes Certbot автономно не работает - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь сгенерировать сертификат SSL с помощью докер-контейнера certbot/certbot в kubernetes.Я использую Job контроллер для этой цели, который выглядит как наиболее подходящий вариант.Когда я запускаю автономную опцию, я получаю следующую ошибку:

Ошибка авторизации.staging.ishankhare.com (http-01): urn: ietf: params: acme: error: connection :: Серверу не удалось подключиться к клиенту для проверки домена :: Fetching http://staging.ishankhare.com/.well-known/acme-challenge/tpumqbcDWudT7EBsgC7IvtSzZvMAuooQ3PmSPh9yng8: Тайм-аут во время подключения (вероятнопроблема брандмауэра)

Я убедился, что это не из-за неправильно настроенных записей DNS, запустив простой контейнер nginx, и он разрешается правильно.Вот мой Jobs файл:

apiVersion: batch/v1
kind: Job
metadata:
  #labels:
  #  app: certbot-generator
  name: certbot
spec:
  template:
    metadata:
      labels:
        app: certbot-generate
    spec:
      volumes:
        - name: certs
      containers:
        - name: certbot
          image: certbot/certbot
          command: ["certbot"]
          #command: ["yes"]
          args: ["certonly", "--noninteractive", "--agree-tos", "--staging", "--standalone", "-d", "staging.ishankhare.com", "-m", "me@ishankhare.com"]

          volumeMounts:
            - name: certs
              mountPath: "/etc/letsencrypt/"
              #- name: certs
              #mountPath: "/opt/"
          ports:
            - containerPort: 80
            - containerPort: 443
      restartPolicy: "OnFailure"

и мой сервис:

apiVersion: v1
kind: Service
metadata:
  name: certbot-lb
  labels:
    app: certbot-lb
spec:
  type: LoadBalancer
  loadBalancerIP: 35.189.170.149
  ports:
    - port: 80
      name: "http"
      protocol: TCP
    - port: 443
      name: "tls"
      protocol: TCP
  selector:
    app: certbot-generator

полное сообщение об ошибке выглядит примерно так:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for staging.ishankhare.com
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. staging.ishankhare.com (http-01): urn:ietf:params:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://staging.ishankhare.com/.well-known/acme-challenge/tpumqbcDWudT7EBsgC7IvtSzZvMAuooQ3PmSPh9yng8: Timeout during connect (likely firewall problem)
IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: staging.ishankhare.com
   Type:   connection
   Detail: Fetching
   http://staging.ishankhare.com/.well-known/acme-challenge/tpumqbcDWudT7EBsgC7IvtSzZvMAuooQ3PmSPh9yng8:
   Timeout during connect (likely firewall problem)

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

I 'Мы также пытались запустить это как простой Pod, но безрезультатно.Хотя я все еще чувствую, что запуск его как Job до конца - это путь.

1 Ответ

0 голосов
/ 20 ноября 2018

Во-первых, знайте, что ваше Job определение является действительным, но значение spec.template.metadata.labels.app: certbot-generate не не совпадает с вашим Service определением spec.selector.app: certbot-generator: один certbot-generate, второй certbot-generator.Таким образом, модуль, выполняемый контроллером задания, никогда не добавляется в качестве конечной точки к службе.

Настройте одну или другую, но они должны совпадать, и это может просто сработать:)

ХотяЯ не уверен, что использование Service с селектором, предназначенным для короткоживущих модулей с контроллера Job, не будет работать, ни с простым Pod, как вы тестировали.Модуль certbot-randomId, созданный заданием (или любым другим простым модулем, который вы создаете), занимает в общей сложности около 15 секунд для запуска / сбоя, а проверка HTTP запускается через несколько секунд после запуска: для меня не ясно, чтобыло бы достаточно времени, чтобы kubernetes уже работал между службой и модулем.

Мы можем с уверенностью предположить, что Service действительно работает, потому что вы упомянули, что тестировали разрешение DNS, поэтому вы можете легко убедитьсяэто не проблема синхронизации, добавив sleep 10 (или больше!), чтобы дать больше времени для добавления модуля в качестве конечной точки к службе и соответствующим образом проксировать до вызова HTTP, запускаемого certbot,Просто измените вашу команду Job и аргументы для:

command: ["/bin/sh"]
args: ["-c", "sleep 10 && certbot certonly --noninteractive --agree-tos --staging --standalone -d staging.ishankhare.com -m me@ishankhare.com"]

И здесь, это также может сработать:)


При этом, я горячо рекомендую вамиспользовать cert-manager , который вы можете легко установить с помощью стабильной диаграммы Хелма : вводимый им пользовательский ресурс Certificate сохранит ваш сертификат в Secret, что упрощает повторное использование с любого ресурса K8s, а также автоматически выполняет обновление, так что вы можете просто забыть обо всем этом.

...