Construcción del entorno de clúster Docker Swarm y despliegue de servicios flexible

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/hostsedite 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 initcree 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 initla 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 managercomando para ver la información del token del nodo administrado.

docker swarm join-token manager
复制代码

 

 

 

 

 

 

  

  Luego se ejecuta en otros nodos docker swarm joiny 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 workercomando para ver el nodo de trabajo de información del token.

 

 

 

  

  Luego se ejecuta en otros nodos docker swarm joiny 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 infopuede ver el clúster actual.

 

 

 

  

Ver nodos del clúster

  

  El administrador que se ejecuta en cualquier nodo docker node lspuede 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 STATUSDescripció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 AVAILABILITYlugar 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 AVAILABILITYlugar 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 lsservicio 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 服务名称|服务IDver 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 服务名称|服务IDejecutar en qué nodos ver el servicio.

 

 

 

  En el nodo correspondiente que ejecuta la tarea docker pspuede 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=ntarea de servicio puede estar funcionando la capacidad escalable es n.

  Por docker service update --replicas n 服务名称|服务IDpuede 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 服务名称|服务IDver 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 服务名称|服务IDver 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 服务名称|服务IDpara 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 ( -feliminació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 ( -feliminació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
 

Supongo que te gusta

Origin blog.csdn.net/qq_46388795/article/details/108664364
Recomendado
Clasificación