kubernetes服务外部IP待处理


142

我正在尝试在kubernetes上部署nginx,kubernetes版本是v1.5.2,我已经部署了具有3个副本的nginx,下面是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仪表板上而且还在终端上显示为“未决”。 终端输出仪表板状态

因此,请帮助我解决此问题。谢谢 ...

Answers:


177

它看起来像您使用的是自定义的Kubernetes集群(使用minikubekubeadm等)。在这种情况下,没有集成LoadBalancer(与AWS或Google Cloud不同)。使用此默认设置,您只能使用NodePort或Ingress控制器。

使用Ingress Controller,您可以设置一个映射到您的pod的域名;LoadBalancer如果您使用Ingress控制器,则无需为服务指定类型。


非常感谢@javier,这真的很有帮助。我从上面的文档中解决了我的问题。
Pankaj Jackson'17

9
这不是真的回答问题吗?用户正在使用LoadBalancer的服务类型是有效的服务类型。NodePortingress正在做它的其他方式,但没有真正解决这个问题,对不对?
猛禽

2
这是有效的服务类型,但是在不兼容的平台中使用(至少默认情况下)。为了使用LoadBalancer,您必须具有一个可以为Pod提供外部IP的平台,而Google Cloud或AWS正是这样做的。
哈维尔·萨默隆18'Mar

2
我在AWS上使用kubeadm。我还能LoadBalancer吗?
jiashenC

3
如果您使用minikube,请运行“ minikube tunnel”。现在检查您的服务,您将获得公共IP。这是更多信息的文档minikube.sigs.k8s.io/docs/tasks/loadbalancer
Ravi

73

如果您使用的是Minikube,则有一个神奇的命令!

$ minikube tunnel

希望有人可以节省几分钟。

参考链接 https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel


我尝试了一下minikube tunnel,它实际上解决了pending问题,但是新的外部IP无法正常工作:我收到超时错误……
a.barbieri

@ a.barbieri确保您使用的是隧道IP而不是minikube IP。“使用IP 10.106.102.98修补ingress-nginx”
Peter Zhou

2
是的,谢谢彼得。会尝试。无论如何,切换到Docker Desktop我都可以通过直接在localhost上使用的即用型设置克服了这个问题。
a.barbieri,

3
出色的省时示范技巧!
jgitter

49

如果您未使用GCE或EKS(您曾经使用过kubeadm),则可以externalIPs向您的服务YAML 添加规范。您可以使用与节点的主接口关联的IP,例如eth0。然后,您可以使用节点的外部IP从外部访问服务。

...
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10

2
必须缺少一条信息:“外部IP不由Kubernetes管理,而是集群管理员的责任。” (kubernetes.io/docs/concepts/services-networking/service)。我必须安装某种“控制器”吗?
丹尼尔·奥尔德

我正在关注Kubernetes教程(kubernetes.io/docs/tutorials/stateless-application/guestbook),它与kubeadm配合得很好
Eduardo

谢谢您-出色,按预期工作。我已经将Service暴露给了节点eth网络IP,该节点现在可以在群集外部访问
Vlad Gulin


21

我使用kubeadm创建了一个单节点k8s集群。当我尝试PortForwardkubectl proxy时,它显示外部IP 处于挂起状态。

$ kubectl get svc -n argocd argocd-server
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-server   LoadBalancer   10.107.37.153   <pending>     80:30047/TCP,443:31307/TCP   110s

就我而言,我已经对服务进行了如下修补:

kubectl patch svc <svc-name> -n <namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["172.31.71.218"]}}'

此后,它开始通过公共IP服务

$ kubectl get svc argo-ui -n argo
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
argo-ui   LoadBalancer   10.103.219.8   172.31.71.218   80:30981/TCP   7m50s

11
也许您应该提到“ 172.31.71.218”的来源?
EuRBamarth

最后给出了如何打补丁的答案。感谢分享。
Srikant

5

如果在minikube上运行,如果不使用default,不要忘了提到命名空间。

minikube服务<< service_name >> --url --namespace = << namespace_name >>


4

如果您使用的是minikube,请从终端运行以下命令,

$ minikube ip
$ 172.17.0.2 // then 
$ curl http://172.17.0.2:31245
or simply
$ curl http://$(minikube ip):31245

2

相同的问题:

os> kubectl get svc right-sabertooth-wordpress

名称类型集群 IP外部IP端口
右剑齿WordPress LoadBalancer 10.97.130.7“待定” 80:30454 / TCP,443:30427 / TCP

os> minikube服务列表

| ------------- | ---------------------------- | ------ -------------------------- |

| 名称空间| NAME | 网址|

| ------------- | ---------------------------- | ------ -------------------------- |

| 默认值 kubernetes | 无节点端口

| 默认值 右剑齿马里亚德| 无节点端口

| 默认值 右剑齿的wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| kube系统| kube-dns | 无节点端口

| kube系统| 分er部署| 无节点端口

| ------------- | ---------------------------- | ------ -------------------------- |

但是,可以通过http://192.168.99.100:30454访问


2

跟随@哈维尔的回答。我决定为负载均衡器使用“修补外部IP”。

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

这将用可用于群集的新修补IP地址替换该“待处理”。

有关更多信息。请参阅karthik的有关Minikube for Kubernetes的LoadBalancer支持的文章

不是最干净的方法。我需要一个临时解决方案。希望这对某人有帮助。


1

使用NodePort:

kubectl运行用户登录--replicas = 2 --labels =“运行=用户登录” --image = kingslayerr / teamproject:version2 --port = 5000

kubectl公开部署用户登录--type = NodePort-名称=用户登录服务

kubectl描述服务用户登录服务(注意端口)

kubect cluster-info(IP->获取运行主机的IP)

您的服务可通过(IP):(端口)访问




1

仅当基础基础架构支持自动创建负载均衡器并在Kubernetes中具有相应的支持时,LoadBalancer ServiceType才能工作,例如Google Cloud Platform和AWS。如果未配置任何此类功能,则不会填充LoadBalancer IP地址字段,并且仍处于待处理状态,并且该服务将以与NodePort类型的服务相同的方式工作


1

您可以修补托管Pod的节点的IP(节点的私有IP),这是简单的解决方法。

参考以上职位,以下为我工作:

kubectl补丁程序服务my-loadbalancer-service-name \ -n lb-service-namespace \ -p'{“ spec”:{“ type”:“ LoadBalancer”,“ externalIPs”:[“ xxx.xxx.xxx.xxx Private物理服务器的IP-节点-完成部署的位置“]}}'


0

删除现有服务并创建相同的新服务解决了我的问题。我的问题是使用了我定义的负载平衡Ip,以便外部端点处于暂挂状态。当我更改新的负载平衡IP时,它仍然无法工作。最后,删除现有服务并创建一个新服务即可解决我的问题。


0

检查kube-controller日志。通过将clusterID标签设置为部署集群的ec2实例,我能够解决此问题。


0

如果这是您的私有k8s集群,那么MetalLB更适合。以下是步骤。

步骤1:在您的集群中安装MetalLB

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

步骤2:通过使用配置图进行配置

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.42.42.100-172.42.42.105 #Update this with your Nodes IP range 

步骤3:创建服务以获取外部IP(不过将是私有IP)。

财政年度:

在安装MetalLB之前: 在此处输入图片说明

安装MetalLB之后: 在此处输入图片说明

在此处输入图片说明


0

为在运行时遇到此错误的人添加解决方案

首先运行:

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群集部署在错误的子网组上-内部子网,而不是面向公众的子网。
(*)默认情况下,LoadBalancer如果未service.beta.kubernetes.io/aws-load-balancer-internal: "true"提供注释,则类型的服务会创建面向公众的负载均衡器。

2:未按照此处提到的要求对子网进行标记。

用以下方式标记VPC:

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

用以下方式标记公共子网:

Key: kubernetes.io/role/elb
Value: 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.