十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

k8s中的控制器的使用

k8s中的控制器的使用 什么是控制器官方文档https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/控制器也是管理pod的一种手段自主式podpod退出或意外关闭后不会被重新创建控制器管理的 Pod在控制器的生命周期里始终要维持 Pod 的副本数目Pod控制器是管理pod的中间层使用Pod控制器之后只需要告诉Pod控制器想要多少个什么样的Pod就可以了它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障它会基于指定策略重新编排Pod当建立控制器后会把期望值写入etcdk8s中的apiserver检索etcd中我们保存的期望状态并对比pod的当前状态如果出现差异代码自驱动立即恢复控制器常用类型控制器名称控制器用途Replication Controller比较原始的pod控制器已经被废弃由ReplicaSet替代ReplicaSetReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行Deployment一个 Deployment 为 [Pod] 和 [ReplicaSet] 提供声明式的更新能力DaemonSetDaemonSet 确保全指定节点上运行一个 Pod 的副本StatefulSetStatefulSet 是用来管理有状态应用的工作负载 API 对象。JobStatefulSet 是用来管理有状态应用的工作负载 API 对象。CronJobCron Job 创建基于时间调度的 Jobs。HPA全称Horizontal Pod Autoscaler根据资源利用率自动调整service中Pod数量实现Pod水平自动缩放replicaset控制器replicaset功能ReplicaSet 是下一代的 Replication Controller官方推荐使用ReplicaSetReplicaSet和Replication Controller的唯一区别是选择器的支持ReplicaSet支持新的基于集合的选择器需求ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行虽然 ReplicaSets 可以独立使用但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制replicaset参数说明参数名称字段类型参数说明specObject详细定义对象固定值就指定维护pod数量Specspec.replicasinteger指定维护pod数量spec.selectorObjectSelector是对pod的标签查询与pod数量匹配spec.selector.matchLabelsstring指定Selector查询标签的名称和值以keyvalue方式指定spec.templateObject指定对pod的描述信息比如lab标签运行容器的信息等spec.template.metadataObject指定pod属性spec.template.metadata.labelsstring指定pod标签spec.template.specObject详细定义对象spec.template.spec.containerslistSpec对象的容器列表定义spec.template.spec.containers.namestring指定容器名称spec.template.spec.containers.imagestring指定容器镜像[rootmaster controler]# kubectl create deployment webcluster --image myapp:v1 --dry-runclient -o yaml repset.yml [rootmaster controler]# vim repset.yml apiVersion: apps/v1 kind: ReplicaSet 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 [rootmaster controler]# kubectl apply -f repset.yml #打开一个新的shell [rootmaster ~]# watch -n 1 kubectl get pods --show-labels Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:08:32 2026 NAME READY STATUS RESTARTS AGE LABELS webcluster-tbxq4 1/1 Running 0 6m49s appwebcluster webcluster-jna23 1/1 Running 0 6m49s appwebcluster #拉伸 kubectl scale replicaset webcluster --replicas 4 kubectl scale replicaset webcluster --replicas 2 kubectl scale replicaset webcluster --replicas 0 [rootmaster controler]# vim repset.yml 。。。。 spec: replicas: 4 。。。。 [rootmaster controler]# kubectl apply -f repset.yml [rootmaster ~]# watch -n 1 kubectl get pods --show-labels Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:11:06 2026 NAME READY STATUS RESTARTS AGE LABELS webcluster-4sxz4 1/1 Running 0 13s appwebcluster webcluster-lvtsn 1/1 Running 0 13s appwebcluster webcluster-tbxq4 1/1 Running 0 9m23s appwebcluster webcluster-tr5qk 1/1 Running 0 13s appwebclusterdeployment 控制器deployment控制器的功能为了更好的解决服务编排的问题kubernetes在V1.2版本开始引入了Deployment控制器。Deployment控制器并不直接管理pod而是通过管理ReplicaSet来间接管理PodDeployment管理ReplicaSetReplicaSet管理PodDeployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法在Deployment中ReplicaSet相当于一个版本典型的应用场景用来创建Pod和ReplicaSet滚动更新和回滚扩容和缩容暂停与恢复建立deployment控制器[rootmaster controler]# kubectl create deployment webcluster --image myapp:v1 --dry-runclient -o yaml dep.yml [rootmaster controler]# vim dep.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: webcluster name: webcluster spec: minReadySeconds: 5 replicas: 2 selector: matchLabels: app: webcluster # strategy: {} template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1 name: myapp # resources: {} [rootmaster controler]# kubectl apply -f dep.yml #监控部分显示效果 Every 1.0s: kubectl get pods --show-labels;echo ;kubectl get replicase... master: Sat Apr 11 10:43:24 2026 NAME READY STATUS RESTARTS AGE LABELS webcluster-77c87d9946-49kh5 1/1 Running 0 45s appwebcluster,pod-template-hash77c87d9946 webcluster-77c87d9946-m2x2d 1/1 Running 0 45s appwebcluster,pod-template-hash77c87d9946 NAME DESIRED CURRENT READY AGE webcluster-77c87d9946 2 2 2 45s #发布服务 [rootmaster controler]# kubectl expose deployment webcluster --port 80 --target-port 80 [rootmaster controler]# kubectl describe services webcluster Name: webcluster Namespace: default Labels: appwebcluster Annotations: none ..... #访问 [rootmaster controler]# curl 10.107.142.60 Hello MyApp | Version: v1 | a hrefhostname.htmlPod Name/a升级和回滚#升级 [rootmaster controler]# vim dep.yml 。。。。 spec: minReadySeconds: 5 replicas: 2 selector: matchLabels: app: webcluster # strategy: {} template: metadata: labels: app: webcluster spec: containers: - image: myapp:v2 #升级为版本2 name: myapp 。。。。 [rootmaster controler]# kubectl apply -f dep.yml deployment.apps/webcluster configured [rootmaster controler]# curl 10.107.142.60 Hello MyApp | Version: v2 | a hrefhostname.htmlPod Name/a #回滚 [rootmaster controler]# vim dep.yml 。。。。 spec: minReadySeconds: 5 replicas: 2 selector: matchLabels: app: webcluster # strategy: {} template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1 #回滚为版本1 name: myapp 。。。。 [rootmaster controler]# kubectl apply -f dep.yml [rootmaster controler]# curl 10.107.142.60 Hello MyApp | Version: v1 | a hrefhostname.htmlPod Name/a滚动更新策略[rootk8s-master ~]# vim dep.yml apiVersion: apps/v1 kind: Deployment metadata: name: deployment spec: minReadySeconds: 5 #最小就绪时间指定pod每隔多久更新一次 replicas: 4 strategy: #指定更新策略 rollingUpdate: maxSurge: 1 #比定义pod数量多几个 maxUnavailable: 0 #比定义pod个数少几个 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - image: myapp:v1 name: myapp [rootk8s2 pod]# kubectl apply -f deployment-example.yaml暂停及恢复在实际生产环境中我们做的变更可能不止一处当修改了一处后如果执行变更就直接触发了我们期望的触发时当我们把所有修改都搞定后一次触发暂停避免触发不必要的线上更新[rootk8s2 pod]# kubectl rollout pause deployment deployment-example [rootk8s2 pod]# vim deployment-example.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deployment-example spec: minReadySeconds: 5 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 replicas: 6 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: nginx resources: limits: cpu: 0.5 memory: 200Mi requests: cpu: 0.5 memory: 200Mi [rootk8s2 pod]# kubectl apply -f deployment-example.yaml #调整副本数不受影响 [rootk8s-master ~]# kubectl describe pods deployment-7f4786db9c-8jw22 Name: deployment-7f4786db9c-8jw22 Namespace: default Priority: 0 Service Account: default Node: k8s-node1/172.25.254.10 Start Time: Mon, 02 Sep 2024 00:27:20 0800 Labels: appmyapp pod-template-hash7f4786db9c Annotations: none Status: Running IP: 10.244.1.31 IPs: IP: 10.244.1.31 Controlled By: ReplicaSet/deployment-7f4786db9c Containers: myapp: Container ID: docker://01ad7216e0a8c2674bf17adcc9b071e9bfb951eb294cafa2b8482bb8b4940c1d Image: myapp:v2 Image ID: docker-pullable://myappsha256:5f4afc8302ade316fc47c99ee1d41f8ba94dbe7e3e7747dd87215a15429b9102 Port: none Host Port: none State: Running Started: Mon, 02 Sep 2024 00:27:21 0800 Ready: True Restart Count: 0 Environment: none Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mfjjp (ro) Conditions: Type Status PodReadyToStartContainers True Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-mfjjp: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: nil DownwardAPI: true QoS Class: BestEffort Node-Selectors: none Tolerations: node.kubernetes.io/not-ready:NoExecute opExists for 300s node.kubernetes.io/unreachable:NoExecute opExists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 6m22s default-scheduler Successfully assigned default/deployment-7f4786db9c-8jw22 to k8s-node1 Normal Pulled 6m22s kubelet Container image myapp:v2 already present on machine Normal Created 6m21s kubelet Created container myapp Normal Started 6m21s kubelet Started container myapp #但是更新镜像和修改资源并没有触发更新 [rootk8s2 pod]# kubectl rollout history deployment deployment-example deployment.apps/deployment-example REVISION CHANGE-CAUSE 3 none 4 none #恢复后开始触发更新 [rootk8s2 pod]# kubectl rollout resume deployment deployment-example [rootk8s2 pod]# kubectl rollout history deployment deployment-example deployment.apps/deployment-example REVISION CHANGE-CAUSE 3 none 4 none 5 none #回收 [rootk8s2 pod]# kubectl delete -f deployment-example.yamldaemonset控制器DaemonSet 确保全部或者某些节点上运行一个 Pod 的副本。当有节点加入集群时 也会为他们新增一个 Pod 当有节点从集群移除时这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 PodDaemonSet 的典型用法- 在每个节点上运行集群存储 DaemonSet例如 glusterd、ceph。- 在每个节点上运行日志收集 DaemonSet例如 fluentd、logstash。- 在每个节点上运行监控 DaemonSet例如 Prometheus Node Exporter、zabbix agent等- 一个简单的用法是在所有的节点上都启动一个 DaemonSet将被作为每种类型的 daemon 使用- 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet但具有不同的标志 并且对不同硬件类型具有不同的内存、CPU 要求[rootk8s2 pod]# cat daemonset-example.yml apiVersion: apps/v1 kind: DaemonSet metadata: name: daemonset-example spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: tolerations: #对于污点节点的容忍 - effect: NoSchedule operator: Exists containers: - name: nginx image: nginx [rootk8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES daemonset-87h6s 1/1 Running 0 47s 10.244.0.8 k8s-master none none daemonset-n4vs4 1/1 Running 0 47s 10.244.2.38 k8s-node2 none none daemonset-vhxmq 1/1 Running 0 47s 10.244.1.40 k8s-node1 none none #回收 [rootk8s2 pod]# kubectl delete -f daemonset-example.ymljob 控制器Job主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务Job特点如下当Job创建的pod执行成功结束时Job将记录成功结束的pod数量当成功结束的pod达到指定的数量时Job将完成执行[rootmaster controler]# kubectl create job job --image perl:5.34.0 --dry-runclient -o yaml job.yml [rootmaster controler]# vim job.yml apiVersion: batch/v1 kind: Job metadata: name: testjob spec: completions: 6 parallelism: 2 backoffLimit: 4 template: spec: containers: - image: busybox name: testjob command: [/bin/sh, -c] args: - | echo this is testjob message sleep 10 restartPolicy: Never [rootmaster controler]# kubectl apply -f job.yml job.batch/job created [rootk8s-master controller]# kubectl logs pods/testjob-4cdlr this is testjob messagecronjob 控制器Cron Job 创建基于时间调度的 Jobs。CronJob控制器以Job控制器资源为其管控对象并借助它管理pod资源对象CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。CronJob可以在特定的时间点(反复的)去运行job任务。[rootmaster controler]# kubectl create cronjob cronjob --image busybox --schedule * * * * * --dry-runclient -o yaml cronjob.yml [rootmaster controler]# 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 timinglee restartPolicy: OnFailure schedule: * * * * * [rootmaster controler]# kubectl apply -f cronjob.yml #整分运行
返回列表