漫谈容器化技术(swarm篇)

简介: 漫谈容器化技术(swarm篇)

01 引言

在前面的博客,关于容器化技术,我写了相关的博客,有兴趣的同学可以参阅下:

本文主要讲解的是swarm

02 简介

Docker SwarmDocker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与Docker守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

支持的工具包括但不限于以下各项:

  • Dokku
  • Docker Compose
  • Docker Machine
  • Jenkins

03 原理

如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。

  • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
  • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

04 swarm 集群部署

以下内容为实操内容,仅做参考!简单的案例可以参考:https://www.runoob.com/docker/docker-swarm.html

4.1 开启防火墙以及初始化端口

注意:每台机子都要操作!

172.16.3.0这个需要替换为实际机器的网关

ufw allow 22/tcp ;\
ufw allow from 172.16.3.0/24 to any port 4789 proto udp;\
ufw allow from 172.16.3.0/24 to any port 2377 proto tcp;\
ufw allow from 172.16.3.0/24 to any port 15389 proto tcp;\
ufw allow from 172.16.3.0/24 to any port 7946 ;\
ufw enable

4.2 安装docker

4.2.1 添加仓库

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
add-apt-repository "deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

4.2.2 安装docker

注意:每台机子都要操作!

4.2.2.1 安装docker-cli
apt update && apt install docker-ce docker-ce-cli -y
4.2.2.2 按需拷贝cert证书到对应的目录
/etc/docker/daemon.json
/etc/docker/ca.pem
/etc/docker/server-cert.pem
/etc/docker/server-key.pem
4.2.2.3 编辑systemd文件

编辑systemd文件docker.service 并保存:

vim /etc/systemd/system/multi-user.target.wants/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock后追加

-H tcp://0.0.0.0:15389
4.2.2.4 资源限制

执行以下指令确认机器资源:

cat /proc/cpuinfo | grep processor | wc -l ; cat /proc/meminfo | grep MemTotal | awk '{printf "MEM: %.2fG\n",$2/1024/1024 }'

编辑 /etc/systemd/system/docker-limit.slice 文件添加容器资源限制CPUQuota的值设置为cpu线程数*100-25,然后加上半角百分号(MemoryMax的值为内存g数取整-0.5MemoryHigh的值为内存g数取整-1,都以大写半角G结尾)

vim  /etc/systemd/system/docker-limit.slice

添加以下内容

[Unit]
Before=slices.target
[Slice]
CPUAccounting=true
MemoryAccounting=true
CPUQuota=375%
MemoryHigh=14G
MemoryMax=14.5G
[Install]
WantedBy=multi-user.target
4.2.2.5 拷贝文件

拷贝文件并重启服务:

cp /etc/systemd/system/multi-user.target.wants/docker.service /etc/systemd/system/docker.service && systemctl daemon-reload && systemctl enable docker && systemctl restart docker && systemctl enable docker-limit.slice && systemctl start docker-limit.slice
4.2.2.6 查看资源限制是否生效
systemctl status docker-limit.slice

预计返回:

docker-limit.slice
     Loaded: loaded (/etc/systemd/system/docker-limit.slice; enabled; vendor preset: enabled)
     Active: active since Wed 2021-11-03 09:37:07 CST; 2 weeks 1 days ago
      Tasks: 650
     Memory: 4.9G (high: 14.0G max: 14.5G)
        CPU: 1d 9h 5min 47.297s
     CGroup: /docker.slice/docker-limit.slice
             ├─docker-3551bddf43c8d857e777a75623a03adbab7a52a52b0d0440effed70ec4cbe1ac.scope
             │ ├─456640 /bin/sh -c mkdir -p /var/log/nginx/ && chown -R nginx /var/log/nginx/ && sed -i "s/__WORKER_PROCESSES__/${NGINX_WORKER_PROCESSES:-1}/" /etc/nginx/nginx.conf &&sed -i "s/__WORKER_CO>
             │ ├─456726 nginx: master process nginx -g daemon off;
             │ └─456727 nginx: worker process
             ├─docker-47223bd402422f5377b849cdfbb61e67a94b662509df961137de1c785217af61.scope
             │ ├─3601224 /bin/sh -c mkdir -p /app/logs; if [ -d pre-exec-shells ];then for n in `ls pre-exec-shells/`;do bash pre-exec-shells/$n;done;fi;bash pre_exec.sh;mkdir -p /app/logs/${APP_VERSION}->
             │ └─3601313 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -server -Xmx384m -Xms16m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+UnlockExperimentalVMOpt>
             ├─docker-5a28f65f25453c7afe5d05e9151565b846f242a7b42703779d9616315bc2c099.scope
             │ ├─620135 /sbin/tini -- node server/index.js
             │ └─620292 node server/index.js
             ├─docker-65acea9543a5468ead7ae6cb61747aa194bc344a4dab7547b02406469a9bcea5.scope
             │ ├─3651833 /bin/sh -c mkdir -p /app/logs; if [ -d pre-exec-shells ];then for n in `ls pre-exec-shells/`;do bash pre-exec-shells/$n;done;fi;bash pre_exec.sh;mkdir -p /app/logs/${APP_VERSION}->
             │ └─3651926 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -server -Xmx384m -Xms16m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+UnlockExperimentalVMOpt>
             ├─docker-8560bf704d8183fea5eaac8ff60ecc2fd948498bcba999e7121f6909f0032515.scope
             │ ├─325697 /bin/sh -c cd /app && if [ -d pre-exec-shells ];then for n in `ls pre-exec-shells/`;do bash pre-exec-shells/$n;done;fi;npm run start:demonstrate
             │ ├─325782 npm
             │ ├─325832 sh -c cross-env NODE_ENV=demonstrate nuxt start
             │ ├─325833 node /app/node_modules/.bin/cross-env NODE_ENV=demonstrate nuxt start
             │ └─325840 node /app/node_modules/.bin/nuxt start
             ├─docker-8903c4de66d6f6046176f65d2bcafbfc0a54b106e0f89839e3e7f3efe0cbdc91.scope
             │ ├─3537685 /bin/sh -c mkdir -p /app/logs; if [ -d pre-exec-shells ];then for n in `ls pre-exec-shells/`;do bash pre-exec-shells/$n;done;fi;bash pre_exec.sh;mkdir -p /app/logs/${APP_VERSION}->
             │ └─3537807 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -server -Xmx384m -Xms16m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+UnlockExperimentalVMOpt>
             ├─docker-a51f96092c3fa7b61987e1b5a8e1c3c67c3abaae6b4685041e533320f8fa3852.scope
             │ ├─623900 /bin/sh -c /bin/bash -c "cd /app;${CMD_RUNTIME_PREFIX} /app/docker-watchdog ${CMD_RUNTIME_PARAM}"
             │ ├─623952 /bin/bash -c cd /app; /app/docker-watchdog
             │ └─623953 /app/docker-watchdog
             ├─docker-ac512bfea9b13d4ed275609725bee11fa7aad8e14a8b077c4551ec2981b83d63.scope
             │ ├─3543383 /bin/sh -c mkdir -p /var/log/nginx/ && chown -R nginx /var/log/nginx/ && sed -i "s/__WORKER_PROCESSES__/${NGINX_WORKER_PROCESSES:-1}/" /etc/nginx/nginx.conf &&sed -i "s/__WORKER_C>
             │ ├─3543500 nginx: master process nginx -g daemon off;
             │ └─3543502 nginx: worker process
             ├─docker-bde66e65f2ca02ce21a6e177e9857275224b6678d666fa5655a7836c4839d0f0.scope
             │ ├─478014 /bin/sh -c mkdir -p /var/log/nginx/ && chown -R nginx /var/log/nginx/ && sed -i "s/__WORKER_PROCESSES__/${NGINX_WORKER_PROCESSES:-1}/" /etc/nginx/nginx.conf &&sed -i "s/__WORKER_CO>
             │ ├─478116 nginx: master process nginx -g daemon off;
             │ └─478117 nginx: worker process
             ├─docker-c48c87c6fe9bdf05cd121c24bb0123d973024d46f607fe0dd8e89ce1833bb1ac.scope
             │ ├─3639174 /bin/sh -c mkdir -p /app/logs; if [ -d pre-exec-shells ];then for n in `ls pre-exec-shells/`;do bash pre-exec-shells/$n;done;fi;bash pre_exec.sh;mkdir -p /app/logs/${APP_VERSION}->
             │ └─3639261 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -server -Xmx384m -Xms16m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+UnlockExperimentalVMOpt>
             ├─docker-e0b51d5bd34295da2a312f82b1b85ec9ff8d142298d6e957a6b23757a91be5d3.scope
             │ ├─2603728 /bin/sh -c mkdir -p /app/logs; if [ -d pre-exec-shells ];then for n in `ls pre-exec-shells/`;do bash pre-exec-shells/$n;done;fi;bash pre_exec.sh;mkdir -p /app/logs/${APP_VERSION}->
             │ └─2603819 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -server -Xmx512m -Xms16m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+UnlockExperimentalVMOpt>
             └─docker-fae96ca1eebbdb010e5b2562e27ae980e849e00a3c175ddc1635c5da704de9a8.scope
               ├─3178068 /bin/sh -c mkdir -p /var/log/nginx/ && chown -R nginx /var/log/nginx/ && sed -i "s/__WORKER_PROCESSES__/${NGINX_WORKER_PROCESSES:-1}/" /etc/nginx/nginx.conf &&sed -i "s/__WORKER_C>
               ├─3178156 nginx: master process nginx -g daemon off;
               └─3178158 nginx: worker process
Nov 03 09:37:07 demo-swarm-master-1 systemd[1]: Created slice docker-limit.slice.

4.2.3 docker验证

docker login ccr.ccs.tencentyun.com --username 默认账号 --password 默认密码

4.3 初始化swarm master节点

4.3.1 查看ip信息

ip a

预期返回:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
  2: ens16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:16:3e:ce:95:32 brd ff:ff:ff:ff:ff:ff
    inet 172.16.2.12/24 brd 172.16.2.255 scope global ens16
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fece:9532/64 scope link 
       valid_lft forever preferred_lft forever
  3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:75:60:67:74 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

4.3.2 初始化第一台manager节点

使用机器的内网ip初始化第一台manager节点

docker swarm init --advertise-addr 172.16.3.8

预期返回:

Swarm initialized: current node (73hz6uqcl58v71sn0rsoalsss) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-sdfdfd-sdfd 172.16.3.8:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

4.3.3 获取 master key

docker swarm join-token manager

预期返回:

To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1qr56gcrfmq3oh9xv38lpdifk1rbvl37gs1xpisvge7jrh3kpc-ssdfd 172.16.3.8:2377

4.3.4 获取 worker key

docker swarm join-token worker

预期返回:

docker swarm join --token SWMTKN-1-1qr56gcrfmq3oh9xv38lpdifk1rbvl37gs1xpisvge7jrh3kpc-ssss 172.16.3.8:2377

4.4 初始化其它master节点

执行命令(拿mater key):

docker swarm join --token SWMTKN-1-1qr56gcrfmq3oh9xv38lpdifk1rbvl37gs1xpisvge7jrh3kpc-xxx 172.16.3.8:2377

预期返回:

This node joined a swarm as a manager.

4.5 初始化worker节点

执行命令(拿worker key)

docker swarm join --token SWMTKN-1-1qr56gcrfmq3oh9xv38lpdifk1rbvl37gs1xpisvge7jrh3kpc-xxx 172.16.3.8:2377

预期返回:

This node joined a swarm as a worker

4.6 按需修改ingress网络

在master1执行:

step1:删除原有ingress网络

docker network rm ingress

step2: 创建新的/16的ingress网络

docker network create --driver overlay --ingress --subnet=10.0.0.0/16 --gateway=10.0.0.1 ingress


目录
相关文章
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
81 5
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
110 14
|
3月前
|
持续交付 开发者 Docker
探索容器化技术Docker及其在现代软件开发中的应用
探索容器化技术Docker及其在现代软件开发中的应用
|
2月前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
94 4
|
2月前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
139 3
|
3月前
|
持续交付 开发者 Docker
探索容器化技术Docker及其在现代软件开发中的应用
探索容器化技术Docker及其在现代软件开发中的应用
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
117 1
|
3月前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
124 2
|
3月前
|
Cloud Native 云计算 Docker
云原生技术的崛起:从容器化到微服务架构
云原生技术的崛起:从容器化到微服务架构