Construcción de clústeres
Preparación ambiental
- Cinco máquinas CentOS con Docker instalado, las versiones son:
CentOS 7.8.2003
- Docker Engine 1.12+ (requisito mínimo 1.12, este artículo usa 19.03.12)
- El firewall abre los siguientes puertos o cierra el firewall:
- Puerto TCP 2377, utilizado para la comunicación de gestión de clústeres;
- Puerto 7946 TCP y UDP, utilizado para la comunicación entre nodos;
- Puerto UDP 4789, utilizado para red superpuesta.
Distribución de máquinas
Personaje | IP | HOSTNAME | Versión de Docker |
---|---|---|---|
Gerente | 192.168.10.101 | gerente1 | 19.03.12 |
Gerente | 192.168.10.102 | gerente2 | 19.03.12 |
Gerente | 192.168.10.103 | gerente3 | 19.03.12 |
Trabajador | 192.168.10.10 | trabajador1 | 19.03.12 |
Trabajador | 192.168.10.11 | trabajador2 | 19.03.12 |
- Puede
hostname 主机名
modificar el nombre de host de la máquina (con efecto inmediato, después de la falla de reinicio); - O
hostnamectl set-hostname 主机名
modifique el nombre de host de la máquina (para que surta efecto inmediatamente, también reinicie para que surta efecto); - O
vi /etc/hosts
edite el archivo de hosts, como se muestra a continuación, agregue el nombre de host a 127.0.0.1 (reinicie para que tenga efecto).
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 manager1
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
复制代码
Crea un clúster
En cualquier nodo, docker swarm init
cree un nuevo comando y agregue el clúster Swarm, y el nodo se convertirá en el Administrador de nodo predeterminado. De acuerdo con nuestro rol predefinido, ejecute este comando en cualquier máquina de 101 a 103.
Por lo general, el primer nodo de administración en unirse al clúster será Leader
, y todos los nodos de administración que se unan más tarde lo serán Reachable
. Si el líder actual muere, todos los alcanzables volverán a elegir a un nuevo líder.
[root@localhost ~]# docker swarm init --advertise-addr 192.168.10.101
Swarm initialized: current node (clumstpieg0qzzxt1caeazg8g) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5ob7jlej85qsygxubqypjuftiwruvew8e2cr4u3iuo4thxyrhg-3hbf2u3i1iagurdprl3n3yra1 192.168.10.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
复制代码
Únete al clúster
El modo de clúster integrado en Docker viene con un sistema de infraestructura de clave pública (PKI), que facilita la implementación de contenedores de forma segura. Los nodos del clúster utilizan Transport Layer Security (TLS) para autenticar, autorizar y cifrar las comunicaciones con otros nodos del clúster.
De forma predeterminada, mediante docker swarm init
la creación de un nuevo comando de clúster Swarm, el nodo Administrador genera una nueva autoridad de certificación (CA) raíz y un par de claves para la comunicación entre la protección de seguridad y otros nodos para unirse al clúster.
El nodo de administrador generará dos tokens para que otros nodos los utilicen al unirse al clúster: un token de trabajador y un token de administrador. Cada token incluye un resumen del certificado de CA raíz y una clave generada al azar. Cuando un nodo se une al clúster, el nodo de unión utiliza el resumen para verificar el certificado de CA raíz desde el nodo de administración remota. El nodo de gestión remota utiliza la clave para garantizar que el nodo de unión sea un nodo aprobado.
Gerente
Para agregar nodos al nodo de administración de Cluster Manager, ejecute el docker swarm join-token manager
comando para ver la información del token del nodo administrado.
docker swarm join-token manager
复制代码
Luego se ejecuta en otros nodos docker swarm join
y lleva un token de parámetros Swarm unirse a un clúster, el rol de nodo como Administrador.
Trabajador
A partir de los resultados que se muestran cuando se crea el clúster, puede saber que para agregar un nodo Trabajador a este clúster, ejecute el comando en la figura siguiente. O el nodo de administración ejecuta el docker swarm join-token worker
comando para ver el nodo de trabajo de información del token.
Luego se ejecuta en otros nodos docker swarm join
y lleva un token de parámetros Swarm unirse a un clúster, el nodo de rol Trabajador.
Ver información del clúster
Manager se ejecuta en cualquier nodo, docker info
puede ver el clúster actual.
Ver nodos del clúster
El administrador que se ejecuta en cualquier nodo docker node ls
puede ver la información actual del nodo del clúster.
docker node ls
复制代码
*
En nombre del nodo actual, el entorno actual consta de 3 nodos de gestión que constan de 1 maestro, 2 esclavos y 2 nodos de trabajo.
MANAGER STATUS
Descripción de nodo : indica que pertenece el nodo Administrador o Trabajador, no el valor del nodo que pertenece al Trabajador.
Leader
: Este nodo es el nodo maestro en el nodo de gestión, responsable de la gestión del clúster y las decisiones de orquestación del clúster;Reachable
: El nodo es un nodo esclavo en el nodo de gestión. Si el nodo Líder no está disponible, el nodo es elegible para ser seleccionado como el nuevo Líder;Unavailable
: El nodo de gestión ya no puede comunicarse con otros nodos de gestión. Si el nodo de administración no está disponible, se debe agregar un nuevo nodo de administración al clúster o se debe actualizar un nodo de trabajo a un nodo de administración.
Nodo AVAILABILITY
: indica si el planificador puede asignar tareas al nodo.
Active
: El planificador puede asignar tareas al nodo;Pause
: El programador no asignará nuevas tareas al nodo, pero las tareas existentes aún se pueden ejecutar;Drain
: El programador no asignará nuevas tareas al nodo y cerrará todas las tareas existentes del nodo y las programará en los nodos disponibles.
Eliminar nodo
Gerente
Necesidad de eliminar un nodo antes del nodo AVAILABILITY
lugar Drain
. Su propósito es migrar el servicio de este nodo a otros nodos disponibles para garantizar un servicio normal. Es mejor verificar la migración del contenedor para asegurarse de que este paso se haya procesado antes de continuar.
docker node update --availability drain 节点名称|节点ID
复制代码
Luego, degrade el nodo Administrador para que sea un nodo Trabajador.
docker node demote 节点名称|节点ID
复制代码
Luego, ejecute el siguiente comando en el nodo que ha sido degradado a Trabajador para dejar el clúster.
docker swarm leave
复制代码
Finalmente, elimine el nodo que acaba de dejar en el nodo de gestión.
docker node rm 节点名称|节点ID
复制代码
Trabajador
Necesidad de eliminar un nodo antes del nodo AVAILABILITY
lugar Drain
. Su propósito es migrar el servicio de este nodo a otros nodos disponibles para garantizar un servicio normal. Es mejor verificar la migración del contenedor para asegurarse de que este paso se haya procesado antes de continuar.
docker node update --availability drain 节点名称|节点ID
复制代码
Luego, ejecute el siguiente comando en el nodo Trabajador que se eliminará para salir del clúster.
docker swarm leave
复制代码
Finalmente, elimine el nodo que acaba de dejar en el nodo de gestión.
docker node rm 节点名称|节点ID
复制代码
Despliegue de servicios
Nota: Todas las operaciones relacionadas con la gestión del clúster se realizan en el nodo Administrador.
Crear servicio
En el siguiente ejemplo, se crea un servicio llamado mynginx usando nginx mirroring, y el servicio se asignará aleatoriamente a un nodo trabajador para ejecutarlo.
docker service create --replicas 1 --name mynginx -p 80:80 nginx
复制代码
docker service create
: Crear un servicio;--replicas
: Especifique varias instancias de un servicio para ejecutar;--name
:Nombre del Servicio.
Ver servicio
A través del docker service ls
servicio para ver la operación.
[root@manager1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
hepx06k5ik5n mynginx replicated 1/1 nginx:latest *:80->80/tcp
复制代码
Por puede docker service inspect 服务名称|服务ID
ver los detalles del servicio.
[root@manager1 ~]# docker service inspect mynginx
[
{
"ID": "k0dbjg1zzy3l3g71kdwa56ect",
"Version": {
"Index": 127
},
"CreatedAt": "2020-09-16T10:05:55.627974095Z",
"UpdatedAt": "2020-09-16T10:05:55.629507771Z",
"Spec": {
"Name": "mynginx",
"Labels": {},
"TaskTemplate": {
"ContainerSpec": {
"Image": "nginx:latest@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0",
"Init": false,
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"Delay": 5000000000,
"MaxAttempts": 0
},
"Placement": {
"Platforms": [
{
"Architecture": "amd64",
"OS": "linux"
},
{
"OS": "linux"
},
{
"OS": "linux"
},
{
"Architecture": "arm64",
"OS": "linux"
},
{
"Architecture": "386",
"OS": "linux"
},
{
"Architecture": "mips64le",
"OS": "linux"
},
{
"Architecture": "ppc64le",
"OS": "linux"
},
{
"Architecture": "s390x",
"OS": "linux"
}
]
},
"ForceUpdate": 0,
"Runtime": "container"
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"RollbackConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80,
"PublishMode": "ingress"
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80,
"PublishMode": "ingress"
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80,
"PublishMode": "ingress"
}
],
"VirtualIPs": [
{
"NetworkID": "st2xiy7pjzap093wz4w4u6nbs",
"Addr": "10.0.0.15/24"
}
]
}
}
]
复制代码
Puede docker service ps 服务名称|服务ID
ejecutar en qué nodos ver el servicio.
En el nodo correspondiente que ejecuta la tarea docker ps
puede ver la información del servicio correspondiente al contenedor.
Servicio de llamada
A continuación, probamos si se puede acceder al servicio normalmente, y la dirección IP de cualquier nodo del clúster debe poder acceder al servicio.
Resultado de la prueba: las 5 máquinas pueden acceder al servicio normalmente.
Servicio flexible
Una vez que el servicio se implementa en el clúster, la cantidad de contenedores en el servicio se puede expandir y contraer de manera flexible a través de comandos. El contenedor que se ejecuta en el servicio se denomina tarea.
Por la docker service scale 服务名称|服务ID=n
tarea de servicio puede estar funcionando la capacidad escalable es n.
Por docker service update --replicas n 服务名称|服务ID
puede lograr un efecto de reducción de volumen de expansión.
Expanda las tareas ejecutadas por el servicio mynginx a 5:
[root@manager1 ~]# docker service scale mynginx=5
mynginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
复制代码
Al docker service ps 服务名称|服务ID
ver los servicios que se ejecutan en qué nodos.
Tengamos otra ola de operaciones de reducción, el comando es el siguiente:
[root@manager1 ~]# docker service update --replicas 3 mynginx
mynginx
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
复制代码
Al docker service ps 服务名称|服务ID
ver los servicios que se ejecutan en qué nodos.
En el modo de clúster Swarm, el llamado servicio elástico se realiza en un sentido real . La expansión y contracción dinámica se puede realizar mediante una línea de comandos, que es simple, conveniente y potente.
Eliminar servicio
A través de docker service rm 服务名称|服务ID
para eliminar el servicio.
[root@manager1 ~]# docker service rm mynginx
mynginx
[root@manager1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
复制代码
Actualización continua y reversión
El siguiente caso demostrará cómo actualizar la versión de Redis a una versión superior y luego volver a la última operación.
Primero, cree 5 copias del servicio Redis, la versión es 5. Los comandos detallados son los siguientes:
# 创建 5 个副本,每次更新 2 个,更新间隔 10s,20% 任务失败继续执行,超出 20% 执行回滚,每次回滚 2 个
docker service create --replicas 5 --name redis \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-monitor 20s \
--rollback-parallelism 2 \
--rollback-max-failure-ratio 0.2 \
redis:5
复制代码
--update-delay
: Defina el intervalo de tiempo de actualización continua;--update-parallelism
: Defina el número de copias actualizadas en paralelo, el valor predeterminado es 1;--update-failure-action
: Define las acciones realizadas después de que el contenedor no se inicia;--rollback-monitor
: Defina el tiempo de supervisión para la reversión;--rollback-parallelism
: Defina el número de copias que se revertirán en paralelo;--rollback-max-failure-ratio
: Tasa de reversión de falla de la tarea, la operación de reversión se realiza cuando la proporción excede esta proporción, 0.2 significa 20%.
Luego, implemente la actualización continua del servicio a través de los siguientes comandos.
docker service update --image redis:6 redis
复制代码
Revertir el servicio solo puede retroceder al estado de la última operación y no puede retroceder continuamente a la operación especificada.
docker service update --rollback redis
复制代码
Comandos comunes
enjambre de estibadores
mando | Descripción |
---|---|
docker swarm init | Inicializar el clúster |
trabajador de token de unión de enjambre de docker | Ver el token del nodo trabajador |
administrador de token de unión de docker swarm | Ver el token del nodo de gestión |
unirse al enjambre de Docker | Únete al clúster |
nodo acoplable
mando | Descripción |
---|---|
nodo acoplable ls | Ver todos los nodos del clúster |
nodo acoplable ps | Ver todas las tareas del nodo actual |
Docker Nodo rm nombre de nodo | ID de nodo | Eliminar nodo ( -f eliminación obligatoria) |
nodo docker inspeccionar nombre de nodo | ID de nodo | Ver detalles del nodo |
nodo acoplable degradar nombre de nodo | ID de nodo | Degradación de nodo, degradación de nodo de gestión a nodo de trabajo |
nodo docker promover nombre de nodo | ID de nodo | Actualización de nodo, de nodo de trabajo a nodo de gestión |
Nombre de nodo de actualización de nodo de Docker | ID de nodo | Actualizar nodo |
servicio de docker
mando | Descripción |
---|---|
Crear servicio Docker | Crear servicio |
servicio ls docker | Ver todos los servicios |
servicio de Docker inspecciona el nombre del servicio | ID del servicio | Ver detalles del servicio |
el servicio de Docker registra el nombre del servicio | ID del servicio | Ver registro de servicio |
Docker service rm nombre del servicio | ID del servicio | Eliminar servicio ( -f eliminación obligatoria) |
nombre de servicio de escala de servicio de Docker | ID de servicio = n | Establecer la cantidad de servicios |
nombre del servicio de actualización del servicio de Docker | ID del servicio | Servicio de actualización |
Autor: hola
Sr.Ward Enlace: https: //juejin.im/post/6873687528726085640