Docker 是如今前端开发人员不可或缺的一项技术,然而在实际的生产环境中,单个 Docker 容器可能无法满足业务需求。因此,多个 Docker 容器的协作管理是必要的。这就是 Docker Swarm,它是 Docker 官方提供的原生集群管理解决方案。Docker Swarm 允许将多个主机设置为一个 Docker 集群,并利用 Docker 的 API 和命令行工具在这个集群上进行操作和管理。
Kubernetes 是一个更为强大和复杂的容器管理平台,可以支持更复杂的应用程序和更多的容器集群。而 Docker Swarm 作为 Docker 自带的集群管理工具,也可以作为学习 Kubernetes 的入门基础。因此,本文将以 Docker Swarm 为主要内容,向读者介绍如何从初学到搭建多主机 Kubernetes 环境。
1. Docker Swarm 入门
1.1.准备工作
安装 Docker CE:Docker CE 是 Docker 社区版,简单易用,是使用 Docker 的第一步,参考官方文档 https://docs.docker.com/install/ 进行安装即可。
设置 Docker 镜像加速器:国内访问 Docker Hub 可能会非常慢,为了提高 Docker 构建和拉取镜像的速度,我们可以设置 Docker 镜像加速器,参考阿里云镜像加速器 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 进行设置。
两个或多个 Docker 主机:构建 Docker Swarm 集群必须要有两个或多个主机,这些主机分别可以是物理机或虚拟机,同一个网络即可。
1.2.创建 Docker Swarm 集群
在其中一个主机上执行以下命令,创建 Docker Swarm 集群:
$ docker swarm init
之后会生成一个 token
,其他主机通过该 token
来加入集群。将该 token
备份到其他主机,如下所示:
Swarm initialized: current node (l5raqixbwjo35p09q3q29069a) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-1n5jhm830z1561hqde85wi169lyiu6ea5n6c5k04keo91k90vm-4j2h1l0najoobhbt8bckr33nu 192.168.99.101:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
然后在另一个主机上加入该集群,如下所示:
$ docker swarm join --token SWMTKN-1-1n5jhm830z1561hqde85wi169lyiu6ea5n6c5k04keo91k90vm-4j2h1l0najoobhbt8bckr33nu 192.168.99.101:2377
现在,我们就拥有了一个简单的 Docker Swarm 集群。
1.3.创建服务
服务是容器的一个集群。在 Docker Swarm 中,我们通过创建服务来运行相同的容器。服务管理容器的生命周期,并确保服务的可用性和可伸缩性。可以使用以下命令来创建服务:
$ docker service create --name test nginx:latest
这会创建一个名为 test
的服务,我们可以将其部署在我们的 Swarm 集群中。该服务的镜像是 nginx:latest
,示例的应用层是一个静态的 nginx 服务。我们可以通过以下命令查看服务的状态:
$ docker service ls
我们可以在其他节点上查看该服务是否运行:
$ docker ps
1.4.管理 Swarm
我们可以使用 docker node
命令管理 Docker Swarm:
$ docker node ls # 列出所有节点 $ docker node inspect <node_name> # 查看节点的详细信息 $ docker node promote <node_name> # 将节点提升为管理员节点 $ docker node demote <node_name> # 将节点降级为工作节点 $ docker node rm <node_name> # 从 Swarm 集群中删除节点 $ docker node update <node_name> # 更新节点的配置
Docker Swarm 对容器、服务和节点的管理都是很方便的。
2. Docker Swarm 进阶
Docker Swarm 不仅仅是一个简单的容器编排工具,它还提供了更高级的功能。这里为大家介绍一下 Docker Swarm 进阶部分的内容。
2.1.负载均衡
Docker Swarm 提供了内置的负载均衡能力,它会自动将流量分流到不同的节点上。
$ docker service create --name nginx --replicas 3 -p 8080:80 nginx:latest
上面的命令可以创建一个名为 nginx
的服务,并将 entrypoint
设置为 nginx:latest
。同时,服务的副本数量为 3,将通过端口 8080
暴露在主机上。
Docker Swarm 默认使用 round-robin 策略进行负载均衡。
2.2.健康检查和升级
Docker Swarm 提供了健康检查和自动升级的功能。
在 Docker Swarm 中,可以通过 docker service update
命令来更新服务。例如,以下命令将服务 web
的副本数量从 4
更改为 5
:
$ docker service update --replicas 5 web
Docker Swarm 提供了一个健康检查机制,可以通过配置检查脚本来检测服务的状态是否健康。如果服务不健康,Docker Swarm 将自动停止并重启容器。
在 Dockerfile 中,可以通过 HEALTHCHECK 命令添加一个健康检查脚本。
HEALTHCHECK --interval=5s CMD curl -f http://localhost:80 || exit 1
以上例子中,Docker Swarm 会每 5 秒执行一次检查脚本,如果返回码为非零值,则意味着服务不健康。
2.3.存储方案
Docker Swarm 也提供了存储方案。可以使用以下命令来创建一个具有 100G 存储空间的存储方案:
$ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100g tmpfs-volume
接着可以将该存储方案作为服务的一部分来使用。
$ docker service create --replicas 1 --name nginx --mount source=tmpfs-volume,target=/usr/share/nginx/html --publish published=8080,target=80 nginx
2.4.多主机部署
在 Docker 18.02 版本之前,只有单个 Swarm 节点可用于管理服务。因此,不能将服务部署到多个节点上以实现容错能力。
现在,Docker 已经支持跨多个主机的 Swarm 集群。我们可以使用 docker swarm join
命令将新的主机加入到集群中。
2.5.实例
以下是一个 Docker Swarm 的示例:启动 5 个 nginx 服务容器,将它们绑定到同一个网络上,由 Docker Swarm 进行负载均衡。
- 启动 Docker Swarm 集群:
$ docker swarm init
- 创建一个 Docker network:
$ docker network create --driver overlay nginx-net
- 启动 nginx 服务:
$ docker service create --name nginx-service --replicas 5 --network nginx-net -p 80:80 nginx
- 查看服务状态:
$ docker service ls
- 在浏览器中访问 nginx 服务:
http://<your-ip-address>
3. Kubernetes
Kubernetes 是 Google 开源的分布式容器集群管理系统,旨在提供自动化容器部署、扩展和管理的平台。
Kubernetes 是一个更为强大和复杂的容器管理平台,可以支持更复杂的应用程序和更多的容器集群。你可以学习它的更高级用法,例如如何实现自定义资源对象、横向和垂直自动扩展、自定义调度策略、数据卷、状态存储等等。
3.1.搭建 Kubernetes 集群
Kubernetes 的安装和配置相对 Docker Swarm 更为复杂。然而,在为前端开发提供 K8s 支持的场景下, Minikube 提供了一种简单的方法。Minikube 可以在本地电脑上创建一个单主机 Kubernetes 集群,并且支持多种虚拟机管理器,常用的有 VirtualBox 和 KVM。
3.1.1. 安装 Minikube
请参阅 https://minikube.sigs.k8s.io/docs/start/ 进行安装和配置。如果已经安装了 Docker,可以通过 brew install minikube
命令来安装。接下来,执行以下命令验证 Minikube 是否正确安装:
$ minikube start
3.1.2. 配置 kubectl
kubectl
是 Kubernetes 的命令行工具。执行以下命令来安装 kubectl
:
brew install kubectl echo 'source <(kubectl completion bash)' >>~/.bashrc source ~/.bashrc
3.1.3. 部署配置
可以使用以下命令查看启动的集群是否正在运行:
minikube status
接下来,通过 kubectl
来管理 Kubernetes:
kubectl cluster-info
3.1.4. 示例
- 启动 nginx 服务:
$ kubectl create deployment nginx --image=nginx:alpine
- 将部署扩展到 3 个 Pod:
$ kubectl scale deployment nginx --replicas=3
- 检查 Pod 的状态:
$ kubectl get pods
- 检查服务:
$ kubectl get service
Kubernetes 的学习曲线比 Docker Swarm 更陡峭,但是它有更多的特性和更高的可扩展性,对于大型项目来说,是更好的选择。
4. 结论
Docker Swarm 和 Kubernetes 都是旨在提供容器编排和集群管理的平台。Docker Swarm 更加简单,轻量,并且可以在单个机器上管理容器集群。Kubernetes 提供了更多的高级特性,包括更容易扩展,更复杂的应用程序和更高级的资源调度。对于前端开发人员,Docker Swarm 可以作为学习 Kubernetes 的入门基础。在工作中选择何物需要结合具体情况进行评估。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6701157d0bef792019b14d28