使用helm将istio-ingressgateway安装到Azure中的TKG私有集群失败-无法获取现有内部负载均衡器的IP

bjp0bcyl  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个TKG 2.1.1(kubernetes版本1.24.10)集群部署在Azure的私有网络中,该集群已经配置了内部负载平衡器(由tanzu安装程序)。当尝试部署istio-ingressgateway时,服务会停留在挂起状态。
安装命令:

helm install -f values.yaml istio-ingressgateway istio/gateway -n istio-ingress --wait

values.yaml:

service:
  type: LoadBalancer
  ports:
  - name: status-port
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  annotations: 
    service.beta.kubernetes.io/azure-load-balancer-internal: 'true'

还尝试运行对值文件进行更改的升级。修订版2:

service:
  type: LoadBalancer
  ports:
  - name: status-port
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  annotations: 
    service.beta.kubernetes.io/azure-load-balancer-internal: 'true'
    service.beta.kubernetes.io/azure-load-balancer-ipv4: <existing lb ip>

版本3:

service:
  type: LoadBalancer
  ports:
  - name: status-port
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  annotations: 
    service.beta.kubernetes.io/azure-load-balancer-internal: 'true'
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: app-pln-snet

不管使用的值是什么,状态返回:

helm status istio-ingressgateway -n istio-ingress
NAME: istio-ingressgateway
LAST DEPLOYED: Thu Jun  1 05:23:31 2023
NAMESPACE: istio-ingress
STATUS: failed
REVISION: 3
TEST SUITE: None
NOTES:
"istio-ingressgateway" successfully installed!

该服务看起来像:

kubectl describe service istio-ingressgateway -n istio-ingress
Name:                     istio-ingressgateway
Namespace:                istio-ingress
Labels:                   app=istio-ingressgateway
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=istio-ingressgateway
                          app.kubernetes.io/version=1.17.2
                          helm.sh/chart=gateway-1.17.2
                          istio=ingressgateway
Annotations:              meta.helm.sh/release-name: istio-ingressgateway
                          meta.helm.sh/release-namespace: istio-ingress
                          service.beta.kubernetes.io/azure-load-balancer-internal: true
                          service.beta.kubernetes.io/azure-load-balancer-internal-subnet: app-pln-snet
Selector:                 app=istio-ingressgateway,istio=ingressgateway
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       100.69.48.176
IPs:                      100.69.48.176
Port:                     status-port  15021/TCP
TargetPort:               15021/TCP
NodePort:                 status-port  32090/TCP
Endpoints:                100.96.1.230:15021
Port:                     http2  80/TCP
TargetPort:               80/TCP
NodePort:                 http2  31815/TCP
Endpoints:                100.96.1.230:80
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  30364/TCP
Endpoints:                100.96.1.230:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
kubectl get service istio-ingressgateway -n istio-ingress -o wide
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE   SELECTOR
istio-ingressgateway   LoadBalancer   100.69.48.176   <pending>     15021:32090/TCP,80:31815/TCP,443:30364/TCP   42m   app=istio-ingressgateway,istio=ingressgateway

期望的是istio-ingressgateway将连接到现有的Azure内部lb并获得IP。

exdqitrt

exdqitrt1#

因此,为了让它工作,我对TKG 2.1.1和Istio 1.17.2的初始部署进行了一些更改。为了解决我遇到的问题,我不得不销毁TKG工作负载集群并重建它。
需要更改用于部署工作负载集群的集群定义yaml。所做的更改是注解掉用于创建出站LB的值。

...
# AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB: true
# AZURE_ENABLE_NODE_OUTBOUND_LB: true
# AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT: 1
# AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT: 1
# AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES: 4
...

这些值告诉Tanzu为计算平面创建内部LB和出站LB。最后,当通过Helm安装Istio 1.17.2时,入口网关创建无法协调已经生成的控制平面的内部负载均衡器。在这种情况下,必须允许Istio在集群中为计算平面创建内部LB,因此您不能让TKG这样做。
问题的下一个方面是Azure NSG命名不匹配。因为我们部署到Azure上的私有集群配置中,所以网络、子网和nsg已经存在。当以这种方式构建它时,Tanzu期望计算平面snet的nsg名称为cluster-name-node-nsg,并且它必须驻留在具有vnet/snts的资源组中。然而,当Istio尝试构建内部LB时,它正在寻找一个名为cluster-name-id-node-nsg的nsg,当它没有找到时,检查失败。
要在TKG生成群集后协调此操作,您可以搜索为Azure门户中的控制平面创建的内部LB。它将被命名为cluster-name-id-internal-lb。然后,您可以创建一个名为cluster-name-id-node-nsg的新nsg,其id与lb资源中的id相同。新nsg必须与vnet位于同一资源组中。并且,您必须将其分配给集群的计算平面snet。这将取代先前在专用网络中设置的nsg,以便安装TKG。您还需要确保它具有相同的规则和它要替换的nsg。
一旦新的nsg到位,Istio将创建一个新的LB cluster-name-internal,计算平面作为后端,服务将获得私有IP。你只需要在values.yaml中传递这些值,然后从问题中安装helm,就可以工作了:

service:
  type: LoadBalancer
  ports:
  - name: status-port
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  annotations: 
    service.beta.kubernetes.io/azure-load-balancer-internal: 'true'

相关问题