Implemente kubernetes HA con containerd

Buenas tardes queridos lectores de Habr! El 24 de mayo de 2018, se publicó un artículo titulado Kubernetes Containerd Integration Goes GA en el blog oficial de Kubernetes, que establece que la integración de contenedores con Kubernetes está lista para la producción. Además, los chicos de la compañía Flant publicaron una traducción del artículo al ruso en su blog, agregando una pequeña aclaración de ellos mismos. Después de leer la documentación del proyecto en github , decidí probar el contenedor en "mi propia piel".
Nuestra empresa tiene varios proyectos en la etapa de "todavía muy lejos de la producción". Entonces se convertirán en nuestro experimental; para ellos, decidimos intentar implementar un clúster de conmutación por error de Kubernetes usando containerd y ver si hay vida sin docker.
Si está interesado en ver cómo lo hicimos y qué surgió, bienvenido a cat.
Descripción esquemática y de implementación

Al implementar un clúster, como de costumbre, (escribí sobre esto en un artículo anterior
keepalived: implementaciones de VRRP (Virtual Router Redundancy Protocol) para LinuxKeepalived crea una IP virtual (VIRTIP) que "señala" (crea una subinterfaz) a la IP de uno de los tres maestros. El demonio keepalived supervisa el estado de las máquinas y, en caso de falla, excluye el servidor fallido de la lista de servidores activos cambiando VIRTIP a la IP de otro servidor, de acuerdo con el "peso" especificado al configurar keepalived en cada servidor.
Los demonios de Keepalived se comunican a través de VRRP, enviándose mensajes a la dirección 224.0.0.18.
Si el vecino no ha enviado su mensaje, después del período se lo considera muerto. Tan pronto como el servidor bloqueado comienza a enviar sus mensajes a la red, todo vuelve a su lugar
Configuramos el trabajo con el servidor API en nodos kubernetes de la siguiente manera.
Después de instalar el clúster, configure kube-proxy, cambie el puerto de 6443 a 16443 (detalles a continuación). En cada uno de los maestros, se implementa nginx, que funciona como equilibrador de carga, escucha en el puerto 16443 y realiza un flujo ascendente de los tres maestros en el puerto 6443 (detalles a continuación).
Este esquema ha logrado una mayor tolerancia a fallas usando keepalived, así como usando nginx, se ha logrado un equilibrio entre los servidores API en los asistentes.
En un artículo anterior, describí la implementación de nginx y etcd en docker. Pero en este caso, no tenemos docker, por lo que nginx y etcd funcionarán localmente en masternodes.
Teóricamente, sería posible implementar nginx y etcd usando containerd, pero en caso de algún problema este enfoque complicaría el diagnóstico, por lo que decidimos no experimentar y ejecutarlo localmente.
Descripción de los servidores para la implementación:
Nombre | IP | Servicios |
---|
VIRTIP | 172.26.133.160 | ------ |
kube-master01 | 172.26.133.161 | kubeadm, kubelet, kubectl, etcd, containerd, nginx, keepalived |
kube-master02 | 172.26.133.162 | kubeadm, kubelet, kubectl, etcd, containerd, nginx, keepalived |
kube-master03 | 172.26.133.163 | kubeadm, kubelet, kubectl, etcd, containerd, nginx, keepalived |
kube-node01 | 172.26.133.164 | kubeadm, kubelet, kubectl, containerd |
kube-node02 | 172.26.133.165 | kubeadm, kubelet, kubectl, containerd |
kube-node03 | 172.26.133.166 | kubeadm, kubelet, kubectl, containerd |
Instale kubeadm, kubelet, kubectl y paquetes relacionados
Todos los comandos se ejecutan desde la raíz
sudo -i
apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl unzip tar apt-transport-https btrfs-tools libseccomp2 socat util-linux mc vim keepalived
Instalar conteinerd

cd / wget https://storage.googleapis.com/cri-containerd-release/cri-containerd-1.1.0-rc.0.linux-amd64.tar.gz tar -xvf cri-containerd-1.1.0-rc.0.linux-amd64.tar.gz
Configurar configuraciones de contenedor
mkdir -p /etc/containerd nano /etc/containerd/config.toml
Añadir al archivo:
[plugins.cri] enable_tls_streaming = true
Comenzamos conteinerd comprobamos que todo está bien
systemctl enable containerd systemctl start containerd systemctl status containerd ● containerd.service - containerd container runtime Loaded: loaded (/etc/systemd/system/containerd.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2018-06-25 12:32:01 MSK; 7s ago Docs: https://containerd.io Process: 10725 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 10730 (containerd) Tasks: 15 (limit: 4915) Memory: 14.9M CPU: 375ms CGroup: /system.slice/containerd.service └─10730 /usr/local/bin/containerd Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Get image filesystem path "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=error msg="Failed to load cni during init, please check CRI plugin status before setting up network for pods" error="cni con Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="loading plugin "io.containerd.grpc.v1.introspection"..." type=io.containerd.grpc.v1 Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start subscribing containerd event" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start recovering state" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg=serving... address="/run/containerd/containerd.sock" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="containerd successfully booted in 0.308755s" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start event monitor" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start snapshots syncer" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start streaming server"
Instalar y ejecutar etcd
Nota importante, instalé el clúster kubernetes versión 1.10. Solo un par de días después, al momento de escribir el artículo, se lanzó la versión 1.11. Si instala la versión 1.11, configure la variable ETCD_VERSION = "v3.2.17", si 1.10 entonces ETCD_VERSION = "v3.1.12".
export ETCD_VERSION="v3.1.12" curl -sSL https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz | tar -xzv --strip-components=1 -C /usr/local/bin/
Copie configuraciones de gitahab.
git clone https://github.com/rjeka/k8s-containerd.git cd k8s-containerd
Configure las variables en el archivo de configuración.
vim create-config.sh
Descripción de las variables del archivo create-config.sh
configuraciones en la máquina local de cada nodo (cada nodo tiene su propio)
K8SHA_IPLOCAL : dirección IP del nodo en el que está configurado el script
K8SHA_ETCDNAME : nombre de la máquina local en el clúster ETCD
K8SHA_KA_STATE - rol en keepalived. Un nodo MAESTRO, todos los demás BACKUP.
K8SHA_KA_PRIO : prioridad mantenida , el maestro tiene 102 para los 101, 100 restantes. Cuando el maestro con el número 102 cae, el nodo con el número 101 toma su lugar y así sucesivamente.
K8SHA_KA_INTF - interfaz de red keepalived. El nombre de la interfaz que keepalived escuchará.
La configuración general para todos los masternodes es la misma:
K8SHA_IPVIRTUAL = 172.26.133.160 - IP virtual del clúster.
K8SHA_IP1 ... K8SHA_IP3 - Direcciones IP de maestros
K8SHA_HOSTNAME1 ... K8SHA_HOSTNAME3 : nombres de host para masternodes. Un punto importante, con estos nombres, kubeadm generará certificados.
K8SHA_KA_AUTH : contraseña para keepalived. Puedes especificar cualquier
K8SHA_TOKEN : token de clúster. Se puede generar con el comando kubeadm token generate
K8SHA_CIDR : dirección de subred para hogares. Yo uso franela, así que CIDR 0.244.0.0/16. Asegúrese de pantalla: en la configuración debe ser K8SHA_CIDR = 10.244.0.0 \ / 16
Ejecute el script que configurará nginx, keepalived, etcd y kubeadmin
./create-config.sh
Comenzamos etcd.
etcd levanté sin tls. Si necesita tls, en la
documentación oficial de kubernetes está escrito en detalle cómo generar certificados para etcd.
systemctl daemon-reload && systemctl start etcd && systemctl enable etcd
Comprobación de estado
etcdctl cluster-health member ad059013ec46f37 is healthy: got healthy result from http://192.168.5.49:2379 member 4d63136c9a3226a1 is healthy: got healthy result from http://192.168.4.169:2379 member d61978cb3555071e is healthy: got healthy result from http://192.168.4.170:2379 cluster is healthy etcdctl member list ad059013ec46f37: name=hb-master03 peerURLs=http://192.168.5.48:2380 clientURLs=http://192.168.5.49:2379,http://192.168.5.49:4001 isLeader=false 4d63136c9a3226a1: name=hb-master01 peerURLs=http://192.168.4.169:2380 clientURLs=http://192.168.4.169:2379,http://192.168.4.169:4001 isLeader=true d61978cb3555071e: name=hb-master02 peerURLs=http://192.168.4.170:2380 clientURLs=http://192.168.4.170:2379,http://192.168.4.170:4001 isLeader=false
Si todo está bien, continúe con el siguiente paso.
Configurar kubeadmin
Si está utilizando kubeadm versión 1.11, puede omitir este paso
Para que Kybernetes comience a trabajar no con Docker, sino con contenedor, configure la configuración de kubeadmin
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Después de [Servicio] agregue una línea al bloque
Environment="KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
Toda la configuración debería verse así: [Service] Environment="KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock" Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true" Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin" Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local" Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt" Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0" Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS
Si instala la versión 1.11 y desea experimentar con CoreDNS en lugar de kube-dns y probar la configuración dinámica, elimine el comentario del siguiente bloque en el archivo de configuración kubeadm-init.yaml:
feature-gates: DynamicKubeletConfig: true CoreDNS: true
Reiniciar kubelet
systemctl daemon-reload && systemctl restart kubelet
Inicialización del primer asistente.
Antes de iniciar kubeadm, debe reiniciar keepalived y verificar su estado
systemctl restart keepalived.service systemctl status keepalived.service ● keepalived.service - Keepalive Daemon (LVS and VRRP) Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-06-27 10:40:03 MSK; 1min 44s ago Process: 4589 ExecStart=/usr/sbin/keepalived $DAEMON_ARGS (code=exited, status=0/SUCCESS) Main PID: 4590 (keepalived) Tasks: 7 (limit: 4915) Memory: 15.3M CPU: 968ms CGroup: /system.slice/keepalived.service ├─4590 /usr/sbin/keepalived ├─4591 /usr/sbin/keepalived ├─4593 /usr/sbin/keepalived ├─5222 /usr/sbin/keepalived ├─5223 sh -c /etc/keepalived/check_apiserver.sh ├─5224 /bin/bash /etc/keepalived/check_apiserver.sh └─5231 sleep 5
compruebe si hace ping VIRTIP
ping -c 4 172.26.133.160 PING 172.26.133.160 (172.26.133.160) 56(84) bytes of data. 64 bytes from 172.26.133.160: icmp_seq=1 ttl=64 time=0.030 ms 64 bytes from 172.26.133.160: icmp_seq=2 ttl=64 time=0.050 ms 64 bytes from 172.26.133.160: icmp_seq=3 ttl=64 time=0.050 ms 64 bytes from 172.26.133.160: icmp_seq=4 ttl=64 time=0.056 ms --- 172.26.133.160 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3069ms rtt min/avg/max/mdev = 0.030/0.046/0.056/0.012 ms
Después de eso, ejecuta kubeadmin. Asegúrese de incluir la línea --skip-preflight-cheques. Kubeadmin busca por defecto el docker y sin saltear las comprobaciones fallará con un error.
kubeadm init --config=kubeadm-init.yaml --skip-preflight-checks
Después de que kubeadm haya funcionado, guarde la línea generada. Será necesario ingresar nodos de trabajo en el clúster.
kubeadm join 172.26.133.160:6443 --token XXXXXXXXXXXXXXXXXXXXXXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
A continuación, indique dónde se almacena el archivo admin.conf
Si trabajamos como root entonces:
vim ~/.bashrc export KUBECONFIG=/etc/kubernetes/admin.conf source ~/.bashrc
Para un usuario simple, siga las instrucciones en pantalla.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Agregue 2 asistentes más al clúster. Para hacer esto, copie los certificados de kube-master01 a kube-master02 y kube-master03 al directorio / etc / kubernetes /. Para hacer esto, configuré el acceso ssh para root, y después de copiar los archivos, devolví la configuración.
scp -r /etc/kubernetes/pki 172.26.133.162:/etc/kubernetes/ scp -r /etc/kubernetes/pki 172.26.133.163:/etc/kubernetes/
Después de copiar a kube-master02 y kube-master03, ejecute.
kubeadm init --config=kubeadm-init.yaml --skip-preflight-checks
Instalar franela CIDR
en kube-master01 ejecutar
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
La versión actual de flanel se puede encontrar en la documentación de kubernetes .
Esperamos hasta que se creen todos los contenedores.
watch -n1 kubectl get pods --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE kube-system kube-apiserver-kube-master01 1/1 Running 0 17m 172.26.133.161 kube-master01 kube-system kube-apiserver-kube-master02 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-apiserver-kube-master03 1/1 Running 0 6m 172.26.133.163 kube-master03 kube-system kube-controller-manager-kube-master01 1/1 Running 0 17m 172.26.133.161 kube-master01 kube-system kube-controller-manager-kube-master02 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-controller-manager-kube-master03 1/1 Running 0 6m 172.26.133.163 kube-master03 kube-system kube-dns-86f4d74b45-8c24s 3/3 Running 0 17m 10.244.2.2 kube-master03 kube-system kube-flannel-ds-4h4w7 1/1 Running 0 2m 172.26.133.163 kube-master03 kube-system kube-flannel-ds-kf5mj 1/1 Running 0 2m 172.26.133.162 kube-master02 kube-system kube-flannel-ds-q6k4z 1/1 Running 0 2m 172.26.133.161 kube-master01 kube-system kube-proxy-9cjtp 1/1 Running 0 6m 172.26.133.163 kube-master03 kube-system kube-proxy-9sqk2 1/1 Running 0 17m 172.26.133.161 kube-master01 kube-system kube-proxy-jg2pt 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-scheduler-kube-master01 1/1 Running 0 18m 172.26.133.161 kube-master01 kube-system kube-scheduler-kube-master02 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-scheduler-kube-master03 1/1 Running 0 6m 172.26.133.163 kube-master03
Hacemos replicación de kube-dns a los tres maestros
En kube-master01 ejecutar
kubectl scale --replicas=3 -n kube-system deployment/kube-dns
Instalar y configurar nginx
En cada nodo maestro, instale nginx como equilibrador para la API de Kubernetes
Tengo todas las máquinas de clúster en Debian. De los paquetes nginx, el módulo de transmisión no es compatible, por lo tanto, agregue los repositorios nginx e instálelo desde los repositorios nginx`a. Si tiene un sistema operativo diferente, consulte la documentación de nginx .
wget https://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.key echo -e "\n#nginx\n\ deb http://nginx.org/packages/debian/ stretch nginx\n\ deb-src http://nginx.org/packages/debian/ stretch nginx" >> /etc/apt/sources.list apt-get update && apt-get install nginx -y
Crear configuración nginx (si aún no se ha creado)
./create-config.sh
nginx.confusuario nginx;
trabajador_procesos auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
eventos {
trabajador_conecciones 1024;
}
http {
incluir /etc/nginx/mime.types;
default_type application / octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf;
}
transmitir {
apiserver aguas arriba {
servidor 172.26.133.161:6443 peso = 5 max_fails = 3 fail_timeout = 30s;
servidor 172.26.133.162:6443 peso = 5 max_fails = 3 fail_timeout = 30s;
servidor 172.26.133.163:6443 peso = 5 max_fails = 3 fail_timeout = 30s;
} server { listen 16443; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass apiserver; }
}
Verificamos que todo esté bien y aplicamos la configuración
nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful systemctl restart nginx systemctl status nginx ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-06-28 08:48:09 MSK; 22s ago Docs: http://nginx.org/en/docs/ Process: 22132 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 22133 (nginx) Tasks: 2 (limit: 4915) Memory: 1.6M CPU: 7ms CGroup: /system.slice/nginx.service ├─22133 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf └─22134 nginx: worker process
Probar el equilibrador
curl -k https://172.26.133.161:16443 | wc -l % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 233 100 233 0 0 12348 0 --:--:-- --:--:-- --:--:-- 12944
Configure kube-proxy para trabajar con el equilibrador
Después de configurar el equilibrador, edite el puerto en la configuración de kubernetes.
kubectl edit -n kube-system configmap/kube-proxy
Cambie la configuración del servidor a https://172.26.133.160:16443
A continuación, debe configurar kube-proxy para que funcione con el nuevo puerto
kubectl get pods --all-namespaces -o wide | grep proxy kube-system kube-proxy-9cjtp 1/1 Running 1 22h 172.26.133.163 kube-master03 kube-system kube-proxy-9sqk2 1/1 Running 1 22h 172.26.133.161 kube-master01 kube-system kube-proxy-jg2pt 1/1 Running 4 22h 172.26.133.162 kube-
Eliminamos todos los pods, después de la eliminación, se recrean automáticamente con la nueva configuración
kubectl delete pod -n kube-system kube-proxy-XXX ```bash . ```bash kubectl get pods --all-namespaces -o wide | grep proxy kube-system kube-proxy-hqrsw 1/1 Running 0 33s 172.26.133.161 kube-master01 kube-system kube-proxy-kzvw5 1/1 Running 0 47s 172.26.133.163 kube-master03 kube-system kube-proxy-zzkz5 1/1 Running 0 7s 172.26.133.162 kube-master02
Agregar nodos de trabajo al clúster
En cada nota raíz, ejecute el comando generado por kubeadm
kubeadm join 172.26.133.160:6443 --token XXXXXXXXXXXXXXXXXXXXXXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --cri-socket /run/containerd/containerd.sock --skip-preflight-checks
Si la línea está "perdida", entonces necesita generar una nueva
kubeadm token generate kubeadm token create <generated-token> --print-join-command --ttl=0
En nodos de trabajo en los archivos /etc/kubernetes/bootstrap-kubelet.conf y /etc/kubernetes/kubelet.conf
valor variable del servidor a nuestro virtip
vim /etc/kubernetes/bootstrap-kubelet.conf server: https://172.26.133.60:16443 vim /etc/kubernetes/kubelet.conf server: https://172.26.133.60:16443
Y reiniciar containerd y kubernetes
systemctl restart containerd kubelet
Instalación del tablero de instrumentos
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
Cree un usuario con privilegios de administrador:
kubectl apply -f kube-dashboard/dashboard-adminUser.yaml
Obtenemos el token de entrada:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Configuración del acceso al tablero a través de NodePort en VIRTIP
kubectl -n kube-system edit service kubernetes-dashboard
Reemplazamos el valor de tipo: ClusterIP con tipo: NodePort y en la sección del puerto: agregue el valor de nodePort: 30000 (o el puerto en el rango de 30000 a 32000 en el que desea que el panel sea accesible):

El panel ahora está disponible en https: // VIRTIP: 30000
Heapster
A continuación, instale Heapster, una herramienta para obtener métricas de componentes del clúster.
Instalación:
git clone https://github.com/kubernetes/heapster.git cd heapster kubectl create -f deploy/kube-config/influxdb/ kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml
Conclusiones
No noté ningún problema especial al trabajar con containerd. Una vez que hubo una falla incomprensible con un hogar después de que se eliminó el despliegue. Kubernetes creía que under se eliminó, pero under se convirtió en un "zombie" tan peculiar. Permaneció para existir en el nodo, pero en el estado extendido.
Creo que Containerd está más orientado como un tiempo de ejecución de contenedor para kubernetes. Lo más probable es que, en el futuro, como un entorno para lanzar microservicios en Kubernetes, sea posible y necesario utilizar diferentes entornos que estén orientados a diferentes tareas, proyectos, etc.
El proyecto se está desarrollando muy rápido. Alibaba Cloud ha comenzado a utilizar activamente conatinerd y enfatiza que es el entorno ideal para ejecutar contenedores.
Según los desarrolladores, la integración de containerd en la plataforma en la nube de Google Kubernetes ahora es equivalente a la integración de Docker.
Un buen ejemplo de la utilidad de consola crictl . También daré algunos ejemplos del clúster creado:
kubectl describe nodes | grep "Container Runtime Version:"

Docker CLI carece de los conceptos básicos de Kubernetes, como pod y espacio de nombres, mientras que crictl admite estos conceptos
crictl pods

Y si es necesario, podemos ver los contenedores en el formato habitual, como docker
crictl ps

Podemos ver las imágenes que están en el nodo
crictl images

Al final resultó que, la vida sin docker` es :)
Es demasiado pronto para hablar de errores y fallas, el clúster ha estado trabajando con nosotros durante aproximadamente una semana. En un futuro próximo, la prueba se transferirá a ella y, en caso de éxito, lo más probable es que el desarrollador se encuentre en uno de los proyectos. Existe una idea sobre esto para escribir una serie de artículos que cubran los procesos de DevOps, tales como: crear un clúster, configurar un controlador de ingreso y moverlo a nodos de clúster separados, automatizar el ensamblaje de imágenes, verificar las vulnerabilidades, la implementación, etc. Mientras tanto, analizaremos la estabilidad del trabajo, buscaremos errores y desarrollaremos nuevos productos.
Además, este manual es adecuado para implementar un clúster de conmutación por error con Docker, solo necesita instalar Docker de acuerdo con las instrucciones de la documentación oficial de Kubernetes y omitir los pasos para instalar containerd y configurar la configuración de kubeadm.
O puede colocar contenedores y acopladores simultáneamente en el mismo host y, como aseguran los desarrolladores, funcionarán perfectamente juntos. Containerd es el entorno de lanzamiento de konbernetes containerer, y docker es como docker)))

El repositorio de contenedores tiene un
libro de
jugadas ansible para configurar un clúster de asistente único. Pero fue más interesante para mí "elevar" el sistema con mis manos para comprender con más detalle la configuración de cada componente y entender cómo funciona en la práctica.
Quizás algún día mis manos lleguen, y escribiré mi libro de jugadas para implementar un clúster con HA, ya que en los últimos seis meses he implementado más de una docena de ellas y probablemente sea hora de automatizar el proceso.
Además, mientras escribía este artículo, se lanzó la versión kubernetes 1.11. Puede leer sobre los principales cambios en el blog de Flant o en el blog oficial de kubernetes . Actualizamos los clústeres de prueba a la versión 1.11 y reemplazamos kube-dns con CoreDNS. Además, incluimos la función DynamicKubeletConfig para probar las capacidades de actualización dinámica de configuraciones.
Materiales utilizados
Gracias por leer hasta el final.
Dado que la información sobre kubernetes, especialmente sobre los clústeres que operan en condiciones reales, es muy escasa en RuNet, las indicaciones de inexactitudes son bienvenidas, al igual que los comentarios sobre el esquema general de implementación de clústeres. Intentaré tenerlos en cuenta y hacer las correcciones adecuadas. Y siempre estoy listo para responder preguntas en los comentarios, en githab y en cualquier red social indicada en mi perfil.
Sinceramente, Eugene.