Какой самый простой способ добавить TLS в сервис Kubernetes? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть простой веб-сервер, открытый для всех в Kubernetes на GKE, и зарегистрированный домен.Я хочу добавить TLS к нему, чтобы он был доступен через HTTPS.Я много слышал об использовании Let's Encrypt и в итоге попытался это сделать: https://github.com/jetstack/cert-manager/blob/master/docs/tutorials/acme/quick-start/index.rst, но обнаружил, что это полностью перебор.Существует ли более простой подход к использованию Let's Encrypt, учитывая, что мое развертывание - это всего лишь одна служба и модуль?

Используемая конфигурация:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: gcr.io/my-repo
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
        readinessProbe:
          initialDelaySeconds: 10
          httpGet:
            path: /healthz
            port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: web-balancer-service
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: web
  type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress-app

spec:
  rules:
  - host: my.domain.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: web-balancer-service
          servicePort: 8080

===============================================

РЕДАКТИРОВАТЬ: Следуя предложению @Utku Özdemir, я пыталсякодифицировать эти изменения в YAML.Я создал IP-адрес с

gcloud compute addresses create example-ip-address --global

И сертификат и обеспечение с: https://gist.github.com/nickponline/ab74d3d179e21474551b7596c6478eea

Все правильно, но когда я проверяю ManagedCertificates с kubectl describe ManagedCertificates example-certificate, это говорит

Spec:
  Domains:
    app.domain.xyz
Status:
  Certificate Name:    xxxxxxxxxxxxxxxxxx
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  app.domain
    Status:  FailedNotVisible
Events:      <none>

Я ждал 24 часа, поэтому предположим, что это не изменится.

1 Ответ

2 голосов
/ 26 сентября 2019

Поскольку вы используете входной контроллер самого GKE, при создании ресурса Ingress он инициирует создание ресурса Balancer в облачной платформе Google.Обычно SSL-завершение является обязанностью входящего контроллера, поэтому за выполнение SSL-завершения отвечает балансировщик нагрузки GCP.

Это означает, что cert-manager не будет работать в вашем случае, так как сертификаты будут жить вневашего кластера, и трафик будет уже завершен SSL до того, как он попадет в ваш кластер.

К счастью, GCP имеет поддержку самообеспечиваемого SSL (Let's Encrypt).Чтобы воспользоваться этим, вам необходимо выполнить следующие шаги:

  1. Перейти на экран балансировки нагрузки на GCP, переключиться в расширенный вид и перейти на вкладку Сертификаты (или просто нажать здесь ).

  2. Создайте новый сертификат SSL, выбрав «Создать сертификат, управляемый Google».В поле домена укажите точный домен, для которого требуется сертификат SSL.Это должно выглядеть так:

enter image description here

Перейдите на экран Внешние IP-адреса и зарезервируйте новый статический IP-адрес.Выберите тип, который будет глобальным (на момент написания входной контроллер GCP поддерживает только глобальные IP-адреса).Должно выглядеть так:

enter image description here

Возьмите статический IP-адрес, который вы зарезервировали (в данном примере это 34.95.84.106)

enter image description here

Перейдите к регистратору вашего домена,и добавьте запись типа A для вашего домена (запись в SSL-сертификате), чтобы указать статический IP-адрес, который вы выделили.В этом примере это будет my-app.example.com -> 34.95.84.106.

Наконец, вам нужно отредактировать вход, чтобы поместить 2 аннотации, поэтому он будет подсказывать Ingress Controller Google Cloud использовать зарезервированный статический IP-адрес и созданный вами сертификат.См. Приведенный ниже пример входа:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress-app
  annotations:
    ingress.gcp.kubernetes.io/pre-shared-cert: my-ssl-certificate # the name of the SSL certificate resource you created
    kubernetes.io/ingress.global-static-ip-name: my-static-ip # the name of the static ip resource you created
    kubernetes.io/ingress.allow-http: "false" # if you want to block plain http
spec:
  rules:
    - host: my-app.example.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: web-balancer-service
              servicePort: 8080

Примените его и убедитесь, что изменения отражены, перейдя на экран «Балансировщики нагрузки» в GCP.

Важные примечания:

  • Если уже существует входной балансировщик нагрузки GCP, созданный входным сервером, изменения, внесенные вами (аннотациями), не будут отражены в существующем балансировщике нагрузки .Поэтому удалите существующий вход, убедитесь, что существующий балансировщик нагрузки исчезает, и создайте вход с правильными аннотациями, чтобы балансировщик нагрузки был настроен правильно.

  • Для обеспечения Let's Encryptдля работы, ваша запись DNS должна быть на месте.Он проверяет владельца домена с помощью DNS перед выдачей сертификата.Кроме того, первоначальная подготовка может занять некоторое время (до получаса).

...