[TOC]
> 1. k8s提供五种控制器Deployment、DaemonSet、StatefulSet、Job和Cronjob
> 2. 控制器可以保证pod的副本数,保证服务的运行,也可以平滑升级容器版本如Deployment
# 1. Deployment
## 1.1 基础概念
> 1. Deployment是一种控制器资源,控制pod和ReplicaSet,通过控制replicaSet间接完成对pod的期望控制
> 2. Deployment用来取代老的ReplicationController
> 3. Deployment可以
## 1.2 功能
1. Deployment用来创建ReplicaSet,ReplicaSet创建pod,也可以不用Deployment,直接用ReplicaSet直接创建Pod
2. 滚动升级和回滚`->`不影响服务正常运行
3. 扩缩容
4. 启动、停止和删除Deployment
## 1.3 功能实践
### 1.3.1 通过ReplicaSet创建pod
**1. ReplicaSet创建**
```
apiVersion: apps/v1
kind: ReplicaSet
metadata: # RS 元素信息
name: rsnginx # RS 名称
labels: # 自定义标签
app: test # RS 标签
tier: nginx # RS 标签
spec:
replicas: 3 # Pod 副本数
selector: # 选择标签
matchLabels: # 匹配标签
tier: ng-pod # 匹配 frontend 标签
template: # Pod 模板
metadata: # Pod 元素信息
labels: # 自定义标签
tier: ng-pod # 标签 frontend
spec:
containers:
- name: mynginx # 容器名称
image: nginx:1.14.0 # 镜像地址
```
**2. 利用文件创建**
`kubectl apply -f rs_nginx.yaml`
```
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-6876dc68c9 3 3 1 41h
rsnginx 3 3 3 95s
```
> pod名称 = Deployment名称-ReplicaSet名称-随机字母
```
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 3 4d14h run=nginx
nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx2 1/1 Running 2 2d18h run=nginx2
rsnginx-fj6hg 1/1 Running 0 7m20s tier=ng-pod
rsnginx-j6djf 1/1 Running 0 7m20s tier=ng-pod
rsnginx-thpmb 1/1 Running 0 7m20s tier=ng-pod
```
**3. 修改pod标签**
```
[root@master ~]# kubectl label pod rsnginx-j6djf tier=ng-podbak --overwrite
pod/rsnginx-j6djf labeled
[root@master ~]#
[root@master ~]#
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 3 4d14h run=nginx
nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx2 1/1 Running 2 2d18h run=nginx2
rsnginx-fj6hg 1/1 Running 0 9m6s tier=ng-pod
rsnginx-hlqlc 1/1 Running 0 3s tier=ng-pod
rsnginx-j6djf 1/1 Running 0 9m6s tier=ng-podbak
rsnginx-thpmb 1/1 Running 0 9m6s tier=ng-pod
```
因为rs或Deployment根据标签Label识别pod
修改标签后,相当于pod少了一个,rs维持了pod的副本数,又增加了一个pod
但是ReplicaSet不能滚动升级
### 1.3.2 通过Deployment创建pod
deployment 不写 matchLabels:
app: nginx
**1. yaml配置文件**
```
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.0
name: nginx
tolerations:
- key: "disktype"
operator: "Equal"
value: "ssd"
effect: "NoExecute"
```
**2. 通过yaml文件创建pod**
`kubectl apply -f nginx-dp.yaml`
注意名称的变化
**3. 扩缩容**
--replicas=4,改变数量达到扩缩容
```
[root@master ~]# kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
[root@master ~]#
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 3 4d14h
nginx-deployment-6876dc68c9-67hdm 0/1 ContainerCreating 0 13s
nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h
nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h
nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h
```
**4. 更新镜像**
【格式】:kubectl set image Deployment名称 容器名称=镜像
`kubectl set image deployment/nginx-deployment nginx=nginx:latest`
原来的rs被停止
```
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 3 3 3 21s
nginx-deployment-6876dc68c9 0 0 0 14m
```
**5.回滚镜像**
【格式】`kubectl rollout undo [Deployment名称]`
```
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 2 2 2 5m4s
nginx-deployment-6876dc68c9 2 2 1 19m
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 1 1 1 5m6s
nginx-deployment-6876dc68c9 3 3 2 19m
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 0 0 0 5m8s
nginx-deployment-6876dc68c9 3 3 3 19m
```
如上,镜像变更没有使得原来的rs(ReplicaSet)全部停止,达到平稳升级的效果
也可以set指定镜像版本,达到回滚的目的,
**6. 回滚到指定版本**
1. 查看历史版本
`kubectl rollout history DeploymentName`
2. 回滚到指定版本
`kubectl rollout undo deployment/nginx-deployment --to-revision=3`
### 1.3.3 根据负载动态扩缩容
https://www.cnblogs.com/l-hh/p/14840573.html
# 2. DaemonSet
## 2.1 功能
1. 确保每个(某些)节点都有这个pod,新加入的节点自动部署pod
**DaemonSet 典型应用场景:**
* 运行集群存储,例如在每个Node上运行`glusterd`、`ceph`等
* 每个Node 上运行日志收集,例如`fluentd`、`logstash`等
* 每个Node上运行监控程序,例如`Prometheus Node Exporter`、`collectd`等
## 2.2 使用
### 2.1 每个节点都部署pod
```
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset
labels:
app: daemonset
spec:
selector:
matchLabels:
name: daemonset-ng
template:
metadata:
labels:
name: daemonset-ng
spec:
containers:
- name: mynginx
image: nginx:1.14.0
```
每个节点都有一个pod
```
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-c8w2j 1/1 Running 0 14s 10.244.1.31 node01 <none> <none>
daemonset-tg2c8 1/1 Running 0 14s 10.244.2.19 node02 <none> <none>
```
# 3. StatefulSet
## 3.1 功能
1. StatefulSet 是用来管理**有状态服务**,为了解决有状态服务的问题,而 Deployment 和 ReplicaSet 更适用于无状态服务的部署。
2. StatefulSet的pod无论怎么调度,每个 Pod 都有一个永久不变的 ID。
**StatefulSet 应用场景:**
* 稳定的、唯一的网络标识符。
* 稳定的、持久的存储。
* 有序的、优雅的部署和缩放。
* 有序的、自动的滚动更新。
# 4. Job
## 4.1 功能
1. Job 负载批处理任务,**仅执行一次的任务**,它能够保证批处理任务的一个或者多个 Pod 成功执行结束。
2. 可以设置 Job 执行成功的数值,Job 跟踪记录成功完成的 Pod 个数,当数量达到指定的成功个数阈值时,任务结束。
3. 如果 Jod 没有以`0代码`成功退出的话,它会重新执行这个程序。
```
apiVersion: batch/v1
kind: Job
metadata:
name: pi # Job 名称
spec:
template:
spec:
containers:
- name: pi # Pod 名称
image: perl # 镜像名称
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
# 计算圆周率,计算小数点后 2000 位
restartPolicy: Never # 重启策略,永不重启
backoffLimit: 4 # 设置重试次数,达到后将 Job 标记为失败
```
其他参数
`.spec.completions`标志 Job 需要成功完成 Pod 个数,才视为整个 Job 完成。(默认1)
`.spec.parallelism`标志 Pod 并行运行个数。(默认1)
`.spec.activeDeadlineSeconds`标志 Job 的整个生命期,一旦 Job 运行时间达到设定值,则所有运行中的 Pod 都会被终止。(秒数值)
# 5. Cronjob
定期的执行Job
- docker
- docker安装
- 数据持久化
- 镜像管理
- Dockerfile
- 镜像的分层
- add copy
- 构建实例
- 镜像的导入导出
- 清理构建空间
- 配置阿里云加速器
- docker网络模型
- 本地仓库
- registry
- harbor
- IDEA部署docker
- 软件安装
- 安装es
- 安装MongoDB
- 安装rabbitmq
- 安装redis
- 安装nacos
- 安装mysql
- Minio
- 镜像中心
- kubernetes
- 1. 安装k8s
- 2.主要组件
- 3.污点
- 4.pod
- 5.控制器
- 6.网络
- 7.探针
- 8.安装Dashbord
- 9.secret
- 9.serviceAccount
- 10.service
- 资源清单
- kube-proxy
- flannel源文件
- 服务升级
- 笔记
- 镜像