1 概念
- 在集群上管理和运行容器的对象
2 Pod和Controller关系
- Pod是通过Controller实现应用的运维,比如
伸缩
、滚动升级
- Pod和Controller之间通过label标签建立关系
- Pod中使用labels打标签
- Controller中使用selector:matchLabels选择标签
3 Deplotment控制器应用场景
- 部署无状态应用
- 管理Pod和ReplicaSet
- 部署、滚动升级等功能
- 应用场景:
web服务``微服务
4 yaml文件字段说明
5 Deployment控制器部署应用
// 1 导出一个deployment控制器的web应用的yaml文件
kubectl create deployment web --image=nginx --dry-run=client -o yaml > web.yaml
// 2 使用yaml文件应用部署
kubectl apply -f web.yaml
// 3 对外发布
kubectl expose deployment web --port=80 --type=NodePort --target-port=6565 --name=web1 -o yaml > web1.yaml
// 4 执行yaml文件
kubectl apply -f web1.yaml
// 5 查看svc
kubectl get pods,svc
// 6 通过ip:port访问测试
6 升级回滚
// 1 修改yaml文件,固定images版本
// 2 部署应用
kubectl apply -f web.yaml
// 3 升级images版本
kubectl set image deployment web nginx=nginx:1.17
// 4 查看升级状态
kubectl rollout status deployment web
// 5 回滚
// 5.1 查看历史版本
kubectl rollout history deployment web
// 5.2 回滚到上一个版本
kubectl rollout undo deployment web
// 5.3 回滚到指定版本
kubectl rollout undo deployment web --to-revision=[指定版本]
6.1 升级过程
- 先生成一个新的pod,下载升级后的版本
- 下载成功后删除原pod
- 运行新的pod
- 如果有多个副本,按顺序一个个执行1~3
- 优点:保证线上服务不中断
7 弹性伸缩
// 将副本数量拓展到指定数量
kubectl scale deployment web --replicas = 10
8 无状态和有状态
8.1 无状态
- 认为Pod都是一样的
- 没有顺序要求
- 不用考虑在那个node上运行
- 随意进行伸缩和拓展
8.2 有状态
- 上面的因素都需要考虑到
- 让每个Pod独立的,要保持Pod启动顺序和唯一性
- 唯一的网络标识符,持久存储
- 有序,比如mysql主从
9 部署有状态应用StatefulSet(TDDO-35)
deployment和statefulset区别
statefulset时有身份(唯一标识),规则如下:
- 根据主机名 + 按照一定规则生成域名
- 每个Pod有唯一主机名
- 唯一域名:
- 格式:主机名称.service名称.名称空间.svc.cluster.local
10 部署守护进程DeamonSet
- 在每个node上运行一个Pod,新加入的node也同样运行在一个pod里。
10.1 新建yaml文件
apiVersion: app/v1
kind: DeamonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
matadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx
ports:
- containerPort: 80
volumnMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostPath:
path: /var/log
10.2 部署守护进程
// 1 部署应用
kubectl apply -f ds.yaml
// 2 进入pod查看日志
kubectl exec -it ds bash
// 3 pod内查看日志
ls /tmp/log
11 一次任务和定时任务
11.1 一次性任务(Job)
新建yaml文件
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command:["prel", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backkoffLimit: 4
部署Job
// 1 部署应用
kubectl create -f job.yaml
// 2 查看job
kubectl get jobs
// 3 查看日志
kubeclt logs [pod名]
11.2 定时任务(CornJob)
新建yaml文件
apiVersion: batch/v1
kind: CornJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *",
jobTemplate:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- data; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
部署Job
// 1 部署应用
kubectl apply -f cronjob.yaml
// 2 查看job
kubectl get jobs
// 3 查看日志
kubeclt logs [pod名]