¿Qué vamos a ver?
Basado en la documentación oficial de K8s (licencia CC-BY-4.0).
>_.source <(kubectl completion bash)
Comprueba que funciona escribiendo kubectl y presionando la tecla "TAB" 2 veces.Crea un namespace para aislar los recursos de este ejercicio del resto de recursos en tu clúster:
kubectl create namespace lab-ingress
Vamos a crear un Servicio interno de tipo ClusterIp para exponer un Despliegue internamente dentro del clúster.
deployments/demo-ingress-v1.yaml con este manifiesto:apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-ingress
spec:
replicas: 3
selector:
matchLabels:
app: demo-ingress
version: v1
template:
metadata:
labels:
app: demo-ingress
version: v1
spec:
containers:
- image: gcr.io/google-samples/hello-app:1.0
name: hello-world
ports:
- containerPort: 8080
kubectl apply -f deployments/demo-ingress-v1.yaml -n lab-ingress
kubectl get pods -n lab-ingress
kubectl describe deployments demo-ingress -n lab-ingress
services/demo-ingress-v1.yaml con este manifiesto:apiVersion: v1
kind: Service
metadata:
name: demo-service
labels:
version: v1
spec:
type: ClusterIP
selector:
app: demo-ingress
version: v1
ports:
- protocol: TCP
port: 80
targetPort: 8080
kubectl apply -f services/demo-ingress-v1.yaml -n lab-ingress
kubectl get services -n lab-ingress
kubectl describe services demo-service -n lab-ingress
kubectl run service-test-pod --image gcr.io/google-samples/node-hello:1.0 --generator=run-pod/v1 -n lab-ingress
kubectl exec -it service-test-pod -n lab-ingress -- sh
apt update
apt install curl -y
curl [SERVICIO_IP]
curl demo-service.lab-ingress.svc.cluster.local
exit
Ahora convierte el Servicio en uno accesible desde fuera del Clúster usando una nueva versión del manifiesto con un Servicio de tipo NodePort.
services/demo-ingress-v1-nodeport.yaml con este manifiesto:apiVersion: v1
kind: Service
metadata:
name: demo-service
labels:
version: v1
spec:
type: NodePort
selector:
app: demo-ingress
version: v1
ports:
- protocol: TCP
port: 80
targetPort: 8080
Fíjate que únicamente cambiamos el tipo de Servicio, manteniendo el nombre y el resto de características.kubectl apply -f services/demo-ingress-v1-nodeport.yaml -n lab-ingress
kubectl describe services demo-service -n lab-ingress
Fíjate en el tipo de Servicio empleado.gcloud compute instances list
curl [IP_NODO]:[PUERTO_NODO]
Vamos a desplegar un nuevo Despliegue de Pods y un Servicio asociado a los mismos, esta vez de tipo LoadBalancer.
deployments/demo-ingress-v2.yaml con este manifiesto:apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-ingress-v2
spec:
replicas: 3
selector:
matchLabels:
app: demo-ingress
version: v2
template:
metadata:
labels:
app: demo-ingress
version: v2
spec:
containers:
- image: gcr.io/google-samples/hello-app:2.0
name: hello-world
ports:
- containerPort: 8080
Este manifiesto corresponde a otro Despliegue diferente, con una nueva versión de la misma imagen de Contenedor.kubectl apply -f deployments/demo-ingress-v2.yaml -n lab-ingress
kubectl get pods -n lab-ingress
kubectl describe deployments demo-ingress-v2 -n lab-ingress
services/demo-ingress-v2.yaml con este manifiesto:apiVersion: v1
kind: Service
metadata:
name: demo-service-v2
labels:
version: v2
spec:
type: LoadBalancer
selector:
app: demo-ingress
version: v2
ports:
- protocol: TCP
port: 80
targetPort: 8080
kubectl apply -f services/demo-ingress-v2.yaml -n lab-ingress
kubectl get services -n lab-ingress -w
kubectl describe services demo-service-v2 -n lab-ingress
curl [SERVICIO_IP]
Vamos a desplegar un recurso Ingress que redireccionará internamente a ambos Servicios en función de la URL de la petición web.
services/demo-ingress-ingress.yaml con este manifiesto:apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /v1
backend:
serviceName: demo-service
servicePort: 80
- path: /v2
backend:
serviceName: demo-service-v2
servicePort: 80
kubectl apply -f services/demo-ingress-ingress.yaml -n lab-ingress
kubectl get ingress -n lab-ingress -w
kubectl describe ingress demo-service-ingress -n lab-ingress
curl [INGRESS_IP]/v1
curl [INGRESS_IP]/v2
Elimina el namespace, lo cual eliminará todos los recursos:
kubectl delete namespace lab-ingress
En esta práctica hemos visto cómo: