Сконфигурируйте SSL-сертификаты в kubernetes с помощью ist-ing cert-manager и LetsEncrypt - PullRequest
2 голосов
/ 05 марта 2019

Я пытаюсь настроить SSL-сертификаты в kubernetes с помощью cert-manager, istio ingress и LetsEncrypt. Я установил istio с помощью helm, cert-manager, создал ClusterIssuer, а затем пытаюсь создать сертификат. Проблема acme не может быть проверена, я пытаюсь сделать это с http01 и не могу понять, как использовать istio ingress для этого. Istio развернут со следующими параметрами:

helm install --name istio install/kubernetes/helm/istio `
--namespace istio-system `
--set global.controlPlaneSecurityEnabled=true `
--set grafana.enabled=true`
--set tracing.enabled=true 
--set kiali.enabled=true `
--set ingress.enabled=true

Конфигурация сертификата:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: example.com
  namespace: istio-system
spec:
  secretName: example.com
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer
  commonName: 'example.com'
  dnsNames:
  - example.com
  acme:
    config:
    - http01:
        ingress: istio-ingress
      domains:
      - example.com

При такой попытке по какой-то причине istio-ingress не может быть найден, но при попытке указать ingressClass: some-name вместо ingress: istio-ingress, я получаю 404, потому что example.com/.well -known / acme-challenge / token не может быть достигнут. Как это можно решить? Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Istio ingress устарел, вы можете использовать Ingress Gateway с вызовом DNS.

Определите общий публичный входной шлюз:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: public-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
      tls:
        httpsRedirect: true
    - port:
        number: 443
        name: https
        protocol: HTTPS
      hosts:
        - "*"
      tls:
        mode: SIMPLE
        privateKey: /etc/istio/ingressgateway-certs/tls.key
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

Создание эмитента с использованием одного из поставщиков DNS, поддерживаемых cert-manager. Вот конфиг для GCP CloudDNS:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Issuer
metadata:
  name: letsencrypt-prod
  namespace: istio-system
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: email@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    dns01:
      providers:
      - name: cloud-dns
        clouddns:
          serviceAccountSecretRef:
            name: cert-manager-credentials
            key: gcp-dns-admin.json
          project: my-gcp-project

Создайте сертификат подстановки с помощью:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: istio-gateway
  namespace: istio-system
spec:
  secretname: istio-ingressgateway-certs
  issuerRef:
    name: letsencrypt-prod
  commonName: "*.example.com"
  acme:
    config:
    - dns01:
        provider: cloud-dns
      domains:
      - "*.example.com"
      - "example.com"

Сертификат-менеджеру требуется несколько минут для выдачи сертификата:

kubectl -n istio-system describe certificate istio-gateway

Events:
  Type    Reason         Age    From          Message
  ----    ------         ----   ----          -------
  Normal  CertIssued     1m52s  cert-manager  Certificate issued successfully

Пошаговое руководство по настройке входа Istio в GKE с помощью Let's Encrypt можно найти здесь https://docs.flagger.app/install/flagger-install-on-google-cloud#cloud-dns-setup

1 голос
/ 13 марта 2019

Решением было перевести DNS в Azure и использовать проверку DNS для генерации сертификата.Я также использовал istio-1.1.0-rc.3 и настроил шлюз следующим образом:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: mygateway
spec:
  selector:
    istio: ingressgateway # use istio default ingress gateway
  servers:
  - hosts:
    - 'mydomain.com'
    port:
      name: http-bookinfo
      number: 80
      protocol: HTTP
    tls:
      httpsRedirect: true
  - hosts:
    - 'mydomain.com'
    port:
      name: https-bookinfo
      number: 443
      protocol: HTTPS
    tls:      
      mode: SIMPLE
      serverCertificate: "use sds" #random string, because serverCertificate and 
      #privateKey are required for tls.mode=SIMPLE
      privateKey: "use sds" 
      credentialName: "istio-bookinfo-certs-staging" #this must match the secret name 
      #from the certificate
Для работы включите SDS на входном шлюзе:

helm template install/kubernetes/helm/istio/ --name istio `
--namespace istio-system -x charts/gateways/templates/deployment.yaml `
--set gateways.istio-egressgateway.enabled=false `
--set gateways.istio-ingressgateway.sds.enabled=true > `
$HOME/istio-ingressgateway.yaml

 kubectl apply -f $HOME/istio-ingressgateway.yaml
...