k8s控制器管理

一、控制器资源介绍

控制器资源类型

控制器名称 控制器用途
Replication Controller 比较原始的pod控制器,已经被废弃,由ReplicaSet替代
ReplicaSet ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
Deployment 一个 Deployment 为 PodReplicaSet 提供声明式的更新能力
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
相关推荐
Cicada1281 小时前
微服务是怎么长出来的
微服务·云原生·架构
王da魔1 小时前
Pod管理及优化
云原生·kubernetes
孙克旭_1 小时前
K8s 1.30 实战:Containerd 镜像仓库配置与 nerdctl 管理命令
云原生·容器·kubernetes·containerd
2601_966871402 小时前
全新 云原生系统精讲与全流程落地实践,云原生 DevOpS 进阶实战营
运维·云原生·devops
识途老码2 小时前
docker运行sqlserver
docker·容器·sqlserver
小谈不敲代码2 小时前
【10-kubernetes的控制器】
kubernetes·运维开发
Henry-SAP2 小时前
小米自研AI芯片亮相
人工智能·云原生·sap·erp
心之语歌2 小时前
Windows Docker Desktop 部署 SQL Server 2022 完整安装手册
windows·docker·容器
分布式存储与RustFS2 小时前
把 12TB 生产数据从 MinIO 迁到 RustFS:一次真实迁移的实测
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准