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

时间:2017-04-15 08:27:48

标签: azure kubernetes azure-container-service

我为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

上访问它

2 个答案:

答案 0 :(得分:6)

如我们所知,将服务公开给互联网,我们可以使用nodeportLoadBalancer

据我所知,Azure现在支持nodeport类型。

  

但我也希望在集群外部访问它。

我们可以使用LoadBalancer重新创建kubernetes仪表板,以下是我的表格:

  1. 删除 kubernetes-dashboard通过kubernetes用户界面:选择命名空间 kube-system ,然后选择服务,然后删除它: enter image description here enter image description here
  2. 修改kubernets-dashboard-service.yaml:SSH主虚拟机,然后更改类型从nodeport到 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:\用户&GT; az acs kubernetes browse -g k8s -n containerservice-k8s

  4. 然后通过SSH将主虚拟机检查状态enter image description here

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

    enter image description here更新
    下图显示了azure容器服务集群(Kubernetes)的体系结构,我们应该使用Load Balancer将服务公开给Internet。

    enter image description here

答案 1 :(得分:2)

第二个想法,这实际上预计不起作用。默认情况下,群集中唯一的公共IP用于主服务器上的负载平衡器。并且该负载均衡器显然未配置为转发随机端口(例如30000-32767)。此外,没有一个节点直接拥有公共IP,因此根据定义,NodePort不会在集群外部工作。

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

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

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

  2. 将Ingress与'nginx-ingress-controller'一起使用,这样您只需要等待完整的LB + NSG + PublicIP配置一次,然后就可以在您的开发场景中添加/删除Ingress对象。 / p>

  3. 将minikube用于开发方案,或手动将公共ips添加到节点以使NodePort方案正常工作。