Home | José Ramón López | AutoSys | Webs de interés | perl | kubernetes | azure | machine learning


Table of Contents

1          Core components. 2

1.1      Cluster architecture. 2

1.2      Docker vs container-d. 3

1.3      Etcd. 3

1.4      kube-api server 4

1.4.1    api-server instalado con kubeadm.. 6

1.4.2    api-server instalado. 6

1.4.3    comprobar el proceso. 6

1.5      kube controller manager 6

1.6      Kube scheduler 7

1.7      Kubelet 7

1.8      Kube-proxy. 7

1.9      Pod. 7

1.9.1    Pods with yaml 8

2          replicaSet (replicacontroller) 9

2.1.1    escalar un replicaset 10

2.2      Deployments. 10

2.3      Services. 10

2.4      Tipo de servicio: NodePort 10

2.5      Tipo de servicio: ClusterIP.. 11

2.6      Tipo de servicio: LoadBalancer 12

2.7      Namespace. 13

2.7.1    Comunicacion intra namespace. 13

2.7.2    Comunicación inter namespace. 13

2.8      Imperativo vs declarative. 14

2.9      Kubectl apply command. 14

 

 

 

 


 

1      Core components

1.1   Cluster architecture

 

 

Componentes en el plano del control plane

·         Kube-apiserver expone el API de kubernetes

·         Etcd la base de datos de kubernetes de tipo key/value

·         Kube-scheduler decide en que node se ejecuta un pod

·         Kube-controller-manager es un conjunto de controladores

·         Cloud-controller-manager hace de intermediario entre el cluster y una nube pública

 

Componentes de los nodos

·         Kubelet gestiona los contenedores

·         Kube-proxy mantiene las reglas que permiten las comunicaciones entre los pods

·         Container run time

 

Add-ons

·         Dns

·         Web ui

·         Container resource Monitoring

·         Cluster level logging

·         Network plugings

 

1.2   Docker vs container-d

 

Herramientas de los containers runtime

Ctr para container-d

Nerdctl para container-d

Crictl para todos los container runtime

 

1.3   Etcd

Etcd la base de datos de kubernetes de tipo key/value

Puerto: 2379

Cliente: etcdctl v2

·         etcdctl set key value

·         etcdctl get key

Cliente: etcdctl v3

·         etcdctl put key value

·         etcdctl get key

 

Hay cambios entre la versión 2 y 3 y es capaz de trabajar con las dos

 

Como he configurado el cluster con kubeadm, tengo etcd en un pod y para ejecutar comandos tengo que hacerlo en su pod

 

kubectl exec etcd-cp -n kube-system -- sh -c "etcdctl version"

etcdctl version: 3.5.12

API version: 3.5

 

Veo que la versión de etcdctl es 3.5.12 y que está activa el API 3. Se puede hacer que escuche al API 2.

 

kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --keys-only --limit=10 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key"

/registry/apiextensions.k8s.io/customresourcedefinitions/bgpconfigurations.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/bgppeers.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/blockaffinities.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/caliconodestatuses.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/clusterinformations.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/felixconfigurations.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/globalnetworkpolicies.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/globalnetworksets.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/hostendpoints.crd.projectcalico.org

 

/registry/apiextensions.k8s.io/customresourcedefinitions/ipamblocks.crd.projectcalico.org

 

Añado una clave

kubectl exec etcd-cp -n kube-system -- sh -c "etcdctl put key1 value1 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key"

OK

 

Y la miro

kubectl exec etcd-cp -n kube-system -- sh -c "etcdctl get key1 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key"

key1

value1

 

1.4   kube-api server

Cuando ejecutamos un commando de kubectl estamos contactando el api server.

 

Tambíen podemos contactar el api server via REST API.

 

Primer busco el endpoint del api-server

kubectl cluster-info

Kubernetes control plane is running at https://cp:6443

CoreDNS is running at https://cp:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

 

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

 

Tambien puedo buscarlo en el fichero ./kube/config

 

Y ahora con el certificado del api-server ejecuto un curl

 

curl --cacert ./apiserver.crt https://cp:6443/version

{

  "major": "1",

  "minor": "30",

  "gitVersion": "v1.30.1",

  "gitCommit": "6911225c3f747e1cd9d109c305436d08b668f086",

  "gitTreeState": "clean",

  "buildDate": "2024-05-14T10:42:02Z",

  "goVersion": "go1.22.2",

  "compiler": "gc",

  "platform": "linux/amd64"

}

 

El camino seguido ha sido

 

Kubectl/curl --- api-server --- kubelet --- container runtime --- kubelet --- api-server --- etcd

 

Las responsabilidades del api-server

·         autenticar a los usuarios

·         validar las peticiones

·         contactar con etcd

·         contactar con kubelet

·         recopilar la información

·         contactar con el scheduler

 

Dependiendo de como se haya instalado el api-server la configuración puede estar en lado u en otro

1.4.1  api-server instalado con kubeadm

En el fichero /etc/kubernetes/manifests/ kube-apiserver.yaml

 

1.4.2  api-server instalado

En el fichero /etc/systemd/system/kube-apiserver.service

 

1.4.3  comprobar el proceso

Siempre se puede comprobar el proceso

ps -ef | grep kube-api

root        1479    1259  3 20:10 ?        00:00:45 kube-apiserver --advertise-address=10.0.0.4 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key

jose       17420    6308  0 20:34 pts/0    00:00:00 grep --color=auto kube-api

 

1.5   kube controller manager

Controla otros controladores. Monitoriza y remedia.

·         Node controler

·         Replica controler

·         …..

 

Para ver que controladores gestiona kube controller

sudo grep controllers /etc/kubernetes/manifests/kube-controller-manager.yaml

    - --controllers=*,bootstrapsigner,tokencleaner

 

1.6   Kube scheduler

Decide en que nodo se ejecuta un pod

 

1.    Elimina los nodos que no cumplen los requerimientos de cpu, memoria

2.    Ordena los nodos por recursos disponibles si se puesiera el pod allí

 

1.7   Kubelet

Es el encargo de contactar monitorizar los containers y contactar con el container engine

 

1.8   Kube-proxy

Kube-proxy mantiene las reglas que permiten las comunicaciones entre los pods

 

Por ejemplo

Pod1 10.32.0.14

Pod2 10.32.0.15

 

Pod2 expone una db con el servicio db: 10.96.0.12

 

Kube-proxy crea una regla en iptables para que si pod1 quiere hablar con el servicio db vaya el pod2

 

 

1.9   Pod

apiVersion: v1

kind: Pod

 

Es la representación de una aplicación. Es un o mas containers, normalmente hay un container principal y otro help-container. Los containers en el mismo pod están en la misma unidad de red por lo que se comunican con localhost

 

kubectl exec -i -t mc1 --container 1st -- /bin/bash

 

pod = container + gestor de containers + gestor de comunicaciones

 

 

 

1.9.1  Pods with yaml

Es obligatorio:

·         apiVersion

·         kind:

·         metadata:

·         spec:

 

 

apiVersion: v1

kind: Pod

metadata:

  name: myapp-pod

  labels:

     app: myapp

     type: front-end

spec:

  containers:

    - name: nginx-container

      image: nginx

 

kubectl apply -f fileName

 

 

2      replicaSet (replicacontroller)

apiVersion: apps/v1

kind: ReplicaSet

 

Se encarga de que haya un determinado número de pods

 

replicaSet = pod + replicas

 

Replication controller es la tecnología antigua de replica set

Replica set puede controlar pod no creados por ella. Identifica los pods por el selector

Replication controller controla los pods que ella crea

 

apiVersion: apps/v1

kind: ReplicaSet

metadata:

  name: frontend

  labels:

    app: guestbook

    tier: frontend

spec:

  replicas: 3

  selector:

    matchLabels:

      tier: frontend

  template:

    metadata:

      labels:

        tier: frontend

    spec:

      containers:

      - name: php-redis

        image: gcr.io/google_samples/gb-frontend:v3

 

 

kubectl get replicaset

 

2.1.1  escalar un replicaset

kubectl replace -f replicaSet.yaml

kubectl scale –replicas num -f replicaSetFile.yaml

kubect scale –replicas num replicaset replicaSetName

 

2.2   Deployments

KIND:       Deployment

VERSION:    v1

 

Deployment = replicas set + rolling updates

 

kubectl create deployment --image=nginx nginx

kubectl create deployment httpd-frontend --replicas 3 --image httpd:2.4-alpine

 

2.3   Services

Permite conectar Aplicaciones con otras aplicaciones o con usuarios

 

Permiten la conexión de un grupo de pods, haciendo de lb (random algoritmo)

 

Tipos

·         nodePort. Tráfico externo

·         ClusterIP. Tráfico interno

·         LoadBalancer: un LB en una nube pública

 

El endpoint de un service son los pods que están detrás

 

Si un servicio no tiene selecto, tiene como endpoints todos los pods

 

kubectl get svc

kubectl describe svc

kubectl expose pod redis --port=6379 --name redis-service // clusterIP

kubectl expose pod nginx --type=NodePort --port=80 --name=nginx-service

kubectl create service nodeport nginx --tcp=80:80 --node-port=30080

l

2.4   Tipo de servicio: NodePort

Escucha en un puerto de todos los nodos del cluster y retransmite a un puerto del pod

 

Usuario ---- nodo:puerto --- servicio:port ---- pod:puerto

        NodePort         ClusterIP:Port   TargetPort

 

NodePort 3000- 32767

 

IP de Usuario

IP del Nodo

IP de los pods

 

 

 

apiVersion: v1

kind: Service

metadata:

  name: my-service

spec:

  type: NodePort

  selector:

    app.kubernetes.io/name: MyApp

  ports:

    - port: 80

      # By default and for convenience, the `targetPort` is set to

      # the same value as the `port` field.

      targetPort: 80

      # Optional field

      # By default and for convenience, the Kubernetes control plane

      # will allocate a port from a range (default: 30000-32767)

      nodePort: 30007

 

 

kubectl run mypod --image gcr.io/google-samples/node-hello:1.0 --port 8080 --labels=key=value

kubectl expose pod mypod --name nodeport-svc --type=NodePort

 

2.5   Tipo de servicio: ClusterIP

Hace de front-end para un pod o un grupo de pods

 

Es para tráfico interno

 

Servicio

·         Pod1

·         Pod2

·         -------

 

 

Frontend Deployment – servicio – Application deployment – servicio – db

 

 

apiVersion: v1

kind: Service

metadata:

  name: my-service

spec:

  selector:

    app.kubernetes.io/name: MyApp

  ports:

    - protocol: TCP

      port: 80

      targetPort: 9376

  clusterIP: 10.0.171.239

  type: LoadBalancer

 

 

 

kubectl run mypod --image gcr.io/google-samples/node-hello:1.0 --port 8080 --labels=key=value

kubectl expose pod mypod --port 80 --target-port 8080 --name clusterip-svc

 

o en una sola vez

kubectl run httpd --image httpd:alpine --port 80 --expose=true

 

2.6   Tipo de servicio: LoadBalancer

En un load balancer para tráfico externo que se crea en una nube pública

 

apiVersion: v1

kind: Service

metadata:

  name: my-service

spec:

  selector:

    app.kubernetes.io/name: MyApp

  ports:

    - protocol: TCP

      port: 80

      targetPort: 9376

  clusterIP: 10.0.171.239

  type: LoadBalancer

status:

  loadBalancer:

    ingress:

    - ip: 192.0.2.127

 

 

2.7   Namespace

KIND:       Namespace

VERSION:    v1

 

Namespace encierra recursos, políticas

 

Namespaces por defecto

·         Default

·         Kube-system

·         Kube-public

 

kubectl config set-context $(kubectl config current-context) --namespace kube-system

kubectl get pod --all-namespaces

kubectl get pods -A

kubectl get ns

 

 

2.7.1  Comunicacion intra namespace

Dentro de un namespace se usa el nombre del recurso

 

2.7.2  Comunicación inter namespace

Entre namespaces se usa el nombre completo.

 

Recursos.namespace.tipoDeRecurso.cluster.local

 

Cluster.local es el nombre por defecto del cluster

 

Para ver el nombre del cluster en un /etc/resolv.conf de un pod

kubectl run busybo3 -it --image=busybox --restart=Never -- /bin/sh -c "cat /etc/resolv.conf"

search default.svc.cluster.local svc.cluster.local cluster.local g4f1htyerqjefkzrrs3tfzstyc.rx.internal.cloudapp.net

nameserver 10.96.0.10

options ndots:5

 

2.8   Imperativo vs declarative

Imperativo

·         Commando

·         + rápido

 

Declarative

·         Kubectl apply -f file.yaml

·         + confinable

 

 

 

2.9   Kubectl apply command

 

El yaml local se conveirte el yaml y se compara con el objeto live en etcd y luego se guardaen formato json como last applied Configuration.

Este json se guarda en el objeto live como anotación