我试图在kubernetes上部署nginx, kubernetes版本是v1.5.2, 我已经部署了nginx的3个副本,YAML文件如下,

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

现在我想在节点的30062端口上公开它的80端口,为此我在下面创建了一个服务,

kind: Service
apiVersion: v1
metadata:
  name: nginx-ils-service
spec:
  ports:
    - name: http
      port: 80
      nodePort: 30062
  selector:
    app: nginx
  type: LoadBalancer

这项服务工作得很好,但它不仅在kubernetes仪表板上也在终端上显示为待定。


当前回答

在Kubernetes中,将运行在一组Pods上的应用程序公开为网络服务的一般方法称为service。Kubernetes中有四种类型的服务。

ClusterIP 服务只能从集群内访问。

NodePort 您可以使用NodeIP:NodePort.default节点端口范围是30000-32767从集群外部与服务通信,在创建集群时可以通过define——Service -node-port-range来更改这个范围。

loadbalance 使用云提供商的负载平衡器在外部公开服务。

ExternalName 通过返回带有值的CNAME记录,将服务映射到externalName字段的内容(例如,foo.bar.example.com)。没有设置任何类型的代理。

只有LoadBalancer为External-IP列提供值。只有当Kubernetes集群能够为特定的服务分配IP地址时,它才能工作。您可以使用metalLB负载均衡器为您的负载均衡器服务提供ip。

我希望你的疑虑能消失。

其他回答

如果你不在一个受支持的云上(aws, azure, gcloud等),你不能在没有MetalLB的情况下使用LoadBalancer https://metallb.universe.tf/ 但它还在测试阶段。

我在AWS EKS上也有同样的问题

问题是这样解决的:

Amazon虚拟私有云(Amazon VPC)的正确标记 子网 所需的AWS IAM (Identity and Access Management)权限 一个有效的Kubernetes服务定义Load 有足够的空闲IP地址 在子网上

需要确保以下标签 关键:kubernetes.io /集群/ yourEKSClusterName 价值:分享

关键:kubernetes.io /角色/ elb 值:1

关键:kubernetes.io /角色/ internal-elb 值:1

供参考,也确保sts是为您正在工作的区域启用sts设置可以在用户,区域设置下找到。

minikube隧道

下面的解决方案适用于我的情况。

首先,试试这个命令:

minikube tunnel

如果这对你不起作用。遵循以下几点:

我重启minikube容器。

docker minikube stop 

then

docker minikube start

之后重新运行kubernetes

minikube dashboard

完成后执行:

 minikube tunnel

LoadBalancer ServiceType只有在底层基础设施支持自动创建负载均衡器并在Kubernetes中有各自的支持时才会工作,就像谷歌云平台和AWS一样。如果没有配置这样的特性,LoadBalancer IP地址字段不会填充,仍然处于待定状态,服务将以与NodePort类型的服务相同的方式工作

有三种类型的服务公开 Nodeport ClusterIP loadbalance

当我们使用负载均衡器时,我们基本上要求我们的云提供商给我们一个可以在线访问的dns 注意不是域名,而是dns。

所以负载均衡器类型不工作在我们的本地minikube环境。