| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
| informatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes [2024/03/07 10:53] – [Resumen comandos] tempwin | informatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes [2024/03/07 15:49] (actual) – [Conceptos avanzados de Docker] tempwin |
|---|
| * Añadiendo una sentencia ''COPY'' en el ''Dockerfile'' para copiar el fichero de configuración y recrear la imagen | * Añadiendo una sentencia ''COPY'' en el ''Dockerfile'' para copiar el fichero de configuración y recrear la imagen |
| |
| | **Tienes un StatefulSet con 3 pods. El StatefulSet define una plantilla de PVC. Luego se desescala el StatefulSeta dos pods. ¿Qué ocurre con el PVC del tercer pod, con la configuración por defecto del StatefulSet?** |
| | |
| | * Se elimina automáticamente |
| | * Se mantiene (**correcto**) |
| | * El desescalado da error, ya que hay que eliminar manualmente el PVC antes |
| | |
| | **Un desarrollador necesita conectarse a la BBDD de desarrollo, pero no conoce la cadena de conexión. Actualmente hay un pod que usa dicha cadena de conexión. El YAML del pod es como sigue:** |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Pod |
| | metadata: |
| | name: client |
| | spec: |
| | containers: |
| | - name: app |
| | image: acme-org/client:v1 |
| | env: |
| | - name: DB_CONSTR |
| | valueFrom: |
| | - secretKeyRef: |
| | name: db-data |
| | key: constr |
| | </code> |
| | |
| | **¿Qué le indicas al desarrollador para que pueda ver la cadena de conexión?** |
| | |
| | * Que pregunte al departamento de seguridad |
| | * Que ejecute el comando ''kubectl get secret db-data -o yaml'' y luego decodifique el valor de la clave ''constr'' que estará en BASE64. (**correcto**) |
| | * Que ejecute el comando ''kubectl get cm db-data -o yaml'' y mire el valor de la clave ''constr'' |
| | * Que mire los logs del pod |
| | * Que mire los logs del nodo |
| | * Que abra una sesión interactiva con el pod y ejecute el comando ''env'' |
| | * ''grep DB_CONSTR'' |
| | |
| | **¿Todos los pods de un StatefulSet tienen que tener la misma plantilla?** |
| | |
| | * Para nada, para crear pods idénticos se usa el Deployment |
| | * Sí, porque un StatefulSet crea siempre pods idénticos (**correcto**) |
| | * Sólo si no usan volúmenes persistentes |
| | * El StatefulSet no crea pods, crea estados. |
| | |
| | **¿Es posible configurar un StatefulSet para que elimine un PVC cuando el StatefulSet es desescalado?** |
| | |
| | * Sí, con la opción whenScaled a Delete (**correcto**) |
| | * No, porque los PVCs son eliminados automáticamente cuando se elimina un pod |
| | * No, solo puedes configurar que se borren los PVCs al eliminar el StatefulSet entero |
| | * No, los PVCs siempre deben ser eliminados manualmente |
| | |
| | **¿Puedes exponer MySQL a través de NodePort?** |
| | |
| | * No, debes usar Ingress |
| | * No, debes usar un servicio ExternalName |
| | * No, debes usar un servicio LoadBalancer |
| | * No, debes usar un servicio ClusterIP |
| | * Sí (**correcto**) |
| ===== Resumen comandos ===== | ===== Resumen comandos ===== |
| |
| * ''docker %%--%%version'': verifica la versión de Docker instalada. | * ''docker %%--%%version'': verifica la versión de Docker instalada. |
| * ''docker context'' | * ''docker context'' |
| * ''docker context ls'': listar contextos | * ''docker context ls'': listar contextos actuales. |
| * ''docker context use <NOMBRE_CONTEXTO>'': alternar contexto. | * ''docker context use <NOMBRE_CONTEXTO>'': cambia de contexto. |
| | * ''docker context create shared-vm %%--%%docker host=tcp:%%//%%shared-vm:2735'': crea un contexto que apunta a ''%%TCP://shared-vm:2375%%'' (donde debe haber un //daemon// de Docker escuchando por el puerto 2735). |
| | * ''docker context import <nombre-contexto>'': exporta un contexto. |
| | * ''docker context import <nombre-contexto> <nombre-fichero>'': importa un contexto. |
| * ''docker pull <NOMBRE_IMAGEN>'': descarga una imagen | * ''docker pull <NOMBRE_IMAGEN>'': descarga una imagen |
| * ''docker images'': lista las imágenes descargadas | * ''docker images'': lista las imágenes descargadas |
| * ''docker run -v /test-volume test-volume'': crea un volumen anónimo (Docker lo hace automáticamente). | * ''docker run -v /test-volume test-volume'': crea un volumen anónimo (Docker lo hace automáticamente). |
| * ''docker run -e %%"variable=valor"%% <nombre_imagen>'': pasa variable de entorno a un contenedor. | * ''docker run -e %%"variable=valor"%% <nombre_imagen>'': pasa variable de entorno a un contenedor. |
| | * ''docker run %%--%%network test-network <IMAGEN>'': crea un contenedor que use la red ''test-network''. |
| * ''docker ps'': lista los contenedores en ejecución. | * ''docker ps'': lista los contenedores en ejecución. |
| * ''docker ps -a'': lista los contenedores en ejecución y parados. | * ''docker ps -a'': lista los contenedores en ejecución y parados. |
| * ''docker compose %%--%%version'': verifica la versión instalada de Docker Compose. | * ''docker compose %%--%%version'': verifica la versión instalada de Docker Compose. |
| * ''docker compose up'': descarga la imagen (si no existe en local) y pone en marcha un contenedor a partir de ella | * ''docker compose up'': descarga la imagen (si no existe en local) y pone en marcha un contenedor a partir de ella |
| | * ''docker compose up -d'': levanta los servicios en segundo plano (no se enlaza con ellos). |
| * ''docker compose up <SERVICIO>'': levanta solo el servicio ''SERVICIO''. | * ''docker compose up <SERVICIO>'': levanta solo el servicio ''SERVICIO''. |
| * ''docker compose -f docker-compose.development.yml up'': especifica el fichero Docker Compose a utilizar. | * ''docker compose -f docker-compose.development.yml up'': especifica el fichero Docker Compose a utilizar. |
| * ''docker compose --profile front up'': levanta los servicios con el perfil ''up'' y los que no tienen ningún perfil asociado. | * ''docker compose --profile front up'': levanta los servicios con el perfil ''up'' y los que no tienen ningún perfil asociado. |
| * ''docker compose build'': construye imágenes con Docker Compose. | * ''docker compose build'': construye imágenes con Docker Compose. |
| | * ''docker compose up %%--%%scale <SERVICIO=5>'': escalar un servicio con 5 instancias. |
| | * ''docker attach <CONTENEDOR>'': permite enlazarnos a un contenedor. |
| | * ''docker network ls'': lista las redes de Docker que hay en la máquina. |
| | * ''docker network create %%--%%driver bridge <nombre-red>'': crea una red tipo bridge. |
| | * ''docker network create %%--%%driver host <nombre-red>'': crea una red tipo host (solo puede existir una). |
| | * ''docker network rm <ID_RED>'': elimina una red. |
| | * ''docker network prune'': elimina todas las redes que no estén en uso. |
| | * ''docker logs <CONTENEDOR>'': ver los //logs// de un contenedor (la salida por pantalla, //stdin//, o errores, //stdout//). |
| | * ''docker cp <CONTENEDOR>:logs/log.txt .'': copia del contenedor al host. |
| | * ''docker cp foo.txt <CONTENEDOR>:/app/foo.txt'': copia del host al contenedor |
| | * ''docker commit <CONTENEDOR> <NUEVA_IMAGE>'': crea una imagen a partir de un contenedor. |
| |
| Listado de ficheros: | Listado de ficheros: |
| * ''docker-compose.yml'': nombre habitual del fichero de configuración de Docker Compose. | * ''docker-compose.yml'': nombre habitual del fichero de configuración de Docker Compose. |
| * ''docker-compose.override.yml'' | * ''docker-compose.override.yml'' |
| | * ''kubectl get secrets'': muestra los secretos que hay en el clúster. |
| | * ''kubectl create secret generic my_secret %%--%%from-literal password=PassW0rD'': crea un secreto. |
| | * ''kubectl logs <NOMBRE_POD>'': muestra los logs de un pod (lo que su contenedor o contenedores muestren por //stdout// o //stderr//). |
| | * ''kubectl logs -l <etiqueta=valor>'': muestra los logs de los pods que tengan la etiqueta indicada. |
| |
| Dockerfile: | Dockerfile: |
| * ''EXPOSE <PUERTO>'': indica el puerto que quiere exponer / abrir el contenedor. Es informativo. | * ''EXPOSE <PUERTO>'': indica el puerto que quiere exponer / abrir el contenedor. Es informativo. |
| * ''VOLUME <DIRECTORIO>'': indica que ''DIRECTORIO'' será un volumen | * ''VOLUME <DIRECTORIO>'': indica que ''DIRECTORIO'' será un volumen |
| | |
| | Dockerfile multi-stage: |
| | |
| | <code> |
| | FROM golang:1.9-stretch |
| | WORKDIR /go/src/hello_world |
| | COPY hello_world.go . |
| | RUN go build |
| | |
| | FROM ubuntu:latest |
| | WORKDIR /root/ |
| | COPY --from=0 /go/src/hello_world . |
| | ENTRYPOINT ["/root/hello_world"] |
| | </code> |
| |
| Docker Compose: | Docker Compose: |
| context: ./nodejs-sample | context: ./nodejs-sample |
| dockerfile: Dockerfile | dockerfile: Dockerfile |
| | </code> |
| | |
| | **Kubernetes**: |
| | |
| | * ''minikube start'': Minikube ejecuta Kubernetes como un contenedor de Docker. |
| | * ''minikube stop'': detine el contenedor de Minikube. |
| | * ''minikube ip'':muestra la IP de Minikube. |
| | * ''minikube tunnel'': crea un emulador de balanceador de carga (para probar los //LoadBalancer//). |
| | * ''minikube addons enable ingress'': instalar un controlador ingress en Minikube. |
| | * ''minikube service -n ingress-nginx ingress-controller'': muestra las URL de acceso al controlador de ingress ''ingress-controller'' del espacio de nombres ''ingress-nginx''. |
| | * ''kubectl version'': información sobre la versión del cliente y servidor de Kubernetes instalados. |
| | * ''kubectl get nodes'': lista los nodoso de nuestro clúster. |
| | * ''kubectl get pods'': lista los pods. |
| | * ''kubectl get pods -o wide'': lista los pods y muestra su IP y otros campos más. |
| | * ''kubectl config get-contexts'': lista los contextos de configuración que tengamos |
| | * ''kubectl config current-context'': muestra el contexto actual. |
| | * ''kubectl config use-context <nombre-contexto>'': cambia el contexto actual. |
| | * ''kubectl %%--%%kubeconfig=<RUTA_FICHERO_CONFIG> <comando-de-kubcetl>'': especifica el fichero de configuración de Kubernetes a usar. |
| | * ''kubectl run my-first-deployment %%--%%image=dockercampusmvp/go-hello-world'': crea y despliega un pod con 1 contenedor. |
| | * ''kubectl run bb %%--%%image busybox %%--%%rm %%--%%restart=Never -it %%--%% /bin/sh'': crea un pod llamado ''bb'' a partir de la imagen ''busybox'', lo enlaza a nuestra terminal y ejecuta un shell. Se eliminará el pod cuando termine de ejecutarse. El pod no intentará reiniciar el contenedor. |
| | * ''kubectl delete pod <nombre-del-pod>'': elimina un pod. |
| | * ''kubectl create deployment <NOMBRE_DEPLOYMENT> --image=<IMAGEN>'': crea un //deployment// indicando que debe ejecutarse un contenedor a partir de cierta imagen. Se puede abreviar ''deployment'' con ''deploy''. |
| | * ''kubectl describe'': detalle sobre los eventos de cierto objeto. |
| | * ''kubectl expose pod <NOMBRE_POD> %%--%%name <NOMBRE_SERVICIO> %%--%%port <puerto>'': crea un servicio pra exponer cierto pod por un determinado puerto. |
| | * ''kubectl get services'': muestra los servicios. También se puede acortar ''services'' con ''svc''. |
| | * ''kubectl get pods %%--%%show-labels'': mostrar las etiquetas de los pods. |
| | * ''kubectl get pod <nombre_pod> -o json'': muestra la descripción del pod en formato JSON. |
| | * ''kubectl get nodes'': mostrar los nodos del clúster de kubernetes. |
| | * ''kubectl taint node <nombre-node> <clave>=<valor>:<efecto>'': "contamina" un nodo para que no se ejecute pods en él. |
| | * ''kubectl get svc hello-svc -o yaml'': obtiene la definición del servicio ''hello-svc'' en YAML. |
| | * ''kubectl get pod hello -o yaml'': obtiene la definición del objeto ''hello'' en YAML. |
| | * ''kubectl create ns <nombre-namespace>'': crea un espacio de nombres. |
| | * ''kubectl run nginx --image nginx -n mi-espacio-nombres'': creamos el pod ''nginx'' en el espacio de nombres ''mi-espacio-nombres'' con un contenedor basado en la imagen ''nginx''. |
| | * ''kubectl delete ns <espacio-de-nombres>'': elimina un espacio de nombres y todo recurso contenido en él. |
| | * ''kubectl apply -f <NOMBRE_FICHERO>'': aplica un fichero para la creación de algún objeto en Kubernetes. |
| | * ''kubectl delete -f <fichero>'': elimina los recursos definidos en el fichero (secciones ''kind'' y ''metadata.name''). |
| | * ''kubectl run hello %%--%%image dockercampusmvp/go-hello-world %%--%%dry-run=client -o yaml > pod.yaml'': genera el YAML necesario para poder crear un pod de forma declarativa. |
| | * ''kubectl explain <recurso>'': muestra la especificación YAML de cualquier recurso. |
| | * ''kubectl explain pod.spec'': muestra los campos que tiene ''spec'' en la especificación YAML de un pod. |
| | * ''kubectl port-forward <nombre-pod> <puerto-local>:<puerto-pod>'': establece un túnel entre nuestra máquina y el pod para poder acceder a él. |
| | * ''kubectl delete rs <nombre-replicaset> .'': elimina un ReplicaSet y los pods que gestiona. |
| | * ''kubectl scale rs/<nombre-replicaset> %%--%%replicas=4'': escala un ReplicaSet a 4 pods. |
| | * ''kubectl scale deploy/<nombre-deployment> %%--%%replicas=<numero-replicas>'': escala un deployment. |
| | * ''kubectl rollout status'': muestra el estado de un //rolling update//. |
| | * ''kubectl rollout history'': mostrar las versiones de //deployment//. |
| | * ''kubectl rollout undo deploy/<NOMBRE_DEPLOY> %%--%%to-revision=1'': vamos a la versión 1 de cierto deployment. |
| | * ''kubectl annotate deploy/hello kubernetes.io/change-cause="volvemos atrás porque eso no va"'': indicamos una nota sobre la razón que provoca el //rollling update//. |
| | * ''kubectl create cm staging %%--%%from-literal api_url=%%https://api_service%% %%--%%from-literal environment_name=staging'': crea un Config Map |
| | * ''kubectl create cm config_files %%--%%from-file web.config %%--%%from-file config.ini=config.staging.ini'': crea un Config Map con fichero. |
| | * ''kubectl get ing'': ver recursos //Ingress//. |
| | * ''kubectl describe ing <nombre-recurso-ingress>'': información sobre un recurso //Ingress//. |
| | * ''kubectl get svc -n ingress-nginx'': ver el servicio que se expone al exterior del espacio de nombres ''ingress-nginx''. |
| | * ''kubectl get deploy'': muestra los //deployments//. |
| | |
| | Creación de un pod de forma declarativa: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Pod |
| | metadata: |
| | labels: |
| | run: hello-declarative |
| | name: hello-declarative |
| | spec: |
| | containers: |
| | - image: dockercampusmvp/go-hello-world |
| | name: hello |
| | </code> |
| | |
| | Creación de pod de forma declarativa indicando variables de entorno: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Pod |
| | metadata: |
| | name: mypod |
| | spec: |
| | containers: |
| | - image: imagenAUsar |
| | name: ctr |
| | env: |
| | - name: FooVar |
| | value: FooValue |
| | - name: BarVar |
| | value: BarValue |
| | </code> |
| | |
| | Creando un servicio de forma declarativa: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Service |
| | metadata: |
| | name: hello-svc-declarative |
| | spec: |
| | ports: |
| | - port: 8080 |
| | targetPort: 80 |
| | name: http |
| | protocol: TCP |
| | - port: 9000 |
| | targetPort: 3000 |
| | name: metrics |
| | selector: |
| | run: hello-declarative |
| | </code> |
| | |
| | ReplicaSet: |
| | |
| | <code yaml> |
| | apiVersion: apps/v1 |
| | kind: ReplicaSet |
| | metadata: |
| | name: hello |
| | spec: |
| | replicas: 1 |
| | selector: |
| | matchLabels: |
| | app: hello |
| | template: |
| | metadata: |
| | labels: |
| | app: hello |
| | spec: |
| | containers: |
| | - name: hello |
| | image: dockercampusmvp/go-hello-world |
| | </code> |
| | |
| | Deployment: |
| | |
| | <code yaml> |
| | apiVersion: apps/v1 |
| | kind: Deployment |
| | metadata: |
| | name: hello |
| | spec: |
| | strategy: |
| | type: rollingUpdate |
| | rollingUpdate: |
| | maxSurge: 1 # El valor por defecto es 25% |
| | maxUnavailable: 20% # El valor por defecto es 25% |
| | replicas: 5 |
| | selector: |
| | matchLabels: |
| | app: hello |
| | template: |
| | metadata: |
| | labels: |
| | app: hello |
| | spec: |
| | containers: |
| | - name: hello |
| | image: dockercampusmvp/go-hello-world |
| | </code> |
| | |
| | ConfigMap: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: ConfigMap |
| | metadata: |
| | name: staging |
| | data: |
| | api_url: https://api_service |
| | environment_name: staging |
| | </code> |
| | |
| | Config Map que contiene un fichero: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: ConfigMap |
| | metadata: |
| | name: config_staging |
| | data: |
| | config.json: | |
| | { |
| | "environment": "staging", |
| | "api": { |
| | "server": "https://myapi" |
| | } |
| | } |
| | </code> |
| | |
| | Definición de volúmenes de pod: |
| | |
| | <code yaml> |
| | spec: |
| | volumes: |
| | - name: shared |
| | emptyDir: {} |
| | </code> |
| | |
| | Montaje de un Config Map en un contenedor de un pod: |
| | |
| | <code yaml> |
| | apiVersion: apps/v1 |
| | kind: Deployment |
| | metadata: |
| | name: demovol |
| | spec: |
| | selector: |
| | matchLabels: |
| | app: demovol |
| | template: |
| | metadata: |
| | labels: |
| | app: demovol |
| | spec: |
| | # Definimos el volumen |
| | volumes: |
| | - name: cfg |
| | configMap: |
| | name: config_staging # Nombre del configmap |
| | containers: |
| | - name: demo |
| | image: dockercampusmvp/go-hello-world |
| | # Montamos el volumen |
| | volumeMounts: |
| | - name: cfg # Nombre del volumen |
| | mountPath: /app/config |
| | </code> |
| | |
| | Secretos: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | data: |
| | password: VmVyeUNvbXBsZXhQYXNzdzByZA== |
| | kind: Secret |
| | metadata: |
| | name: mysecret |
| | </code> |
| | |
| | Comando inicial de un contenedor: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Pod |
| | metadata: |
| | name: command |
| | spec: |
| | containers: |
| | - name: main |
| | image: alpine |
| | command: |
| | - /bin/ls |
| | restartPolicy: Never |
| | </code> |
| | |
| | Servicio NodePort: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Service |
| | metadata: |
| | name: hello |
| | spec: |
| | selector: |
| | app: hello |
| | ports: |
| | - name: http |
| | port: 8080 |
| | targetPort: http |
| | type: NodePort |
| | </code> |
| | |
| | Servicio LoadBalancer: |
| | |
| | <code yaml> |
| | apiVersion: v1 |
| | kind: Service |
| | metadata: |
| | name: hello |
| | spec: |
| | selector: |
| | app: hello |
| | ports: |
| | - name: http |
| | port: 8080 |
| | targetPort: http |
| | type: LoadBalancer |
| | </code> |
| | |
| | |
| | Recurso Ingress: |
| | |
| | <code yaml> |
| | apiVersion: networking.k8s.io/v1 |
| | kind: Ingress |
| | metadata: |
| | labels: |
| | app: demo-ingress |
| | name: demo-ingress |
| | annotations: |
| | ingress.kubernetes.io/ssl-redirect: "false" |
| | spec: |
| | rules: |
| | - http: |
| | paths: |
| | - path: /api |
| | pathType: ImplementationSpecific |
| | backend: |
| | service: |
| | name: apisvc |
| | port: |
| | number: 80 |
| | - path: /hello |
| | pathType: ImplementationSpecific |
| | backend: |
| | service: |
| | name: hellosvc |
| | port: |
| | number: 80 |
| | </code> |
| | |
| | Recurso Ingress con hosts virtuales: |
| | |
| | <code yaml> |
| | apiVersion: networking.k8s.io/v1 |
| | kind: Ingress |
| | metadata: |
| | name: hello-ingress |
| | spec: |
| | rules: |
| | - host: dev.campusmvp.es |
| | http: |
| | paths: |
| | - pathType: Prefix |
| | path: "/api" |
| | backend: |
| | service: |
| | name: hellosvc |
| | port: |
| | name: http |
| </code> | </code> |