概述
对于简单轻量级集群管理,利用 Docker Swarm 就够用了,适合中小型应用程序的容器编排。如果是比较重的中心化集群管理方案或需要更复杂的功能,可以考虑使用 Kubernetes + Helm + Consul 等更强大的容器编排工具。
Docker Swarm
- 1. Docker Swarm
- 描述:Docker Swarm 是 Docker 的原生集群管理工具,适用于较简单的集群管理。可以轻松部署和管理多个 Docker 容器。
- 功能:
- 内置负载均衡,容器监控和管理。
- 可以通过 Docker Compose 定义服务和依赖关系,简化部署过程。
- 监控工具(如 Portainer)可以用来展示节点信息和生命状态。
- 2. Portainer
- 描述:Portainer 是一个轻量级的 Docker 管理工具 (UI),提供用户友好的界面。
- 功能:
- 监控 Docker 容器的状态和资源使用情况。
- 简化容器的管理和升级过程。
- 适合小型项目或简单的环境。
docker service create --name portainer --publish 9000:9000 --volume /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce
- 3. Docker Registry + CI/CD 工具
- 描述:使用 Docker Registry 来存储镜像,并结合 CI/CD 工具(如 Jenkins、GitLab CI、GitHub Actions)来实现自动构建和推送。
- 工作流程:
- 在代码更改后,CI/CD 工具自动构建新的 Docker 镜像。
- 将新镜像推送到 Docker Registry。
- 使用 CLI 脚本或 API 调用触发 Docker Swarm 更新,执行类似 docker service update --image your-repo/your-image:latest your-service-name 的命令。
- 4. Watchtower
- 描述:Watchtower 是一个开源工具,可以在 Docker 中监控运行的容器并自动更新它们。
- 功能:
- 监视 Docker 容器中的镜像,如果检测到新版本,自动拉取并更新服务。
- 可以和 Docker Swarm 结合使用,部署在 Swarm 集群中。
- 使用方法:
- 在 Swarm 中部署 Watchtower 容器:
docker service create --name watchtower --mode global containrrr/watchtower --cleanup your-service-name
- Watchtower 将定期检查镜像更新,并自动更新运行中的容器。
- 在 Swarm 中部署 Watchtower 容器:
- 5. GitOps 工具(如 ArgoCD 或 Flux)
- 描述:GitOps 是一种基于 Git 的操作模式,可以用于管理 Kubernetes 和 Docker Swarm 中的应用部署。
- 功能:
- 通过 Git 仓库管理 Docker 镜像和服务配置。
- 监控 Git 仓库中的更改,自动部署和更新服务。
- 使用方法:
- 配置 Git 仓库,包含 Docker Compose 文件或相关配置。
- 部署 GitOps 工具,它将监视 Git 仓库并在检测到更改时自动更新服务。
文档
- https://docs.docker.com/engine/swarm/
- https://docs.portainer.io/
常见命令
docker swarm init
# 将 `<token>` 和 `<manager-ip>` 替换为实际值。
docker swarm join --token <token> <manager-ip>:2377
docker node ls
# 部署服务 checkpoint or nginx 示例
docker service create --name my-nginx --replicas 3 -p 80:80 nginx
docker service ls
# 升级更新服务
docker service update --image nginx:latest my-nginx
# 使用 compose.yml
docker stack deploy -c docker-compose.yml <stack_name>
推送起新服务
创建服务
使用 docker service create
时,您可以指定以下几个参数:
--replicas
:设置要运行的副本数量。--publish
:暴露端口,让外部可以访问服务。--limit
:设置资源限制。--constraint
:限制服务在特定节点上运行。
创建新服务的基本示例
例如,下面的命令会在 Swarm 中创建一个名为 my-nginx
的服务,运行 3 个 Nginx 实例,并将端口 80 显示到集群外部:
docker service create --name my-nginx --replicas 3 -p 80:80 nginx
指定在哪些节点上运行服务
您还可以使用 --constraint
参数来限制服务运行在特定的节点上。限制条件的基本语法如下:
docker service create --name my-nginx --replicas 3 \
--constraint 'node.hostname == node1' \
nginx
在这个例子中,服务 my-nginx
只会在名为 node1
的节点上运行。
同时在多个节点上运行
如果您希望在特定的一批节点上运行服务,可以使用 --constraint
来设置多个条件。例如:
docker service create --name my-nginx --replicas 3 \
--constraint 'node.hostname == node1' \
--constraint 'node.hostname == node2' \
nginx
但是,--constraint
不支持直接指定多个节点的“一批”,如果需要同时在多个节点上,可以考虑使用标签(label)。
使用标签约束
为节点打标签:首先,您可以为希望运行服务的节点打标签:
docker node update --label-add mylabel=true node1 docker node update --label-add mylabel=true node2
使用标签创建服务:
接着,您可以使用该标签限制服务只在带有该标签的节点上运行:docker service create --name my-nginx --replicas 3 \ --constraint 'node.labels.mylabel == true' \ nginx
Kubernetes
1. 必需的工具
a. kubectl
这是 Kubernetes 的命令行工具,用于与 Kubernetes API 进行交互。您需要确保在本地或管理节点上安装了 kubectl
。
- 安装:
# 对于 macOS brew install kubectl # 对于 Linux curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl
b. Kubernetes 集群
确保您有一个运行中的 Kubernetes 集群。您可以使用 Minikube、kubeadm、GKE、EKS 等工具来创建和管理 Kubernetes 集群。
2. 主要命令和资源对象
a. 部署(Deployment)
Kubernetes 中的 Deployment 是用于管理无状态应用程序的主要资源对象。您可以使用它来定义要运行的应用程序的所需状态,并 Kubernetes 将确保集群达到该状态。
创建一个 Deployment:
创建一个 YAML 文件(如nginx-deployment.yaml
)来定义 Deployment,例如:apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 3 selector: matchLabels: app: my-nginx template: metadata: labels: app: my-nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
使用
kubectl
命令创建 Deployment:kubectl apply -f nginx-deployment.yaml
b. 服务(Service)
创建一个 Service,以便外部能够访问您的 Deployment 中的 Pods。
创建一个 Service:
创建一个 YAML 文件(如nginx-service.yaml
)来定义 Service,例如:apiVersion: v1 kind: Service metadata: name: my-nginx-service spec: selector: app: my-nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer # 或 ClusterIP / NodePort
使用
kubectl
命令创建 Service:kubectl apply -f nginx-service.yaml
c. 更新 Deployment
如果您想要更新应用程序的镜像或其他配置,您可以使用 kubectl set image
或直接更新 Deployment YAML 文件。
更新镜像:
kubectl set image deployment/my-nginx nginx=nginx:latest
或者更新 YAML 文件并重新应用:
kubectl apply -f nginx-deployment.yaml
d. 查看状态
- 查看所有 Pods、Deployment、services 和其状态:
kubectl get pods kubectl get deployments kubectl get services
e. 删除资源
如果您需要删除部署或服务,可以使用以下命令:
- 删除 Deployment or Service:
kubectl delete deployment my-nginx kubectl delete service my-nginx-service
3. 其他工具和功能
a. Helm
Helm 是 Kubernetes 的包管理工具,可以简化应用程序的部署和管理。您可以使用 Helm Charts 来定义和部署复杂的应用程序。
- 安装 Helm:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
b. 监控和日志
使用 Prometheus 和 Grafana 监控集群的性能,使用 Kubernetes 内置的 kubectl logs
命令查看 Pods 的日志。
- 查看 Pod 日志:
kubectl logs <pod-name>