Home | José Ramón López | AutoSys | Webs de interés | perl | kubernetes | azure | machine learning
Table of Contents
1.4.1 api-server instalado con kubeadm
2 replicaSet (replicacontroller)
2.4 Tipo de servicio: NodePort
2.5 Tipo de servicio: ClusterIP
2.6 Tipo de servicio: LoadBalancer
2.7.1 Comunicacion intra namespace
2.7.2 Comunicación inter namespace
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
Herramientas de los containers runtime
Ctr para container-d
Nerdctl para container-d
Crictl para todos los container runtime
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
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
En el fichero /etc/kubernetes/manifests/ kube-apiserver.yaml
En el fichero /etc/systemd/system/kube-apiserver.service
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
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
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í
Es el encargo de contactar monitorizar los containers y contactar con el container engine
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
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
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
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
kubectl replace -f replicaSet.yaml
kubectl scale –replicas num -f replicaSetFile.yaml
kubect scale –replicas num replicaset replicaSetName
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
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
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
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
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
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
Dentro de un namespace se usa el nombre del recurso
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
Imperativo
· Commando
· + rápido
Declarative
· Kubectl apply -f file.yaml
· + confinable
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