什么是controller
在集群上管理和运行容器的对象
Pod和Controller的关系
Pod通过Controller实现应用的运维,比如伸缩、滚动升级等等。
Pod和Controller之间通过label标签建立关系。
控制器又叫工作负载。
Deployment
应用场景
- 部署无状态应用
- 管理Pod和ReplicaSet
- 部署、滚动升级等功能
- web服务、微服务
使用deployment部署应用
# 导入yaml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
# 使用yaml部署应用
kubectl apply -f web.yaml
# 对外发布(暴露对外端口号)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl apply -f web1.yaml
kubectl get pods,svc
# 使用任意节点IP+分配的端口即可访问Pod
应用升级回滚和弹性伸缩
# 应用升级
kubectl set image deployment web nginx=nginx:1.15
# 查看升级状态
kubectl rollout status deployment web
# 查看历史版本
kubectl rollout history deployment web
# 回退到上一个版本
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment web --to-reversion=2
# 弹性伸缩
kubectl scale deployment web --replicas=10
StatefulSet
有状态和无状态
无状态:
- 认为Pod都是相同的
- 没有顺序要求
- 不用考虑在哪个node上运行
- 随即进行伸缩和扩展
有状态:
- 上面因素都需要考虑到
- 让每个Pod都是独立的,保持Pod的启动顺序和唯一性
部署有状态应用
无头service:ClusterIP值为None
使用StatefulSet部署有状态应用
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f sts.yaml
kubectl get pods
可以看到有三个Pod,每个都有唯一名称
kubectl get svc
查看创建的无头service
deployment和statefulset区别在于statefulset中Pod有唯一标识
唯一域名格式:主机名称.service名称.名称空间.svc.cluster.local
DaemonSet
部署守护进程,确保所有node运行同一个应用
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
images: nginx
ports:
- containerPort: 80
volumeMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostpath:
path: /var/log
kubectl apply -f ds.yaml
kubectl get pods
kubectl exec -it ds-test-cbk6v bash
ls /tmp/log
一次性任务Job和定时任务Cronjob
一次性任务
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
kubectl create -f job.yaml
kubectl get jobs
kubectl get pods
可以看到pi已经完成计算,STATUS显示Completed。
kubectl delete -f job.yaml
定时任务cronjob
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- data; echo Hello from the Kubernetes Cluster
restartPolicy: OnFailure
kubectl apply -f cronjob.yaml
kubectl get pods
可以看出每隔一段时间执行任务