Agrupación automatizada de microservicios entre hosts

Comunicación entre contenedores

modo puente (puente)

modo anfitrión (anfitrión)

red personalizada

modo contenedor

Modo ninguno // ninguna tarjeta de red no puede comunicarse

Comunicación entre hosts

En el entorno de red predeterminado de Docker, los contenedores de Docker en un solo host pueden comunicarse directamente a través del puente docker0, mientras que los contenedores de Docker en diferentes hosts solo pueden comunicarse a través de la asignación de puertos en el host.

Este método de mapeo de puertos es extremadamente inconveniente para muchas aplicaciones de clúster.

Si los contenedores Docker pueden comunicarse directamente usando sus propias direcciones IP, se resolverán muchos problemas.

De acuerdo con el principio de realización, se puede dividir en modo de enrutamiento directo, modo de puente (como tuberías), modo de túnel superpuesto (como franela, ovs+gre), etc.

enrutamiento directo

Franela

Flannel es esencialmente una red superpuesta, es decir, una red (red de capa de aplicación) que se ejecuta en una red. No se basa en las direcciones IP para transmitir mensajes, sino que utiliza un mecanismo de mapeo para hacer que las direcciones IP y los identificadores se asignen a la ubicación de los recursos.

Es decir, envolver los datos TCP en otro paquete de red para enrutar el reenvío y la comunicación.Actualmente, se admiten métodos de reenvío de datos como UDP, VxLAN, AWS VPC y enrutamiento GCE.

La comunicación entre hosts del contenedor implementado por Flannel se realiza a través del siguiente proceso:
 

1.每个主机上安装并运行etcd和flannel;

2.在etcd中规划配置所有主机的docker0子网范围;

3.每个主机上的flannel根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入 etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;

4.当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);

5.将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;

6.由于目的IP是宿主机IP,因此路由是可达的;

7.VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

Características de la franela

1. Haga que los contenedores de Docker creados por diferentes hosts de nodo en el clúster tengan direcciones IP virtuales únicas para todo el clúster.

2. Establezca una red superpuesta a través de la cual los paquetes de datos se entreguen intactos al contenedor de destino. Una red superpuesta es una red virtual construida sobre otra red y respaldada por su infraestructura. Una red superpuesta desacopla los servicios de red de la infraestructura subyacente al encapsular un paquete dentro de otro. Después de reenviar el paquete encapsulado al punto final, se desencapsula.

3. Cree una nueva tarjeta de red virtual flannel0 para recibir los datos del docker bridge y empaquete y reenvíe los datos recibidos manteniendo la tabla de enrutamiento (vxlan).

4. etcd asegura que la configuración vista por flanned en todos los nodos sea consistente. Al mismo tiempo, flanned en cada nodo monitorea los cambios de datos en etcd y percibe los cambios en los nodos del clúster en tiempo real.

Construcción del entorno

        el anfitrión         ip (cambie según su propia máquina)         Requisitos medioambientales
CentOS 7 64          192.168.79.140 etcd, ventana acoplable, franela
mmf         192.168.79.141        etcd, ventana acoplable, franela

Instalación y configuración de Docker

instalación de etcd y construcción de clústeres

Problema con la versión de ETCD

En la versión ETCD3.4, ETCDCTL_API=3 y etcd --enable-v2=false se convirtieron en la configuración predeterminada

La operación de franela etcd usa la API v2, mientras que la operación de kubernetes etcd usa la API v3

Para que sea compatible con flannel, la versión v2 estará habilitada por defecto, por lo que también se debe establecer el archivo de configuración:

vi /etc/perfil

 

export ETCDCTL_API=2 # Especifique la versión del comando etcdctl como v2

 

Actualizar el entorno del sistema

fuente /etc/perfil

etcdctl2 y etcdctl3 son incompatibles, y los parámetros api de los dos también son diferentes. Lo más importante es que "los datos v2/v3 no son interoperables"

como usar api 2

ETCDCTL_API=2 etcdctl establecer valor clave

ETCDCTL_API=2 etcdctlls /

ETCDCTL_API=2 etcdctl del / --prefijo

como usar api 3

ETCDCTL_API=3 etcdctl poner valor de clave

ETCDCTL_API=3 etcdctl obtener /

ETCDCTL_API=3 etcdctl del / --prefijo

Guardar información de red en etcd

Use la versión v2 del comando set (en lugar de put) para guardar la información de la red de cobertura de franela en etcd

ETCDCTL_API=2 etcdctl \
--endpoints "http://192.168.79.140:2379,http://192.168.79.141:2379" \
set /coreos.com/network/config \
'{"Red":"10.0.0.0 /16","SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0","Backend": {"Tipo": "vxlan"}}'

Red : se utiliza para especificar el conjunto de direcciones de Flannel, toda la red de superposición (superposición) es el segmento de red 10.0.0.0/16.

SubnetLen : se usa para especificar la longitud de la máscara de subred del segmento IP asignado a docker0 de un solo host, y el valor predeterminado también es 24 SubnetMin : se usa para especificar el segmento IP más pequeño que se puede asignar

SudbnetMax : se utiliza para especificar el segmento máximo de ip que se puede asignar. En el ejemplo anterior, significa que cada host puede asignar una subred con una longitud de máscara de 24 bits. La subred que se puede asignar es de 10.0.1.0/24 a 10.0.20.0 /24, lo que significa que en este segmento de red solo puede haber hasta 20 hosts

Backend : se utiliza para especificar cómo se reenvían los paquetes de datos. El valor predeterminado es el modo udp, y aquí se usa el modo vxlan. Porque el rendimiento de vxlan es relativamente mejor que el preestablecido udp

La clave predeterminada utilizada por flannel para acceder a etcd es: /coreos.com/network, que puede modificarse, pero el parámetro etcd-prefix de flanneld.conf debe reconfigurarse, por ejemplo -etcd-prefix=/zking.com/network

instalación y configuración de franela

Descargue o cargue el paquete de instalación de franela

 

Crear directorio de instalación de franela

mkdir -p /opt/franela

Descomprimir en el directorio de instalación

tar xzf franela-v0.11.0-linux-amd64.tar.gz -C /opt/franela

Ver archivos descomprimidos

cd /opt/franela && ls

flanneld es el archivo de ejecución principal

El script sh se usa para generar parámetros de inicio de Docker.

Cree un servicio systemd para flannel para el inicio en segundo plano

vim /etc/systemd/system/flanneld.servicio

 

Presiona i para editar

[Unidad]
Descripción=Flanneld
After=network.target
After=network-online.target
Wants=network-online.target
## 1. El servicio flannel debe iniciarse antes de Docker y luego iniciarse después de etcd.
After=etcd.service
Antes = docker.servicio


[Servicio]
Usuario=raíz
##2.ExecStart es la ubicación del programa de inicio flanneld
##3.--el parámetro etcd-endpoints es la dirección del cliente del clúster ectd
##4.--el parámetro iface es la dirección IP de la tarjeta de red para estar vinculado, o el nombre de la tarjeta de red (obtenido por ifconfig), modifique
ExecStart=/opt/flannel/flanneld \
--etcd-endpoints=http://192.168.79.140:2379,http://192.168.79.141:2379 \
- -etcd-prefix=/coreos.com/network \
--iface=ens33 \
--ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Instalar]
WantedBy=multi-user.target

systemctl demonio-recargar && systemctl reiniciar flanneld

Verificar red de franela

ifconfig

 

  

 

Si ve que la dirección de la tarjeta de red flannel.1 es la misma que la dirección almacenada en etcd, la configuración de la red flannel está completa

configuración de la ventana acoplable

Instale Docker en cada nodo y luego cambie los parámetros de inicio de Docker para que pueda usar franela para la asignación de IP y la comunicación de red.

Ver los parámetros de red asignados por flannel (después de que flannel se ejecute, se generará un archivo de variables de entorno que contiene los parámetros relevantes para que el host actual utilice la comunicación flannel)

gato /ejecutar/franela/subred.env

 

Cree parámetros de ejecución de Docker (utilice el script proporcionado por flannel para transcribir subnet.env en parámetros de inicio de Docker)

/opt/flannel/mk-docker-opts.sh -d /run/flannel/docker_opts.env -c

 

Los parámetros de inicio creados se encuentran en el archivo /run/flannel/docker_opts.env, que se puede ver con el comando cat.

gato /ejecutar/franela/docker_opts.env

Modificar los parámetros de inicio de Docker

vim /lib/systemd/system/docker.servicio

 

Lo siguiente es donde se debe modificar docker.service

Nodo [Servicio]

Especifique la ubicación del archivo donde se encuentran los parámetros de inicio (esta configuración es nueva) EnvironmentFile=/run/flannel/docker_opts.env

Agregue $DOCKER_OPTS después del ExecStart original

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock antes de la modificación

Después de la modificación ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS

 

Vuelva a cargar la configuración de systemd y reinicie Docker

systemctl daemon-reload && systemctl reiniciar ventana acoplable && systemctl estado ventana acoplable

Comprobar si la aplicación es exitosa

ifconfig

 

Observe que la dirección IP de la tarjeta de red de docker0 ya está en el segmento de red de la tarjeta de red de franela

franela de prueba

Descargue la imagen de centos, porque se instalaron otros software y comandos en esta imagen

docker run -it --name=centos centos bash

Nota: esto no es un error porque no especifiqué el número de puerto, por lo que la descarga es la última versión 

Ver la IP de red flannel.1 del contenedor en el clúster a su vez

gato /etc/hosts

ventana acoplable inspeccionar puente

De diferentes contenedores de host a otros contenedores de host

hacer ping -c3 192.168.79.143

 

hacer ping -c3 10.0.14.3

Resuelva el problema de que los contenedores debajo de la franela no pueden comunicarse entre hosts

Después de la prueba, se encontró que era un problema con el firewall. Después de cerrar el firewall, el problema se resolvió, pero el firewall como servicio no se puede cerrar. Cómo solucionarlo. Esto se debe a que Linux también tiene las iptables subyacentes, así que ejecútelas en el nodo por separado:

iptables -P ENTRADA ACEPTAR

iptables -P ADELANTE ACEPTAR

iptables -F

iptables -L -n

 

Supongo que te gusta

Origin blog.csdn.net/m0_60375943/article/details/123231620
Recomendado
Clasificación