Невозможно получить доступ к модулю через HTTPS через шлюз Istio (работает как ELB) на AWS EKS с включенным mTLS в кластере - PullRequest
0 голосов
/ 22 февраля 2019

Мы установили Istio 1.0.5 на недавно запущенный кластер EKS через Helm.

helm install \
    --wait \
    --name istio \
    --namespace istio-system \
    --set tracing.enabled=true \
    --set kiali.enabled=true \
    --set grafana.enabled=true \
    --set global.mtls.enabled=true \
    --set servicegraph.enabled=true \
    --set global.proxy.includeIPRanges="10.10.0.0/16\,172.20.0.0/16" \
    install/kubernetes/helm/istio 

(the IP ranges are pod and service CIDR ranges of the cluster)

Вот чего мы хотим достичь: istio ingress gateway

Чтобы включить присоединение сертификатов ACM к ELB, запущенному шлюзом istio-ingressgateway, в службу istio-ingressgateway были добавлены следующие аннотации:

service.beta.kubernetes.io/aws-load-balancer-backend-protocol: https
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:ACCOUNT:certificate/MY_CERT
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https

Служба балансировочного шлюза Ingress Gateway создается, как и ожидалось:

enter image description here enter image description here

Мы переходим по этой ссылке для реализации вышеуказанного сценария:

https://doc.istio.cn/en/docs/examples/advanced-gateways/ingress-sni-passthrough/

Сертификаты и секреты создаются в соответствии с вышеуказанной документацией Istio.Ресурсы Service и Deployment создаются следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 443
    protocol: TCP
  selector:
    run: my-nginx

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 443
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx
          readOnly: true
        - name: nginx-server-certs
          mountPath: /etc/nginx-server-certs
          readOnly: true
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-configmap
      - name: nginx-server-certs
        secret:
          secretName: nginx-server-certs

Ресурсы Gateway и VirtualService создаются следующим образом:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: mygateway
spec:
  selector:
    istio: ingressgateway # use istio default ingress gateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: PASSTHROUGH
    hosts:
    - nginx.example.com

---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx
spec:
  hosts:
  - nginx.example.com
  gateways:
  - mygateway
  tls:
  - match:
    - port: 443
      sni_hosts:
      - nginx.example.com
    route:
    - destination:
        host: my-nginx
        port:
          number: 443

Ресурсы создаются в соответствии с ожиданиями:

enter image description here

Мы можем получить ответ из контейнера nginx из контейнера:

curl --insecure --verbose https://localhost

enter image description here

Мы также можем получить ответ от модуля nginx через его сервис от другого модуля:

curl --insecure --verbose https://my-nginx

enter image description here

Тем не менее, когда мы пытаемся получить доступ к модулю nginx через входной шлюз Istio, служба недоступна:

curl --insecure --verbose https://a1a99cb2d34f711e9865b0295f80a9c0-303710594.us-east-1.elb.amazonaws.com

enter image description here

После включения журнала доступадля ELB это соответствующая строка журнала:

2019-02-22T12:36:08.960931Z a1a99cb2d34f711e9865b0295f80a9c0 3.84.67.219:56786 - -1 -1 -1 503 0 0 0 "GET https://a1a99cb2d34f711e9865b0295f80a9c0-303710594.us-east-1.elb.amazonaws.com:443/ HTTP/1.1" "curl/7.55.1" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2

Мы попали внутрь модуля istio-ingressgateway и попытались получить доступ к модулю nginx через его имя службы (my-nginx), service ip (172.20.198.12), службы DNS (my-nginx.default.svc.cluster.local) и pod ip (10.10.157.58).Но ни один из них не был доступен:

enter image description here

Нужно ли нам создавать какие-либо дополнительные VirtualService или ServiceEntry?Когда мы попытались получить доступ к Развертыванию, доступному через порт 80, через входной канал Istio, мы смогли успешно поразить модуль.Проблема возникает только тогда, когда мы пытаемся включить HTTPS на службе шлюза Istio.Это происходит потому, что мы включили mTLS?Пожалуйста, помогите нам найти какие-либо указатели относительно того, как действовать.

...