我试图在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。

我希望你的疑虑能消失。

其他回答

看起来你正在使用一个定制的Kubernetes集群(使用minikube, kubeadm或类似的)。在这种情况下,没有集成LoadBalancer(不像AWS或谷歌Cloud)。在这个默认设置下,您只能使用NodePort或Ingress Controller。

使用入口控制器,你可以设置一个域名映射到你的pod;如果你使用入口控制器,你不需要给你的服务LoadBalancer类型。

下面是@Javier的回答。我已经决定为我的负载均衡器“修补外部IP”。

 $ kubectl patch service my-loadbalancer-service-name \
-n lb-service-namespace \
-p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.39.25"]}}'

这将用一个新的补丁IP地址替换那个“pending”,你可以为你的集群使用。

了解更多。请参阅karthik关于Minikube支持LoadBalancer的帖子

这么做可不干净。我需要一个临时的解决方案。希望这能帮助到一些人。

如果有人正在使用MicroK8s:您需要一个网络负载均衡器。

MicroK8s自带metallb,你可以这样启用它:

microk8s enable metallb

<pending>应该变成一个实际的IP地址。

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

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

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

为在amazon-eks上运行时遇到此错误的用户添加解决方案。

首先运行:

kubectl describe svc <service-name>

然后查看下面示例输出中的events字段:

Name:                     some-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"some-service","namespace":"default"},"spec":{"ports":[{"port":80,...
Selector:                 app=some
Type:                     LoadBalancer
IP:                       10.100.91.19
Port:                     <unset>  80/TCP
TargetPort:               5000/TCP
NodePort:                 <unset>  31022/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                  Age        From                Message
  ----     ------                  ----       ----                -------
  Normal   EnsuringLoadBalancer    68s  service-controller  Ensuring load balancer
  Warning  SyncLoadBalancerFailed  67s  service-controller  Error syncing load balancer: failed to ensure load balancer: could not find any suitable subnets for creating the ELB

查看错误消息:

Failed to ensure load balancer: could not find any suitable subnets for creating the ELB

在我的例子中,没有为创建ELB提供合适的子网的原因是:

原因1:EKS集群部署在错误的子网组中——内部子网,而不是公网子网。 (*)默认情况下,如果没有service.beta.kubernetes, LoadBalancer类型的服务将创建面向公共的负载均衡器。Io /aws-load-balancer-internal:“true”注释)。

2:子网没有按照这里提到的要求进行标记。

为VPC添加标签:

Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared

用以下标记公共子网:

Key: kubernetes.io/role/elb
Value: 1