• 【云原生之k8s】k8s控制器



    在这里插入图片描述

    引言

    控制器:又称之为工作负载,分别包含以下类型控制器

    1. Deployment(无状态)
    2. StatefulSet(有状态)
    3. DaemonSet(只要)
    4. Job
    5. CronJob

    Pod与控制器之间的关系

    1. controllers:在集群上管理和运行容器的对象通过label-selector相关联
    2. Pod通过控制器实现应用的运维,如伸缩,升级等
      在这里插入图片描述

    1、Deployment(无状态)

    1. 部署无状态应用
    2. 管理Pod和ReplicaSet
    3. 具有上线部署、副本设定、滚动升级、回滚等功能
    4. 提供声明式更新,例如只更新一个新的Image
    5. 应用场景:web服务
    [root@master ~]# vim nginx-deployment.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.15.4
            ports:
            - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    kubectl create -f nginx-deployment.yaml
    kubectl get pods,deploy,rs
    
    • 1
    • 2

    在这里插入图片描述

    查看控制器

    kubectl edit deployment/nginx-deployment
    
    • 1

    在这里插入图片描述

    查看历史版本

    kubectl rollout history deployment/nginx-deployment
    
    • 1

    在这里插入图片描述

    2、SatefulSet(有状态)

    1. 部署有状态应用
    2. 解决Pod独立生命周期,保持Pod启动顺序和唯一性
    3. 稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
    4. 有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
    5. 有序,滚动更新
    6. 应用场景:数据库

    2.1 有状态与无状态的区别

    无状态

    1. deployment认为所有的pod都是一样的
    2. 不用考虑顺序的要求
    3. 不用考虑在哪个node节点上运行
    4. 可以随意扩容和缩容

    有状态

    1. 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
    2. 实例之间不对等的关系,以及依靠外部存储的应用

    2.2 常规service和无头服务区别

    1. service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
    2. Headless service :无头服务,不需要cluster-IP,直接绑定具体的Pod的IP

    2.2.1 Service类型

    1. Cluster_IP
    2. NodePort:使用Pod所在节点的IP和其端口范围
    3. Headless
    4. HostPort(ingress、kubesphere)
    5. LoadBalance负载均衡(F5硬件负载均衡器)

    ps:k8s暴露方式主要就3种:ingress loadbalance(SLB/ALB K8S集群外的负载均衡器、Ng、harproxy、KONG、traefik等等) service

    vim nginx-service.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
      labels:
        app: nginx
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
      selector:
        app: nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    [root@master ~]# kubectl create -f nginx-service.yaml 
    service/nginx-svc created
    [root@master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1              443/TCP        5d7h
    nginx-svc    NodePort    10.105.83.81           80:30676/TCP   2s
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在node节点操作,查看集群间通讯
    在这里插入图片描述

    2.2.2 headless方式

    因为Pod动态IP地址,所以常用于绑定DNS访问—来尽可能固定Pod的位置

    [root@master demo]# vim headless.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    kubectl apply -f headless.yaml
    kubectl get svc
    
    • 1
    • 2

    在这里插入图片描述
    再定义一个pod

    [root@master demo]# vim dns-test.yaml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: dns-test
    spec:
      containers:
      - name: busybox
        image: busybox:1.28.4
        args:
        - /bin/sh
        - -c
        - sleep 36000
      restartPolicy: Never
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    验证dns解析

    kubectl create -f dns-test.yaml
    kubectl get svc
    
    • 1
    • 2

    在这里插入图片描述
    解析kubernetes和nginx-svc名称

    kubectl exec -it dns-test sh
    
    • 1

    在这里插入图片描述
    创建StatefulSet.yaml文件

    vim statefulSet.yaml
    
    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 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    清理所有pod

    kubectl delete -f .
    
    • 1

    在这里插入图片描述

    kubectl create -f statefulSet.yaml
    kubectl get pods,svc
    
    • 1
    • 2

    在这里插入图片描述
    解析pod的唯一域名和自身的ip

    kubectl apply -f dns-test.yaml
    
    kubectl exec -it dns-test sh
    
    nslookup nginx-statefulset-0.nginx
    nslookup nginx-statefulset-1.nginx
    nslookup nginx-statefulset-2.nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    总结
    StatefulSet与Deployment区别:有身份的!
    身份三要素:

    1. 域名 nginx-statefulset-0.nginx
    2. 主机名 nginx-statefulset-0
    3. 存储(PVC)

    3、DaemonSet(守护进程集)

    1. 在每一个Node上运行一个Pod
    2. 新加入的Node也同样会自动运行一个Pod
    3. 应用场景:Agent
    [root@master demo]# vim daemonSet.yaml
    
    apiVersion: apps/v1
    kind: DaemonSet 
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.15.4
            ports:
            - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    DaemonSet会在每个node节点都创建一个Pod

    kubectl apply -f daemonSet.yaml
    kubectl get pods
    
    • 1
    • 2

    在这里插入图片描述

    4、Job

    1. Job分为普通任务(Job)和定时任务(CronJob)
    2. 一次性执行
    3. 应用场景:离线数据处理,视频解码等业务

    示例
    重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。

    [root@master demo]# vim job.yaml 
    
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        spec:
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    在node1节点下载perl镜像,因为镜像比较大所以提前下载好

    docker pull perl
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    创建
    在这里插入图片描述
    查看到完成状态
    在这里插入图片描述

    结果输出到控制台
    在这里插入图片描述
    清除job资源

    kubectl get job
    kubectl delete -f job.yaml
    
    • 1
    • 2

    在这里插入图片描述

    5、CronJob

    1. 周期性任务,像Linux的Crontab一样。
    2. 周期性任务
    3. 应用场景:通知,备份

    示例

    [root@master demo]# vim cronjob.yaml
    
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: lcdb
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: lcdb
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo lcdb from the Kubernetes cluster
              restartPolicy: OnFailure
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    kubectl apply -f cronjob.yaml
    
    • 1

    在这里插入图片描述

    kubectl get pod
    kubectl get cronjob
    
    • 1
    • 2

    在这里插入图片描述
    清除cronjob资源

    kubectl delete -f cronjob.yaml
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    Boost序列化指针
    运放:运放Short-Circuit Current短路电流
    CSS - 定位布局(position)
    Vue基础:万字笔记,精华总结
    如何将本地文件上传到Gitee
    JS中字体文件的加载和使用
    Springcloud结合mybatis-plus与nacos实现分布式事务seata
    字节流和处理流的对象反序列化问题
    需求管理手册-对交付物的要求(12)
    研发三维GIS系统笔记/实现wgs84投影-001
  • 原文地址:https://blog.csdn.net/qq_45088125/article/details/126139671