9 容器编排
编排 Orchestration 这一术语来源于音乐领域,根据作曲家的作品,编曲决定音乐作品的某一部分由某种乐器以某种方式在某个时机来演奏,这一过程称为编排。
编排这一术语被借用到了 IT 领域,
Service Orchestration: 在 SOA 和微服务体系中,针对 Service。
Cloud Orchestration:在 Cloud 体系中,针对云资源描述。
容器编排:负责容器的启停调度,并且通过管理容器集群来提升容器使用率。
表格 6 容器编排 K8s/Mesos/Swarm 比较
K8s | Mesos | Swarm | |
---|---|---|---|
简介 | 基于 Google 在过去十五年来大量生产环境中运行工作负载的经验。 高度通用,开源。 | 分布式调度系统内核。作为资源管理器的 Apache Mesos 在容器之前就已经出现很久了,支持运行容器化化和非容器化的工作负载。 适用于大型系统 | Docker 开发的调度框架。 标准 Docker API 的使用。 易于集成和设置,灵活的 API,有限的定制。 |
支撑厂商 | Mesosphere | Docker | |
核心概念 | APIServer Pod Label Service kubelet | Master Slave Zookeeper Framework | |
特性 | 通过 Pods 这一抽象的概念,解决 Container 之间的依赖与通信问题。Pods, Services, Deployments 是独立部署的部分,可以通过 Selector 提供更多的灵活性。内置服务注册表和负载平衡。 | 可以支持应用程序的健康检查,开放的架构。支持多个框架和多个调度器,通过不同的 Framework 可以运行 Haddop/Spark/MPI 等多种不同的任务。 | 由于随 Docker 引擎一起发布,无需额外安装,配置简单。支持服务注册、服务发现,内置 Overlay Network 以及 Load Balancer。与 Docker CLI 非常类似的操作命令,对熟悉 Docker 的人非常容易上手学习。 |
备注:2016 年容器三家平分秋色;到 2017 年,K8s 成为主流。
K8s
Kubernetes(K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它由 Google 开发并于 2014 年开源,成为业界广泛采用的容器编排工具。Kubernetes 提供了一个强大而灵活的系统来管理容器化应用程序的生命周期,使得容器的管理和调度更加高效。
Kubernetes 的核心概念
Pod :Kubernetes 的基本调度单元,一个 Pod 是一个或多个容器的集合,通常共享存储和网络。Pod 中的容器通常是相互依赖、需要共享资源的。
Service :提供了对一组 Pod 的网络访问。Service 定义了如何访问这些 Pod,并提供了负载均衡和服务发现的功能。
Deployment :用于声明式地管理应用程序的部署。Deployment 允许你描述应用程序的状态,Kubernetes 会确保实际状态与期望状态一致。
ReplicaSet :保证特定数量的 Pod 副本在任何时间点都在运行。Deployment 通常会管理一个 ReplicaSet。
Namespace :用于将集群资源划分为多个虚拟集群。Namespaces 允许在同一集群中隔离不同的团队或项目。
ConfigMap 和 Secret :用于管理配置数据和敏感数据。ConfigMap 存储配置数据,而 Secret 用于存储机密信息,如密码和 API 密钥。
Persistent Volume (PV) 和 Persistent Volume Claim (PVC) :用于管理持久化存储。PV 是集群中的存储资源,而 PVC 是对这些资源的请求。
Ingress :管理外部访问到集群中的服务,通过定义路由规则来控制流量。
Kubernetes 的主要功能
自动化部署和回滚 :通过 Deployment 控制器自动化应用程序的部署,并支持回滚到之前的版本。
负载均衡 :使用 Service 提供内部负载均衡,确保流量均匀分配到所有 Pod 副本上。
自动扩展 :支持水平扩展和缩减 Pod 副本数量,以及根据 CPU 使用率等指标自动扩展应用程序。
自我修复 :自动检测和替换失败的 Pod,确保系统的高可用性。
配置管理 :使用 ConfigMap 和 Secret 来管理应用程序的配置和敏感数据。
存储管理 :通过 PV 和 PVC 管理持久化存储,支持多种存储后端。
Kubernetes 组件
Master 节点 :负责集群的管理和控制,主要包括 API Server、Scheduler、Controller Manager 和 etcd。
- API Server :处理 API 请求,并与集群状态数据库 etcd 进行交互。
- Scheduler :负责将 Pods 调度到合适的节点上。
- Controller Manager :负责处理集群的控制循环,例如确保 ReplicaSet 的副本数。
- etcd :分布式键值存储,用于保存集群的状态和配置数据。
Node 节点 :运行容器化应用程序的工作节点,每个 Node 上运行一个 Kubelet 和一个容器运行时(如 Docker)。
- Kubelet :负责与 API Server 通信,确保 Pod 和容器按照期望的状态运行。
- 容器运行时 :用于实际运行和管理容器,Docker 和 containerd 是常见的容器运行时。
示例
创建一个简单的 Deployment
以下是一个简单的 Deployment YAML 文件示例,定义了一个包含两个副本的 Nginx 部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
创建一个 Service
以下是一个定义 Service 的 YAML 文件示例,提供对 Nginx Pods 的访问:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
总结
Kubernetes 是一个功能强大的容器编排平台,能够自动化管理容器化应用程序的部署、扩展和管理。它通过提供丰富的功能和灵活的配置选项,帮助企业和开发者高效地管理复 杂的容器化环境。掌握 Kubernetes 的核心概念和功能,有助于构建和维护高效、可靠的现代应用程序架构。
Mesos
Apache Mesos 是一个开源的集群管理工具,用于有效地管理和调度大规模计算集群。它能够将集群资源抽象为一个单一的资源池,从而简化了大规模计算任务的部署和管理。 Mesos 支持多种框架,能够运行不同类型的工作负载,包括传统的计算任务、容器化应用和大数据处理。
核心概念
Mesos Master :
- 负责集群的资源管理和调度。Mesos Master 接收来自框架的资源需求请求,并将资源分配给各个框架。
Mesos Slave (或 Agent) :
- 负责实际的资源分配和任务执行。每个 Slave 节点在集群中运行,提供计算和存储资源。
Framework :
- Mesos 支持多种计算框架(如 Apache Hadoop、Apache Spark 和 Apache Marathon)。Framework 由两个部分组成:调度器(Scheduler)和执行器(Executor)。调度器负责提出资源需求并调度任务,执行器在指定的资源上实际执行任务。
Scheduler :
- Framework 中的调度器向 Mesos Master 提交资源请求并接收分配的资源。
Executor :
- Framework 中的执行器在资源上运行任务,并报告任务的状态和结果。
主要功能
资源隔离 :
- Mesos 使用资源隔离技术来确保不同框架和任务不会互相干扰。它通过 Cgroups 和其他技术对 CPU、内存和磁盘等资源进行隔离。
弹性调度 :
- Mesos 支持动态资源分配,可以根据负载情况自动调整资源分配。
多租户支持 :
- 支持在同一个集群中运行多个框架和应用程序,通过资源共享和隔离实现多租户环境。
容错和高可用性 :
- Mesos 支持 Master 节点的高可用配置,确保在 Master 节点发生故障时集群仍能正常工作。
扩展性 :
- Mesos 设计为高度可扩展,支持从小规模集群到大规模集群的管理。
与其他工具的比较
与 Kubernetes 比较 :
- Kubernetes 更专注于容器化应用的编排和管理,而 Mesos 是一个更通用的资源管理平台,可以运行多种类型的工作负载,包括容器化应用和大数据处理任务。
与 Apache Hadoop 比较 :
- Hadoop 是一个用于大数据处理的框架,主要关注数据处理任务。而 Mesos 提供了更广泛的资源管理和调度功能,可以运行包括 Hadoop 在内的多个框架。
示例
基本架构示例
在 Mesos 集群中,假设你有一个 Master 节点和多个 Slave 节点,以及一个调度器(Scheduler)和执行器(Executor)。
Mesos Master :
- 负责集群资源的协调和分配。
Mesos Slave :
- 每个节点提供资源,如 CPU 和内存,并运行调度器分配的任务。
Framework :
- 如 Apache Marathon、Apache Spark 等,提交任务并管理其运行。
提交任务的示例
假设你要通过 Apache Marathon 提交一个 Web 应用程序任务,Marathon 会作为一个 Mesos Framework 向 Mesos Master 请求资源并调度任务。
{
"id": "webapp",
"cmd": "python -m SimpleHTTPServer 8080",
"cpus": 0.1,
"mem": 128,
"instances": 2,
"container": {
"type": "DOCKER",
"docker": {
"image": "python:3.8",
"network": "BRIDGE"
}
}
}
总结
Apache Mesos 是一个强大的集群管理工具,能够高效地管理和调度大规模计算资源。它通过资源隔离、多租户支持和弹性调度等功能,适用于各种类型的工作负载,包括传统计 算、容器化应用和大数据处理。Mesos 的设计允许它与多种计算框架协同工作,从而提供灵活的资源管理和调度能力。
Docker Swarm
Docker Swarm 是一个由 Docker 开发的调度框架。由 Docker 自身开发的好处之一就是标准 Docker API 的使用,Swarm 由多个代理(Agent)组成,把这些代理称之为节点(Node)。这些节点就是主机,这些主机在启动 Docker Daemon 的时候就会打开相应的端口,以此支持 Docker 远程 API。这些机器会根据 Swarm 调度器分配给它们的任务,拉取和运行不同的镜像。
图 Docker Swarm 结构
Swarm 基本概念:
- Manager:在整个集群中分配任务,集群中控制 Worker 的节点。
- Worker:运行由 Manager 节点分配的任务。
- Services:跨节点的执行特定接口的一组容器。.
- Key-valuestore:内建的 Key-Value 存储解决方案,做服务发现、服务注册以及主节点选举工作。
docker stack 默认使用 swarm 模式部署。
docker swarm 命令
$ docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
Run 'docker swarm COMMAND --help' for more information on a command.
# 节点管理
$ docker node
Usage: docker node COMMAND
Manage Swarm nodes
Commands:
demote Demote one or more nodes from manager in the swarm
inspect Display detailed information on one or more nodes
ls List nodes in the swarm
promote Promote one or more nodes to manager in the swarm
ps List tasks running on one or more nodes, defaults to current node
rm Remove one or more nodes from the swarm
update Update a node
Run 'docker node COMMAND --help' for more information on a command.
docker swarm 命令示例
# 初化化 默认成为主节点,管理节点
$ docker swarm init
# 添加工作节点 Worker 1 (wrk-1)
$ docker swarm join --token SWMTKN-1-2hl6...-...3lqg 172.31.40.192:2377
This node joined a swarm as a worker.
# 添加管理节点
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-106itx81w- 192.168.0.240:2377
# 查看节点
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
lhm...4nn * mgr-1 Ready Active Leader
b74...gz3 wrk-1 Ready Active
监听端口
firewall-cmd --zone=public -add-port=2377/tcp --permanent &&
firewall-cmd --zone=public --add-port=7946/tcp --permanent &&
firewall-cmd --zone=public --add-port=7946/udp --permanent &&
firewall-cmd --zone=public --add-port=4789/udp --permanent &&
firewall-cmd --reload
说明:2377 端口是集群管理通信端口,只需要在管理节点开启。7946 tcp,udp 是节点间通信使用端口,4789 是 overlay network 使用的端口。
如果 docker daemon 运行时没有指定端口,默认用 unix:///var/run/docker.sock
# 相当于将默认的 socket 绑定在本机的 2376
docker -d -H unix:///var/run/docker.sock -H 0.0.0.0:2376
本章参考
Docker Swarm 集群搭建 https://learnku.com/articles/37840
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论