一、控制器资源介绍

控制器资源类型
| 控制器名称 | 控制器用途 |
|---|---|
| Replication Controller | 比较原始的pod控制器,已经被废弃,由ReplicaSet替代 |
| ReplicaSet | ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行 |
| Deployment | 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力 |
| DaemonSet | DaemonSet 确保全指定节点上运行一个 Pod 的副本 |
| StatefulSet | StatefulSet 是用来管理有状态应用的工作负载 API 对象。 |
| Job | 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束 |
| CronJob | Cron Job 创建基于时间调度的 Jobs。 |
| HPA全称Horizontal Pod Autoscaler | 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放 |
控制器参数
| 参数名称 | 字段类型 | 参数说明 |
|---|---|---|
| spec | Object | 详细定义对象,固定值就写Spec |
| spec.replicas | integer | 指定维护pod数量 |
| spec.selector | Object | Selector是对pod的标签查询,与pod数量匹配 |
| spec.selector.matchLabels | string | 指定Selector查询标签的名称和值,以key:value方式指定 |
| spec.template | Object | 指定对pod的描述信息,比如lab标签,运行容器的信息等 |
| spec.template.metadata | Object | 指定pod属性 |
| spec.template.metadata.labels | string | 指定pod标签 |
| spec.template.spec | Object | 详细定义对象 |
| spec.template.spec.containers | list | Spec对象的容器列表定义 |
| spec.template.spec.containers.name | string | 指定容器名称 |
| spec.template.spec.containers.image | string | 指定容器镜像 |
工作负载资源(Workload)
这类资源决定了运行什么应用 以及如何运行。
-
Pod :这是 k8s 中最小、最基础的调度单元。一个 Pod 包含一个或多个容器(如 Docker 容器),共享网络和存储。它本身通常不直接创建,而是由更高级的控制器管理。
-
控制器:用于以各种方式,策略来管理Pod。包含ReplicaSet(控制容器数量),Deployment(管理不同replica版本),DaemonSet(确保集群主机都运行一个pod),job/cronjob(一次任务/定时任务),StatefulSet(管理有状态服务,提供域名)。
二、Replicaset控制器
匹配标签来控制pod数量
1.建立控制器
bash
[root@k8s-master deployment]# kubectl create deployment webcluster --replicas 2 --image myapp:v1 --dry-run=client -o yaml > repset.yml
[root@k8s-master deployment]# vim repset.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master deployment]# kubectl apply -f repset.yml
deployment.apps/webcluster created
[root@k8s-master deployment]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-5jqxm 1/1 Running 0 19s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j5488 1/1 Running 0 19s app=webcluster,pod-template-hash=77c87d9946
#拉伸
[root@k8s-master deployment]# kubectl scale deployment webcluster --replicas 3
deployment.apps/webcluster scaled
[root@k8s-master deployment]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-5jqxm 1/1 Running 0 49s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j5488 1/1 Running 0 49s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j84bg 1/1 Running 0 2s app=webcluster,pod-template-hash=77c87d9946
2.测试replicaset数量控制功能
bash
[root@k8s-master deployment]# kubectl label pod webcluster-77c87d9946-5jqxm app=ggg --overwrite
[root@k8s-master deployment]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-5jqxm 1/1 Running 0 2m18s app=ggg,pod-template-hash=77c87d9946
webcluster-77c87d9946-hdqrd 1/1 Running 0 5s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j5488 1/1 Running 0 2m18s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j84bg 1/1 Running 0 91s app=webcluster,pod-template-hash=77c87d9946
[root@k8s-master deployment]# kubectl label pod webcluster-77c87d9946-5jqxm app=ggg --overwrite
[root@k8s-master deployment]# kubectl label pod webcluster-77c87d9946-5jqxm app=webcluster --overwrite
pod/webcluster-77c87d9946-5jqxm labeled
[root@k8s-master deployment]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-5jqxm 1/1 Running 0 3m17s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j5488 1/1 Running 0 3m17s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-j84bg 1/1 Running 0 2m30s app=webcluster,pod-template-hash=77c87d9946

三、Deployment控制器
通过操作 ReplicaSet 来间接管理 Pod
当deployment更新时,会新建一个replicaset控制器,根据策略,新replicaset每起一个pod,旧的replicaset就会关闭一个pod,更新结束后旧的控制器不删除
1.环境准备
bash
[root@k8s-master deployment]# kubectl create deployment webcluster --replicas 2 --image myapp:v1 --dry-run=client -o yaml > dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
minReadySeconds: 10
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
# resources: {}
[root@k8s-master deployment]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@k8s-master deployment]# kubectl expose deployment webcluster --port 80 --target-port 80
service/webcluster exposed
[root@k8s-master deployment]# kubectl describe services webcluster
Name: webcluster
Namespace: default
Labels: app=webcluster
Annotations: <none>
Selector: app=webcluster
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.109.2.14
IPs: 10.109.2.14
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.31:80,10.244.1.54:80
Session Affinity: None
Internal Traffic Policy: Cluster
Events: <none>
[root@k8s-master deployment]# curl 10.109.2.14
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
2.升级和回滚
升级
bash
[root@k8s-master deployment]# vim dep.yml
#myapp:v1改成v2
[root@k8s-master deployment]# kubectl apply -f dep.yml
[root@k8s-master deployment]# curl 10.109.2.14
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

回滚
bash
[root@k8s-master deployment]# vim dep.yml
#myapp:v2 改回myapp:v1
[root@k8s-master deployment]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@k8s-master deployment]# curl 10.109.2.14
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
3,版本更新管理及优化
查看策略信息
bash
[root@k8s-master deployment]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 25% max unavailable, 25% max surge

设定更新策略
bash
#监控pods数量变化
[root@k8s-master deployment]# watch -n 1 "kubectl get pods -o wide;kubectl get deployments.apps webcluster"
[root@k8s-master deployment]# vim dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
minReadySeconds: 10
replicas: 6
selector:
matchLabels:
app: webcluster
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master deployment]# kubectl apply -f dep.yml
[root@k8s-master deployment]# vim dep.yml
#myapp:v1改为v2
[root@k8s-master deployment]# kubectl apply -f dep.yml
更新前

更新时

更新暂停和恢复
bash
[root@k8s-master deployment]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
1 <none>
#暂停更新
[root@k8s-master deployment]# kubectl rollout pause deployment webcluster
deployment.apps/webcluster paused
#暂停后,更新成功,但还不会生效
[root@k8s-master deployment]# vim dep.yml
[root@k8s-master deployment]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@k8s-master deployment]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
1 <none>
#开启更新
[root@k8s-master deployment]# kubectl rollout resume deployment webcluster
deployment.apps/webcluster resumed
[root@k8s-master deployment]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
1 <none>
2 <none>
四.DaemonSet
每个节点都有一个pod
环境准备
bash
#查看当前节点信息
[root@k8s-master deployment]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 5d8h v1.35.7
k8s-node1 Ready <none> 5d8h v1.35.7
k8s-node2 Ready <none> 5d8h v1.35.7
[root@k8s-master deployment]# kubectl create deployment daemonset --image myapp:v1 --dry-run=client -o yaml > daemonset.yml
[root@k8s-master deployment]# vim daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: daemonset
name: daemonset
spec:
selector:
matchLabels:
app: daemonset
template:
metadata:
labels:
app: daemonset
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master deployment]# kubectl apply -f daemonset.yml
daemonset.apps/daemonset created
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
daemonset-9nz6v 1/1 Running 0 4s
daemonset-lws6r 1/1 Running 0 4s

再开一台200主机,命名ceph,将其加入集群
bash
[root@ceph ~]# kubeadm join 172.25.254.100:6443 --token loagn8.kl3quporrl797m5h --discovery-token-ca-cert-hash sha256:33322e3b97dc16ff35119b916f19c3f41b2b0cd734aad54d1da3a654a7816493 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master deployment]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ceph Ready <none> 5s v1.35.7
k8s-master Ready control-plane 5d8h v1.35.7
k8s-node1 Ready <none> 5d8h v1.35.7
k8s-node2 Ready <none> 5d8h v1.35.7
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
daemonset-9nz6v 1/1 Running 0 20s
daemonset-lws6r 1/1 Running 0 20m
daemonset-r665j 1/1 Running 0 4m30s
五.Job控制
bash
[root@k8s-master deployment]# kubectl create job job --image perl:5.34.0 --dry-run=client -o yaml > job.yml
[root@k8s-master deployment]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: job
spec:
completions: 6
parallelism: 2
backoffLimit: 4
template:
spec:
containers:
- image: busybox:latest
name: job
command: ["/bin/sh","-c"]
args:
- |
echo this is testjob message
sleep 10
restartPolicy: Never
[root@k8s-master deployment]# kubectl apply -f job.yml
[root@k8s-master deployment]# kubectl get pods -o wide -w
[root@k8s-master deployment]# kubectl logs pods/job-clt5j
this is testjob message

六.Cronjob控制
bash
[root@k8s-master deployment]# kubectl create cronjob cronjob --image busybox --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
[root@k8s-master deployment]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob
spec:
jobTemplate:
metadata:
name: cronjob
spec:
template:
spec:
containers:
- image: busybox
name: cronjob
command:
- /bin/sh
- -c
- echo "hello myxin"
restartPolicy: OnFailure
schedule: '* * * * *'
[root@k8s-master deployment]# kubectl apply -f cronjob.yml
cronjob.batch/cronjob created
[root@k8s-master deployment]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
cronjob-29794323-fdfg5 0/1 Pending 0 0s
cronjob-29794323-fdfg5 0/1 Pending 0 0s
cronjob-29794323-fdfg5 0/1 ContainerCreating 0 0s
cronjob-29794323-fdfg5 0/1 Completed 0 3s
cronjob-29794323-fdfg5 0/1 Completed 0 4s
cronjob-29794323-fdfg5 0/1 Completed 0 5s
[root@k8s-master deployment]# kubectl logs pods/cronjob-29794323-fdfg5
hello myxin

