如何为示例Istio应用程序公开外部IP地址

时间:2019-04-30 19:33:01

标签: kubernetes istio

我正在尝试在一个小型集群上为Istio和Kubernetes设置bookinfo示例应用程序。 集群由两台机器组成,分别是主服务器和工作服务器,它们在两个Amazon AWS EC2实例的Ubuntu 18.04上运行。 每个实例都有一个分配的外部IP地址。

我无法做的是弄清楚如何将bookinfo服务公开给外界。

对于是否需要分别公开Istio入口网关或每个bookinfo服务,我感到困惑。

在列出入口网关时,外部IP字段仅显示待定。 另外,在描述工作程序节点时,在输出中没有提及外部IP地址。

我已经浏览过Google,但实际上找不到合适的解决方案。 描述入口网关仅提供内部(即10.x.x.x)地址。

get和describe命令的输出:

kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-ingressgateway   LoadBalancer   10.96.39.4   <pending>     15020:31451/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31075/TCP,15030:32093/TCP,15031:31560/TCP,15032:30526/TCP,15443:31526/TCP   68m

kubectl describe  svc istio-ingressgateway  -n istio-system
Name:                     istio-ingressgateway
Namespace:                istio-system
Labels:                   app=istio-ingressgateway
                          chart=gateways
                          heritage=Tiller
                          istio=ingressgateway
                          release=istio
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"istio-ingressgateway","chart":"gateways","heritage":"Til...
Selector:                 app=istio-ingressgateway,istio=ingressgateway,release=istio
Type:                     LoadBalancer
IP:                       10.96.39.4
Port:                     status-port  15020/TCP
TargetPort:               15020/TCP
NodePort:                 status-port  31451/TCP
Endpoints:                10.244.1.6:15020
Port:                     http2  80/TCP
TargetPort:               80/TCP
NodePort:                 http2  31380/TCP
Endpoints:                10.244.1.6:80
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  31390/TCP
Endpoints:                10.244.1.6:443
Port:                     tcp  31400/TCP
TargetPort:               31400/TCP
NodePort:                 tcp  31400/TCP
Endpoints:                10.244.1.6:31400
Port:                     https-kiali  15029/TCP
TargetPort:               15029/TCP
NodePort:                 https-kiali  31075/TCP
Endpoints:                10.244.1.6:15029
Port:                     https-prometheus  15030/TCP
TargetPort:               15030/TCP
NodePort:                 https-prometheus  32093/TCP
Endpoints:                10.244.1.6:15030
Port:                     https-grafana  15031/TCP
TargetPort:               15031/TCP
NodePort:                 https-grafana  31560/TCP
Endpoints:                10.244.1.6:15031
Port:                     https-tracing  15032/TCP
TargetPort:               15032/TCP
NodePort:                 https-tracing  30526/TCP
Endpoints:                10.244.1.6:15032
Port:                     tls  15443/TCP
TargetPort:               15443/TCP
NodePort:                 tls  31526/TCP
Endpoints:                10.244.1.6:15443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

引用Istio的official文档:

  

如果您的群集在不支持以下操作的环境中运行   外部负载平衡器(例如minikube),EXTERNAL-IP为   istio-ingressgateway会说-pending-。要访问网关,请使用   服务的NodePort,或改为使用端口转发。

您的集群似乎属于setting up Kubernetes的“自定义(云)”方式,默认情况下不支持Load Balancer。

为您提供的解决方案:

  • 您必须允许进入到充当工作角色的AWS EC2实例的入站流量
    (换句话说,您必须在防火墙上打开istio-ingressgateway服务的NodePort,请参阅下面的方法获取此端口号)
  • 获取istio-ingressgateway的NodePort:

使用命令:

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
  • 获取您的工作程序节点的EXTERNAL_IP

使用命令:

export INGRESS_HOST=$(kubectl get nodes --selector='!node-role.kubernetes.io/master' -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}')

并遵循bookinfo示例的其余部分,而无需进行任何更改。