IP externa del servicio Kubernetes pendiente
Estoy intentando implementar nginx en kubernetes, la versión de kubernetes es v1.5.2, implementé nginx con 3 réplicas, el archivo YAML se encuentra a continuación,
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 Kubernetes sino también en la terminal.
Parece que está utilizando un clúster de Kubernetes personalizado (usando minikube
o kubeadm
similar). En este caso, no hay ningún LoadBalancer integrado (a diferencia de AWS o Google Cloud). Con esta configuración predeterminada, solo puede usar NodePort
o un controlador de ingreso.
Con el controlador de Ingress puede configurar un nombre de dominio que se asigne a su pod; no necesita darle el LoadBalancer
tipo a su Servicio si usa un Controlador de Ingreso.
Si estás usando Minikube, ¡hay un comando mágico!
$ minikube tunnel
Ojalá alguien pueda ahorrar unos minutos con esto.
Enlace de referencia https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel
Si no está utilizando GCE o EKS (usó kubeadm
), puede agregar una externalIPs
especificación a su servicio YAML. Puede utilizar la IP asociada con la interfaz principal de su nodo, como eth0
. Luego podrá acceder al servicio externamente, utilizando la IP externa del nodo.
...
spec:
type: LoadBalancer
externalIPs:
- 192.168.0.10
Creé un clúster k8s de un solo nodo usando kubeadm. Cuando probé PortForward y kubectl proxy , mostró la 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 he parcheado 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 funcionar a través de 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