Способы настройки SSL в Istio: Cert-Manager, самоподписанные сертификаты и стороннее завершение

Чтобы настроить SSL с помощью Istio, вы можете использовать разные методы в зависимости от ваших требований. Вот несколько подходов и примеры кода:

  1. Автоматический HTTPS с помощью Cert-Manager и Let’s Encrypt:
    Этот метод использует Cert-Manager, который является надстройкой Kubernetes, а также Let’s Encrypt для автоматической выдачи сертификатов SSL и управления ими.

    # Install Cert-Manager
    kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
    # Create a certificate issuer (Let's Encrypt)
    # cert-issuer.yaml
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
     name: letsencrypt-prod
    spec:
     acme:
       server: https://acme-v02.api.letsencrypt.org/directory
       email: your-email@example.com
       privateKeySecretRef:
         name: letsencrypt-prod
       solvers:
       - http01:
           ingress:
             class: istio
    # Create a TLS certificate
    # tls-certificate.yaml
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
     name: example-tls
    spec:
     secretName: example-tls-secret
     issuerRef:
       name: letsencrypt-prod
       kind: ClusterIssuer
     commonName: example.com
     dnsNames:
     - example.com
     - www.example.com
  2. HTTPS вручную с самозаверяющими сертификатами.
    Этот метод предполагает ручное создание самозаверяющих сертификатов и настройку Istio для их использования.

    # Generate a self-signed certificate
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \
     -keyout tls.key -out tls.crt -subj "/CN=example.com"
    # Create a Kubernetes secret
    kubectl create secret tls example-tls-secret --key tls.key --cert tls.crt
    # Configure Istio virtual service
    # virtual-service.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
     name: example-virtual-service
    spec:
     hosts:
     - example.com
     gateways:
     - istio-system/ingressgateway
     tls:
     - match:
         port: 443
         sniHosts:
         - example.com
       route:
       - destination:
           host: example-service
           port:
             number: 80
  3. Стороннее прекращение SSL.
    Вы также можете использовать сторонний балансировщик нагрузки или входящий контроллер, который завершает SSL, например Nginx или HAProxy, перед Istio. В этом случае прекращение SSL происходит за пределами Istio.

    Например, использование Nginx в качестве терминатора SSL:

    server {
       listen 443 ssl;
       server_name example.com;
    
       ssl_certificate /etc/nginx/certs/example.crt;
       ssl_certificate_key /etc/nginx/certs/example.key;
    
       location / {
           proxy_pass http://istio-ingressgateway.istio-system.svc.cluster.local;
           proxy_set_header Host $host;
       }
    }