NodePort 是否适用于 Azure 容器服务 (Kubernetes)

Does NodePort work on Azure Container Service (Kubernetes)

我有以下 Kubernetes 仪表板服务

Name:               kubernetes-dashboard
Namespace:          kube-system
Labels:             k8s-app=kubernetes-dashboard
                    kubernetes.io/cluster-service=true
Annotations:        kubectl.kubernetes.io/last-applied-configuration={"kind":"Service","apiVersion":"v1","metadata":{"name":"kubernetes-dashboard","namespace":"kube-system","creationTimestamp":null,"labels":{"k8s-app":"k...
Selector:           k8s-app=kubernetes-dashboard
Type:               NodePort
IP:                 10.0.106.144
Port:               <unset> 80/TCP
NodePort:           <unset> 30177/TCP
Endpoints:          10.244.0.11:9090
Session Affinity:   None
Events:             <none>

根据documentation,我运行

az acs kubernetes browse

并且适用于 http://localhost:8001/ui

但我也想在集群外访问它。 describe 输出表明它是在端口 30177 上使用 NodePort 公开的。

但我无法在 http://<any node IP>:30177

上访问它

众所周知,将服务暴露到互联网,我们可以使用nodeportLoadBalancer

据我所知,Azure 现在 支持节点端口类型。

But I want to access it outside the cluster too.

我们可以使用 LoadBalancer 重新创建 kubernetes 仪表板,这是我的步骤:

  1. 删除 kubernetes-dashboard via kubernetes UI: select Namespace to kube-system,然后select services,然后删除:

  2. 修改 Kubernetes-dashboard-service.yaml: SSH master VM,然后 change type from nodeport to LoadBalancer:

    root@k8s-master-47CAB7F6-0:/etc/kubernetes/addons# vi kubernetes-dashboard-service.yaml

     apiVersion: v1
     kind: Service
     metadata:
       labels:
         kubernetes.io/cluster-service: "true"
         k8s-app: kubernetes-dashboard
       name: kubernetes-dashboard
       namespace: kube-system
     spec:
       ports:
       - port: 80
         targetPort: 9090
       selector:
         k8s-app: kubernetes-dashboard
       type: LoadBalancer
    
  3. 开始 kubernetes 从 CLI 2.0 浏览:

    C:\用户>az acs kubernetes browse -g k8s -n containerservice-k8s

然后通过 SSH 连接到主 VM 以检查状态

现在,我们可以通过Public IP地址浏览UI:

更新:
下图展示了Azure容器服务集群(Kubernetes)的架构,我们应该使用Load-Balancer将服务暴露到互联网。

转念一想,这实际上是行不通的。默认情况下,集群中唯一的 public IP 用于主服务器上的负载均衡器。并且该负载均衡器显然未配置为转发随机端口(例如 30000-32767)。此外,none 个节点直接具有 public IP,因此根据定义,NodePort 不会在集群外部工作。

完成此工作的唯一方法是直接为节点提供 public IP 地址。出于各种原因不鼓励这样做。

如果你只是想避免等待...那么我建议:

  1. 不要删除服务。大多数开发方案应该只是 kubectl apply -f <directory>,在这种情况下,您实际上不需要等待服务重新提供

  2. 将 Ingress 与 'nginx-ingress-controller' 一起使用,这样您只需要等待一次完整的 LB+NSG+PublicIP 配置,然后就可以 add/remove Ingress 对象在您的开发方案。

  3. 开发场景使用minikube,或者手动给节点添加publicips,让NodePort场景生效

您不能通过 运行 kubectl expose 命令通过 nodeport 公开服务,您会获得一个超出集群所在子网范围的 VIP 地址...相反,通过一个yaml 文件,您可以指定一个内部负载均衡器作为一种类型...,这将为您提供 Master 子网上的本地 IP,您可以通过内部网络连接到该 IP...

或者,您可以只使用外部负载均衡器公开服务并获得 public ip。可在 www.