我在私有子网中的 eks 集群中安装了 istio。安装 istio 后,将启动 nlb 并使用内部类型。为此,我无法从开放互联网获取流量到集群。 我还创建了一个 ALB,将流量从开放互联网转发到 istio 使用 target group 创建的 nlb。在端口 80 的目标组中进行运行状况检查失败。 如果我设置 15021 和健康检查 api /healthz/ready,我将仅收到健康检查 api 的流量。
如何从开放互联网获取流量到我的集群?
不确定这是否是一个完整的答案,但这就是我不久前在演示项目中所做的,它可能会给您一些关于您自己的解决方案的想法。首先创建与 Route 53 中的域名关联的网关资源:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-ingress-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTP
hosts:
- "*.mydomain.com"
然后我创建了一个负载均衡器补丁,该补丁映射到通配符域及其子域的托管证书。通配符证书由AWS证书管理器颁发:
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:eu-west-2:090109105180:certificate/dc694f17-9ca0-4c83-be8c-f23382b59137
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: tcp
应用资源,实际上创建了一个 API 网关,但尚未暴露任何内容:
INGRESS_PATCH=$(cat ./loadbalancer-patch.yaml)
kubectl -n istio-system patch service istio-ingressgateway --patch "$INGRESS_PATCH"
kubectl -n istio-system apply -f gateway.yaml
CLUSTER_ADDRESS=$(kubectl -n istio-system get svc istio-ingressgateway -o jsonpath="{.status.loadBalancer.ingress[0].hostname}")
echo "The cluster's external address is $CLUSTER_ADDRESS"
然后暴露一个像这样的组件:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myapiroute
spec:
hosts:
- api.mydomain.com
gateways:
- istio-system/istio-ingress-gateway
http:
- route:
- destination:
host: myapi
port:
number: 3000
然后在路由 53 中添加一条 A 记录,将 CLUSTER_ADDRESS 映射到 API 子域,并等待几分钟,让子域变得可用。