Мы установили 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)
Вот чего мы хотим достичь:
Чтобы включить присоединение сертификатов 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 создается, как и ожидалось:
Мы переходим по этой ссылке для реализации вышеуказанного сценария:
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
Ресурсы создаются в соответствии с ожиданиями:
Мы можем получить ответ из контейнера nginx из контейнера:
curl --insecure --verbose https://localhost
Мы также можем получить ответ от модуля nginx через его сервис от другого модуля:
curl --insecure --verbose https://my-nginx
Тем не менее, когда мы пытаемся получить доступ к модулю nginx через входной шлюз Istio, служба недоступна:
curl --insecure --verbose https://a1a99cb2d34f711e9865b0295f80a9c0-303710594.us-east-1.elb.amazonaws.com
После включения журнала доступадля 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).Но ни один из них не был доступен:
Нужно ли нам создавать какие-либо дополнительные VirtualService или ServiceEntry?Когда мы попытались получить доступ к Развертыванию, доступному через порт 80, через входной канал Istio, мы смогли успешно поразить модуль.Проблема возникает только тогда, когда мы пытаемся включить HTTPS на службе шлюза Istio.Это происходит потому, что мы включили mTLS?Пожалуйста, помогите нам найти какие-либо указатели относительно того, как действовать.