2017-04-15 24 views
0

我有以下服务Kubernetes仪表盘是否NodePort上

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> 

Azure的集装箱服务(Kubernetes)工作,按照documentation,我跑

az acs kubernetes browse 

,它工作在http://localhost:8001/ui

但我想在群集外访问它。该输出描述说,它在端口30177.

使用NodePort暴露但我不能够访问它http://<any node IP>:30177

+0

FWIW一个公共IP暴露你的仪表板将是一个安全问题。你有没有尝试先用nodeport运行一个nginx容器?同时检查您的NSG设置,查看是否有任何防火墙端口在您使用nodeport提供服务时打开。 –

+0

任何人都有关于这个问题的线索。请帮助https://stackoverflow.com/q/47597267/7296379 – jk1510

回答

4

我们知道,公开服务到互联网,我们可以使用nodeportLoadBalancer

据我所知,Azure现在支持nodeport类型而不是

但我想在集群外部访问它。

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

  1. 通过kubernetes UI删除 kubernetes的仪表板:选择命名空间KUBE-系统,然后选择服务,然后将其删除: enter image description here enter image description here
  2. 修改kubernets-仪表板service.yaml:SSH主VM,然后变化从nodeport到负载平衡器类型:

    根@ K8S-主47CAB7F6-0:在/ etc/kubernetes /插件#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掌握虚拟机检查的状态enter image description here

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

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

enter image description here

+0

如果您需要进一步的帮助,请让我知道。 –

+0

谢谢,为答案:) 有没有关于它为什么不支持NodePort的任何文档?或者任何解决方法? – Jaydeep

+0

NodePort在工作节点上公开服务。工作者节点被防火墙限制,并且没有公共IP。你为什么要这样做,而不是使用'type = LoadBalancer'。通常,NodePort适用于缺乏易于编程的负载平衡器的内部部署场景。 – colemickens

2

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

你打算使这项工作的唯一方法是通过直接向节点的公共IP地址。由于各种原因,这不被鼓励。

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

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

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

  3. 的开发方案,或手动使用minikube公网IP添加到节点,使NodePort方案的工作。

+0

我以为我发布这个评论上面的答案,但显然不是。我在StackOverflow并不好。 – colemickens

+0

这是一些有用的信息。谢谢 :) – Jaydeep

0

无法通过运行kubectl暴露命令暴露通过nodeport的服务,你会得到你的集群坐......取而代之的是子网范围之外的VIP地址,通过部署YAML文件服务你可以指定一个内部负载平衡器的类型......,这将给你的主子网,您可以通过内部网络连接到本地IP ...

或者,你可以暴露使用外部负载均衡器进行服务并获得公共IP。可在www上找到。

相关问题