kubernetes服务外部IP挂起

时间:2017-05-22 10:44:12

标签: docker kubernetes virtualization

我正在尝试在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仪表板上显示为待处理。 Terminal output Dash board status

所以请帮我解决这个问题。谢谢......

21 个答案:

答案 0 :(得分:93)

您似乎正在使用自定义Kubernetes群集(使用minikubekubeadm等)。在这种情况下,没有集成LoadBalancer(与AWS或Google Cloud不同)。使用此默认设置,您只能使用NodePort或Ingress Controller。使用Ingress Controller,您可以设置一个映射到您的广告连播的域名。

答案 1 :(得分:22)

要访问minikube上的服务,您需要运行以下命令:

minikube service [-n NAMESPACE] [--url] NAME

此处提供更多信息:Minikube GitHub

答案 2 :(得分:21)

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

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

答案 3 :(得分:17)

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

$ minikube tunnel

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

参考链接 https://github.com/kubernetes/minikube/blob/master/docs/networking.md#loadbalancer-emulation-minikube-tunnel

答案 4 :(得分:7)

我使用kubeadm创建了一个单节点k8s集群。当我尝试 PortForward kubectl代理时,它显示外部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

答案 5 :(得分:4)

如果您使用的是minikube,请在终端

下运行以下命令
$ minikube ip
$ 172.17.0.2 // then 
$ curl http://172.17.0.2:31245
or simply
$ curl http://$(minikube ip):31245

答案 6 :(得分:3)

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

首先运行:

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 :未根据提到的here的要求对子网进行标记。

使用以下方式标记VPC:

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

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

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

答案 7 :(得分:1)

使用NodePort:

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

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

kubectl描述服务user-login-service (记下端口)

kubect群集信息 (IP->获取运行主服务器的IP)

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

答案 8 :(得分:1)

如果这是您的私有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)。

FYR:

在安装MetalLB之前: enter image description here

安装MetalLB之后: enter image description here

enter image description here

答案 9 :(得分:1)

使用Minikube时,您可以获取IP和端口 可以通过运行minikube服务kubia-http访问该服务。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

您可以修补托管Pod的Node的IP(Node的Private IP),这是简单的解决方法。

参考以上文章,以下为我工作:

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

答案 13 :(得分:0)

可能是您部署服务所在的子网,没有足够的 ip

答案 14 :(得分:0)

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

metalK附带MicroK8s,您可以这样启用它:

microk8s enable metallb

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

答案 15 :(得分:0)

公开服务有以下三种类型 节点端口 集群IP 负载均衡器

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

因此负载均衡器类型在我们的本地minikube环境中不起作用。

答案 16 :(得分:0)

按照@Javier的回答。我决定为我的负载均衡器使用“修补外部IP”。

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

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

有关此的更多信息。请参阅LoadBalancer support with Minikube for Kubernetes

上的 karthik's 帖子

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

如果在 minikube 上运行,请不要忘记提及默认名称空间。

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

同一问题:

  

os> kubectl获取svc右剑齿wordpress

     

名称类型群集IP外部IP端口(S)
   right-sabertooth-wordpress LoadBalancer 10.97.130.7“待处理” 80:30454 / TCP,443:30427 / TCP

     

os> minikube服务列表

     

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

     

|名称空间| NAME |网址|

     

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

     

|默认值kubernetes |没有节点端口|

     

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

     

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

     

| | | http://192.168.99.100:30427 |

     

| kube系统| kube-dns |没有节点端口|

     

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

     

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

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