Docker K8s 05 使用 Deployment 管理服务

核心概念 Deployment, ReplicaSet 和 Replication Controller

Replication Controller

Replication Controller(RC) 是老版本 K8s 的概念, 作用是确保 Pod 以用户指定的副本数运行, 如果有容器退出, 会创建新的 Pod 替代, 因异常情况多出的容器也会被回收. 实现了 K8s 的高可用性.

Deployment

Deployment 通过描述集群状态, 实现 Pod 的便捷化管理, 职责为保证 Pod 的数量和健康.

继承了 RC 的全部特征, 是 RC 的升级版, 还提供以下新的特性:

  • 事件和状态查看: 升级的详细进度和状态
  • 回滚
  • 版本记录
  • 暂停和启动
  • 多种升级方案

ReplicaSet

新版本 K8s 使用 ReplicaSet 替代 RC. RC 只支持 等式选择器, RS 支持 集合式选择器, 此外没什么不同.

Deployment 与 ReplicaSet

因为 RS 几乎与 RC 一样, 而且 Deployment 在 RC 之上更高级的功能, 所以不应该手动管理 RS, 而是将 RS 交给 Deployment 自动管理.

Deployment 的结构梳理

通过 kubectl 命令, 以命令行或者文件的形式, 创建了 Deployment.

Deployment 为 ReplicaSet 提供了封装, 支持事件, 状态, 回滚等特性.

ReplicaSet 管理 Pod, 保证集群数量, 提供高可用性.

每个 Pod 又类似 Docker Compose 提供了一套完整的服务.

Deployment 的日常操作

部署服务

有两种方式部署服务, 一个是命令行模式, 另一个是配置文件模式(支持 YAML 和 JSON). 后面将介绍 YAML 格式的编写.

1
2
kubectl run DEPLOYMENT_NAME --image=IMAGE_NAME --replicas=N
kubectl apply -f DEPLOYMENT_NAME.yaml

查看 Deployment 状态

1
2
kubectl get deployment DEPLOYMENT_NAME
kubectl describe deployment DEPLOYMENT_NAME

查看 ReplicaSet 状态

其中 ReplicaSet Name 从获取的 Deployment 中得知.

1
2
kubectl get replicaset REPLICASET_NAME
kubectl describe replicaset REPLICASET_NAME

可以查看 Image 镜像, Replicas 副本数, Pod Status 服务状态.

查看 Pod 服务状态

其中第二步的 Pod Name 从第一步从获取.

1
2
kubectl get pod -o wide
kubectl describe pod POD_NAME

可以看 NodeName, IP 地址, 隶属于哪个 ReplicaSet, Events 日志等.

在 Node 上面可以看到 container 的详细信息

其中第一步可以看到会有一个 Pause 服务.

第二步的 Container ID 是从第一步列表中获取的.

1
2
docker ps
docker inspect CONTAINER_ID

Deployment 的 Yaml 配置

YAML 文件的格式要点

  • 区分大小写
  • 空格缩进表示层级, 缩进对其即可, 不能使用 tab
  • # 表注释, 行级别

主要数据结构为 Map 和 List.

1
2
3
4
5
6
7
8
9
10
11
# Map
key1: v1
# List
key2:
- v1
- v2
# List-Map
key3:
- key1: v1
key2: v2
...

Deployment 配置说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 配置适用于 K8s 的版本
apiVersion: app/v1
# 配置的资源类型
kind: Deployment
metadata: # kind 资源的固有属性
name: nginx-deployment
spec: # 定义 kind 资源所包含的内容
replicas: 3 ## pod 的副本数
template: ## pod 的模板
metadata: ## 定义 pod 服务的固有属性
labels:
app: nginx
track: stable
spec: ## 定义 pod 服务的内容
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80

Yaml 配置的好处:

  • 可以直接描述服务的最终状态.
  • 可以重复利用
  • 可以存盘, 像管理代码一样管理服务
  • 适用于正式, 跨环境, 大规模部署.

Deployment 的删除

1
kubectl delete deployment DEPLOYMENT_NAME

删除 Deployment 的时候, 会自动删除 Pod 和 ReplicaSet.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.