1. Kubernetes
La palabra Kubernetes se deriva del griego y significa "timonel" o "piloto".
Kubernetes, también conocido como K8S, donde 8 son los 8 caracteres que representan el medio "ubernete", es un motor de orquestación de contenedores de código abierto de Google en 2014, como el componente más importante de CNCF (Cloud Native Computing Foundation; Cloud Native Computing Foundation) uno
Kubernetes se utiliza para automatizar la implementación, la planificación, la expansión y la gestión de aplicaciones en contenedores. Agrupa los contenedores que componen la aplicación en unidades lógicas para facilitar la gestión y el descubrimiento, y se utiliza para gestionar aplicaciones en contenedores en múltiples hosts en la plataforma de la nube. .
El objetivo de Kubernetes es hacer que la implementación de aplicaciones en contenedores sea simple y eficiente, y muchos detalles no requieren personal de operación y mantenimiento para realizar configuraciones y procesamientos manuales complejos.
Sitio web oficial de KubernetesKubernetes
Dirección de GitHub:
GitHub - kubernetes/kubernetes: Programación y gestión de contenedores de nivel de producción
Documentación china de Kubernetes:
¿Qué es Kubernetes? |Kubernetes
Kubernetes se desarrolla utilizando el lenguaje Go (el lenguaje Go es un lenguaje de programación de código abierto lanzado por Google en 2009)
2. Arquitectura de Kubernetes
(1) Maestro
nodo de control de clúster k8s, programa y administra el clúster y acepta solicitudes de usuarios fuera del clúster para operar el clúster
Master Node consta de API Server, Scheduler, ClusterState Store (base de datos ETCD) y Controller MangerServer
1. API de clúster: kube-apiserver
kube-apiserver proporciona el único acceso a las operaciones de recursos y proporciona autenticación, autorización, control de acceso, registro de API y mecanismos de descubrimiento.
Cuando necesita interactuar con un clúster de Kubernetes, pasa por la API. La API de Kubernetes es una interfaz para el plano de control de Kubernetes para manejar solicitudes internas y externas. El servidor API determina si la solicitud es válida y, de ser así, la procesa. Los usuarios acceden a la API a través de llamadas REST, la interfaz de línea de comandos de kubectl u otras herramientas de línea de comandos como kubeadm.
2. Programación de clústeres: kube-scheduler
kube-scheduler es responsable de la programación de recursos y programa los pods en las máquinas correspondientes de acuerdo con las políticas de programación predeterminadas.
El programador tiene en cuenta los requisitos de recursos del pod (como CPU o memoria), así como el estado del clúster. Luego programa los pods en los nodos de cómputo apropiados.
3. Controlador de clúster: kube-controller-manager
kube-controller-manager es responsable de mantener el estado del clúster, como la detección de fallas, la expansión automática, la actualización continua, etc.
El controlador es responsable de ejecutar realmente el clúster, y el administrador del controlador de Kubernetes es la función de múltiples controladores en uno. El controlador se utiliza para consultar al programador y asegurarse de que se esté ejecutando la cantidad correcta de pods. Si una cápsula se cae, otro controlador se da cuenta y responde. Los controladores conectan los servicios a los pods para que las solicitudes vayan al punto final correcto. También hay controladores para crear cuentas y tokens de acceso a la API.
4. Base de datos de almacenamiento de valores clave: etcd
etcd guarda el estado de todo el clúster
Los datos de configuración de la aplicación y la información sobre el estado del clúster se encuentran en etcd (base de datos kv). etcd es un diseño distribuido tolerante a fallas y se considera la última fuente de verdad para el clúster
(2) Nodos
Nodos de trabajo en clúster, ejecutando contenedores de aplicaciones empresariales de usuario
Los nodos de nodos también se denominan nodos de trabajo, incluidos kubelet, kube proxy y Pod (Tiempo de ejecución del contenedor)
1, vaina
Pod es la unidad más pequeña y sencilla del modelo de objetos de Kubernetes
Representa una única instancia de la aplicación. Cada Pod consta de un contenedor (o una serie de contenedores estrechamente acoplados) y varias opciones que controlan cómo se ejecuta el contenedor. Los pods pueden conectarse al almacenamiento persistente para ejecutar aplicaciones con estado
2, motor de tiempo de ejecución del contenedor
El tiempo de ejecución del contenedor es responsable de la gestión de imágenes y la operación real de Pods y contenedores (CRI)
Para ejecutar contenedores, cada nodo tiene un motor de ejecución de contenedores. Como Docker, pero Kubernetes también es compatible con otros contenedores compatibles con Open Container Initiative (OCI), como rkt y CRI-O. Kubernetes es compatible con la mayoría de los demás contenedores que implementan la interfaz CRI
3, kubelet
Kubelet se encarga de mantener el ciclo de vida del contenedor, y también se encarga de la gestión de Volumen (CVI) y red (CNI)
Cada nodo de cálculo contiene un kubelet, una pequeña aplicación que se comunica con el plano de control. Un kublet garantiza que los contenedores se ejecuten dentro de un Pod. Cuando el Plano de Control necesite realizar una operación en el nodo, el kubelet realizará la operación
4, ser un representante
kube-proxy es responsable de proporcionar detección de servicios y balanceo de carga dentro del clúster para Service
Cada nodo de cómputo también contiene kube-proxy, un proxy de red para optimizar los servicios de red de Kubernetes. kube-proxy es responsable de manejar la comunicación de la red dentro o fuera del clúster (dependiendo de la capa de filtrado de paquetes del sistema operativo o reenviando el tráfico por sí mismo)
3. Kubeadm implementa Kubernetes
(1) Cómo construir el entorno de Kubernetes
1, minicubo
Minikube es una herramienta que puede ejecutar Kubernetes localmente Minikube puede ejecutar un clúster de Kubernetes de un solo nodo en computadoras personales (incluidas las PC con Windows, macOS y Linux) para que pueda probar Kubernetes o realizar el trabajo de desarrollo diario.
2 tipo
Una herramienta similar a Kind y minikube que le permite ejecutar Kubernetes en su computadora local.Esta herramienta requiere que Docker esté instalado y configurado.
3, administrador de Kube
Kubeadm es una herramienta de implementación de K8s que proporciona dos comandos de operación, kubeadm init y kubeadm join, para implementar rápidamente un clúster de Kubernetes;
Dirección oficial:
Instalación de kubeadm | Kubernetes
4. Paquete binario
Descargue el paquete binario de la versión de lanzamiento de Github, implemente e instale manualmente cada componente y forme un clúster de Kubernetes. Los pasos son engorrosos, pero puede tener una comprensión más clara de cada componente.
5. ñam instalación
Instale cada componente de Kubernetes a través de yum para formar un clúster de Kubernetes, pero la versión k8s en la fuente de yum es relativamente antigua, por lo que este método se usa menos.
6. Herramientas de terceros
Algunos maestros han encapsulado algunas herramientas y usan estas herramientas para instalar el entorno k8s;
7. Gastar dinero para comprar
Compra directa de plataforma de nube pública k8s como Alibaba Cloud
(2) Kubeadm implementa Kubernetes
kubeadm es una herramienta lanzada por la comunidad oficial para el despliegue rápido de clústeres de kubernetes.Esta herramienta puede completar el despliegue de un clúster de kubernetes con dos instrucciones.
1. Cree un nodo maestro: kubeadm init
2. Agregue el nodo Nodo al clúster maestro: kubeadm join <IP y puerto del nodo maestro>
(3) Requisitos del entorno de implementación de Kubernetes
(1) Una o más máquinas, sistema operativo CentOS 7.x-86_x64
(2) Configuración de hardware: Memoria 2GB o 2G+, CPU 2 núcleos o CPU 2 núcleos+
(3) Cada máquina en el clúster puede comunicarse entre sí
(4) Deshabilitar la partición de intercambio
(5) Cada máquina en el clúster puede acceder a la red externa y necesita extraer la imagen
Si el entorno no cumple con los requisitos, se informará un error de la siguiente manera
(4) Preparación del entorno de implementación de Kubernetes
1. Apague el cortafuegos
systemctl stop firewalld
systemctl disable firewalld
2. Cerrar selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
setenforce 0 #临时
3. Desactive el intercambio (k8s prohíbe la memoria virtual para mejorar el rendimiento)
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapoff -a #临时
4. Agregue hosts al maestro
cat >> /etc/hosts << EOF
192.168.132.129 k8smaster
192.168.132.130 k8snode
EOF
5. Establecer los parámetros del puente
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system #生效
6. Tiempo de sincronización
yum install ntpdate -y #如果没有ntpdate命令先安装
ntpdate time.windows.com
(5) Pasos específicos de instalación de Kubernetes
1. Instalar ventana acoplable
Instale Docker/kubeadm/kubelet/kubectl en todos los nodos del servidor
El entorno operativo de contenedor predeterminado de Kubernetes es Docker, por lo que primero debe instalar Docker
Podemos instalar la versión especificada de Docker de la siguiente manera
//更新docker的yum源
yum install wget -y
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
//安装指定版本的docker:
yum install docker-ce-20.10.0 -y
Para la instalación y desinstalación, consulte la documentación más reciente en el sitio web oficial
Instalar Docker Engine en CentOS | Documentación acoplable
Notas de la versión de Docker
Notas de la versión del motor Docker | Documentación acoplable
Configurar acelerador para acelerar las descargas
/etc/docker/daemon.json Si este archivo no existe, créelo primero
{
# 阿里云镜像加速器;可自己注册复制过来
"registry-mirrors": ["https://registry.docker-cn.com"]
}
implementar
systemctl enable docker.service
Compilación: kubeadm, kubelet, kubectl
kubelet :
Se ejecuta en todos los nodos del clúster y es responsable de iniciar POD y contenedores
Kubeadm:
Una herramienta para inicializar el clúster.
kubectl:
kubectl es una herramienta de línea de comandos de kubenetes, a través de la cual kubectl puede implementar y administrar aplicaciones, ver varios recursos, crear, eliminar y actualizar componentes
2. Agregue la fuente Alibaba Cloud YUM de k8s
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
3. Instale kubeadm, kubelet y kubectl
La versión de Kubernetes es la siguiente
Versión del parche | Kubernetes
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
Compruebe si está instalado:
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl
Compruebe la versión instalada:
kubeadm version
kubectl version --client
kubelet --version
Ejecutar después de la instalación
systemctl enable kubelet.service
Reiniciar CentOS: reiniciar
Comando de reinicio de Linux centos:
1. Reiniciar reinicio normal
2. Apagar -r ahora reiniciar inmediatamente (usado por el usuario raíz)
3. shutdown -r 10 se reinicia automáticamente después de 10 minutos (utilizado por el usuario root)
4. shutdown -r 10:30 reinicio a las 10:30 (usuario root)
4. Implemente el nodo principal de Kubernetes Master
(2) Ejecutar en la máquina maestra
kubeadm init
--apiserver-advertise-address=192.168.133.129
--control-plane-endpoint=master
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.19.4
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
Descripción de parámetros:
--apiserver-advertise-address Dirección de anuncio de clúster, ID de nodo principal
--control-plane-endpoint nombre de host del nodo principal
--image-repository Debido a que no se puede acceder a la dirección de imagen de extracción predeterminada k8s.gcr.io en China, especifique aquí la dirección del repositorio de imágenes de Alibaba Cloud
--kubernetes-version Versión K8s, consistente con la instalada arriba
--red virtual interna del clúster service-cidr, entrada de acceso unificado de pod
--pod-network-cidr Pod network, mantenga lo mismo que el componente de red CNI yaml implementado a continuación
Nota:
La selección de service-cidr no puede superponerse o entrar en conflicto con PodCIDR y la red local. Generalmente, puede elegir un segmento de dirección de red privada que no sea utilizado por la red local y PodCIDR. Por ejemplo, si PODCIDR usa 10.244.0.0/16, entonces el servicio cidr se puede seleccionar 10.96.0.0/12, la red no se superpone ni entra en conflicto
error de ejecución
Reinicie centos y luego ejecute el comando kubeadm init anterior
Después de probarlo, reiniciar centos seguirá reportando el mismo error y verifique cuidadosamente: "kube-apiserver.yaml, kube-controller-manager.yaml, kube-scheduler.yaml, etcd.yaml" estos archivos yaml ya existen, siempre y cuando Solo reinícialo
kubeadm reset
mv /etc/containerd/config.toml /tmp/
systemctl restart containerd
Luego, vuelva a ingresar el comando kubeadm init anterior, obtendrá el siguiente resultado, pegue el último párrafo
kubeadm join IP:PORT --token XX \
--discovery-token-ca-cert-hash sha256:XX
Copia de seguridad (para agregar un nuevo nodo al clúster, el comando ejecutado es el comando kubeadm join generado por kubeadm init al final)
kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \
--discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104
1 en la figura anterior significa que la inicialización es exitosa
2 indica las operaciones que aún necesita el clúster
3 significa agregar un token de nodo (válido por 24 horas, solo obtenga el token después de que caduque)
readquirir token
kubeadm token create --print-join-command
(2) Ejecutar en la máquina maestra ( configurar variables de entorno )
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
Si encuentra el siguiente error:
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
Debido a que el archivo /etc/sudoers es de solo lectura, entonces sudo chmod 777 /etc/sudoers, el resultado puede modificar este archivo, pero no se puede usar el sudo de todos los usuarios.
Podemos ingresar el comando para modificar los permisos de sudoers:
chmod 0440 /etc/sudoers
reboot
Luego ingrese reiniciar para reiniciar
kubectl obtener nodos
5. Agregue el nodo node al maestro de Kubernetes y ejecútelo en la máquina Node
Para agregar un nuevo nodo al clúster, el comando ejecutado es el último comando de salida kubeadm join de kubeadm init
kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \
--discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104
kubectl obtener nodos
(6) Implementar el complemento de red (máquina de nodo maestro principal en ejecución)
1. Descarga el archivo kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2. Aplique el archivo kube-flannel.yml para obtener el contenedor de tiempo de ejecución
kubectl apply -f kube-flannel.yml
3. Ver el estado del nodo: kubectl get nodes
No estará listo inmediatamente, el nodo tardará un tiempo en estarlo
Comprobar el estado para el éxito
kubectl get cs
kubectl cluster-info
Ver el pod del contenedor de tiempo de ejecución (se están ejecutando varios contenedores docker en un pod)
kubectl get pods -n kube-system
¡En este punto, nuestro entorno k8s está configurado correctamente! ! !
4. Kubernetes implementa "aplicaciones en contenedores" ( prueba de clústeres de kubernetes )
Cree un pod en el clúster y verifique que se esté ejecutando normalmente
1. Implementar un Nginx en el clúster de Kubernetes
1. Tire de un espejo nginx en Internet
kubectl create deployment nginx --image=nginx
2. Exponer un puerto 80 al mundo exterior
kubectl expose deployment nginx --port=80 --type=NodePort
3. Verifique el puerto externo
kubectl get pod,svc
4. Dirección de acceso: http://IPNodo:Puerto
2. Implemente un Tomcat en el clúster de Kubernetes
kubectl create deployment tomcat --image=tomcat
kubectl expose deployment tomcat --port=8080 --type=NodePort
kubectl get pod,svc
Dirección de acceso: http://IPNodo:Puerto