servicio de kubernetes ip externa pendiente

142

Estoy tratando de implementar nginx en kubernetes, la versión de kubernetes es v1.5.2, he implementado nginx con 3 réplicas, el archivo YAML está debajo,

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

y ahora quiero exponer su puerto 80 en el puerto 30062 del nodo, para eso creé un servicio a continuación,

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

este servicio funciona bien como debería, pero se muestra como pendiente no solo en el panel de control de kubernetes sino también en la terminal. Salida terminalEstado del tablero de instrumentos

así que ayúdame a resolver este problema. Gracias ...

Pankaj Jackson
fuente

Respuestas:

177

Parece que está utilizando una costumbre Kubernetes clúster (utilizando minikube, kubeadmo similar). En este caso, no hay LoadBalancer integrado (a diferencia de AWS o Google Cloud). Con esta configuración predeterminada, solo puede usar NodePorto un controlador de entrada.

Con el controlador de ingreso puede configurar un nombre de dominio que se asigna a su pod; no es necesario que le dé el LoadBalancertipo a su servicio si usa un controlador de ingreso.

Javier Salmerón
fuente
Muchas gracias @javier, esto es realmente útil. Resolví mi problema desde arriba doc.
Pankaj Jackson
9
¿Esto realmente no responde a la pregunta? El usuario está utilizando LoadBalancercomo un tipo de servicio que es un tipo de servicio válido. NodePorty ingresshay otras formas de hacerlo pero no resolver realmente el problema, ¿verdad?
Raptor
2
Es un tipo de servicio válido pero se está utilizando en una plataforma no compatible (al menos de manera predeterminada). Para usar LoadBalancer debe tener una plataforma que pueda proporcionar IP externas a los pods, que es algo que hacen Google Cloud o AWS.
Javier Salmerón
2
Estoy usando kubeadm en AWS. ¿Aún puedo LoadBalancer?
jiashenC
3
Si está utilizando minikube, ejecute el "túnel minikube". Ahora verifique sus servicios obtendrá la ip pública. Aquí está el documento para obtener más información minikube.sigs.k8s.io/docs/tasks/loadbalancer
Ravi
73

Si está utilizando Minikube, ¡hay un comando mágico!

$ minikube tunnel

Esperemos que alguien pueda ahorrar unos minutos con esto.

Enlace de referencia https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel

Peter Zhou
fuente
Probé minikube tunnely que en realidad resuelve el pendingproblema, pero entonces el nuevo IP externa no funciona: me sale un error de tiempo de espera ...
a.barbieri
@ a.barbieri, asegúrese de utilizar la ip del túnel en lugar de la minikube ip. "parcheando ingress-nginx con IP 10.106.102.98"
Peter Zhou
2
si gracias Peter. Intentará. De todos modos, al cambiar a Docker Desktop, pude superar este problema con la configuración inmediata que funciona directamente en localhost.
a.barbieri
3
Excelente sugerencia para ahorrar tiempo para la demostración.
jgitter
49

Si no está utilizando GCE o EKS (que utilizó kubeadm), puede agregar una externalIPsespecificación a su servicio YAML. Puede usar la IP asociada con la interfaz principal de su nodo, como eth0. Luego puede acceder al servicio externamente, utilizando la IP externa del nodo.

...
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10
toppur
fuente
2
Debe haber una información faltante: "Kubernetes no gestiona los IP externos y son responsabilidad del administrador del clúster". ( kubernetes.io/docs/concepts/services-networking/service ). ¿Hay algún tipo de "controlador" que deba instalar?
Daniel Alder
Estoy siguiendo el tutorial de Kubernetes ( kubernetes.io/docs/tutorials/stateless-application/guestbook ) y funcionó bien con kubeadm
Eduardo
Gracias, genial, funcionó como se esperaba. He expuesto el Servicio a la IP de la red eth de nodos que ahora es accesible fuera del clúster
Vlad Gulin
34

Para acceder a un servicio minikube, debe ejecutar el siguiente comando:

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

Más información aquí: Minikube GitHub

Saket Jain
fuente
9
ejemplo concreto: servicio minikube spark-ui-proxy --url 192.168.99.100:30621
Romeo Kienzler
21

Creé un clúster de nodo único k8s usando kubeadm. Cuando probé PortForward y el proxy kubectl , mostró IP externa como pendiente.

$ 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

En mi caso, parcheé el servicio así:

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

Después de esto, comenzó a servir sobre la IP pública

$ 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
surya vallabhaneni
fuente
11
¿Quizás deberías mencionar de dónde viene "172.31.71.218"?
EuRBamarth
Finalmente una respuesta que da cómo parchear. Gracias por compartir.
Srikant
5

Si se ejecuta en minikube , no olvide mencionar el espacio de nombres si no está utilizando el predeterminado.

servicio minikube << service_name >> --url --namespace = << namespace_name >>

Mohsin
fuente
4

Si está utilizando minikube, ejecute los siguientes comandos desde la terminal,

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

mismo problema:

os> kubectl get svc right-sabertooth-wordpress

NOMBRE TIPO CLUSTER-IP EXTERNAL-IP PUERTO (S)
right-sabertooth-wordpress LoadBalancer 10.97.130.7 "pendiente" 80: 30454 / TCP, 443: 30427 / TCP

os> lista de servicio de minikube

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

El | NAMESPACE | NOMBRE | URL |

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

El | por defecto | kubernetes | Sin puerto de nodo |

El | por defecto | right-sabertooth-mariadb | Sin puerto de nodo |

El | por defecto | right-sabertooth-wordpress | http://192.168.99.100:30454 |

El | El | El | http://192.168.99.100:30427 |

El | sistema kube | kube-dns | Sin puerto de nodo |

El | sistema kube | despliegue del timón | Sin puerto de nodo |

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

Sin embargo, es accesible a través de esa http://192.168.99.100:30454 .

Alfredo
fuente
2

Siguiendo la respuesta de @ Javier. He decidido ir a "parchar la IP externa" para mi equilibrador de carga.

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

Esto reemplazará ese 'pendiente' con una nueva dirección IP parcheada que puede usar para su clúster.

Para más sobre esto. Consulte la publicación de karthik sobre el soporte de LoadBalancer con Minikube para Kubernetes

No es la forma más limpia de hacerlo. Necesitaba una solución temporal. Espero que esto ayude a alguien.

Mo-Gang
fuente
1

Use NodePort:

kubectl ejecutar inicio de sesión de usuario --replicas = 2 --labels = "ejecutar = inicio de sesión de usuario" --imagen = kingslayerr / teamproject: versión2 --port = 5000

kubectl expone la implementación de inicio de sesión de usuario --type = NodePort --name = user-login-service

kubectl describe los servicios user-login-service (anote el puerto)

kubect cluster-info (IP-> Obtener la IP donde se ejecuta el maestro)

Se puede acceder a su servicio en (IP) :( puerto)

Shubham Sawant
fuente
1

Al usar Minikube, puede obtener la IP y el puerto a través del cual puede acceder al servicio ejecutando el servicio de minikube kubia-http.

Hammad Asad
fuente
1

Si no está en una nube compatible (aws, azure, gcloud, etc.), no puede usar LoadBalancer sin MetalLB https://metallb.universe.tf/ pero todavía está en beta.

Pierluigi Di Lorenzo
fuente
1

LoadBalancer ServiceType solo funcionará si la infraestructura subyacente admite la creación automática de Load Balancers y tiene el soporte respectivo en Kubernetes, como es el caso de Google Cloud Platform y AWS. Si no se configura dicha función, el campo de dirección IP de LoadBalancer no se rellena y aún está en estado pendiente, y el Servicio funcionará de la misma manera que un Servicio de tipo NodePort

Medone
fuente
1

Puede parchear la IP del nodo donde se alojan los pods (IP privada del nodo), esta es la solución fácil.

Tomando referencia con las publicaciones anteriores, siguiente funcionó para mí:

servicio de parche kubectl my-loadbalancer-service-name \ -n lb-service-namespace \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx Private IP del servidor físico - Nodo - donde se realiza la implementación "]}} '

Dheeraj Sharma
fuente
0

eliminar el servicio existente y crear un mismo servicio nuevo resolvió mis problemas. Mi problema es que el equilibrio de carga que define Ip I se usa para que el punto final externo esté pendiente. Cuando cambié una nueva IP de equilibrio de carga, todavía no funcionaba. Finalmente, eliminar el servicio existente y crear uno nuevo resolvió mi problema.

Shakira Sun
fuente
0

Verifique los registros del controlador Kube. Pude resolver este problema estableciendo las etiquetas de clusterID en la instancia ec2 en la que implementé el clúster.

Rakesh Pelluri
fuente
0

Si es su clúster privado de k8s, MetalLB sería mejor. Debajo están los pasos.

Paso 1: Instale MetalLB en su clúster

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)"

Paso 2: configúrelo utilizando un mapa de configuración

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 

Paso 3: cree su servicio para obtener una IP externa (aunque sería una IP privada).

ARY:

Antes de la instalación de MetalLB: ingrese la descripción de la imagen aquí

Después de la instalación de MetalLB: ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Thilee
fuente
0

Agregar una solución para aquellos que encontraron este error mientras se ejecutaban .

Primero de todo correr:

kubectl describe svc <service-name>

Y luego revise el eventscampo en la salida de ejemplo a continuación:

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

Revise el mensaje de error:

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

En mi caso, la razón por la que no se proporcionaron subredes adecuadas para crear el ELB fueron:

1: El clúster EKS se implementó en el grupo de subredes incorrecto: subredes internas en lugar de cara al público.
(*) De manera predeterminada, los servicios de tipo LoadBalancercrean equilibradores de carga de cara al público si no service.beta.kubernetes.io/aws-load-balancer-internal: "true"se proporcionó ninguna anotación).

2: Las subredes no se etiquetaron de acuerdo con los requisitos mencionados aquí .

Etiquetar VPC con:

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

Etiquetado de subredes públicas con:

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