Herramientas de usuario

Herramientas del sitio


informatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes [2024/03/07 13:35] – [Resumen comandos] tempwininformatica:sistemas_operativos:cursos:docker_a_fondo_introduccion_kubernetes [2024/03/07 15:49] (actual) – [Conceptos avanzados de Docker] tempwin
Línea 235: Línea 235:
   * 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 =====
  
Línea 312: Línea 368:
   * ''docker cp foo.txt <CONTENEDOR>:/app/foo.txt'': copia del host al contenedor   * ''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.   * ''docker commit <CONTENEDOR> <NUEVA_IMAGE>'': crea una imagen a partir de un contenedor.
- 
  
 Listado de ficheros: Listado de ficheros:
Línea 320: Línea 375:
   * ''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:
Línea 406: Línea 465:
   * ''minikube start'': Minikube ejecuta Kubernetes como un contenedor de Docker.   * ''minikube start'': Minikube ejecuta Kubernetes como un contenedor de Docker.
   * ''minikube stop'': detine el contenedor de Minikube.   * ''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 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 nodes'': lista los nodoso de nuestro clúster.
Línea 430: Línea 493:
     * ''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 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 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 creadión de algún objeto en Kubernetes.+  * ''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 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: Creación de un pod de forma declarativa:
Línea 446: Línea 526:
   - image: dockercampusmvp/go-hello-world   - image: dockercampusmvp/go-hello-world
     name: hello     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> </code>
  
Línea 466: Línea 564:
   selector:   selector:
     run: hello-declarative     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>
informatica/sistemas_operativos/cursos/docker_a_fondo_introduccion_kubernetes.1709814901.txt.gz · Última modificación: por tempwin