• k8s中的Controller


    什么是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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    应用升级回滚和弹性伸缩

    # 应用升级
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    
    • 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
    kubectl apply -f sts.yaml
    kubectl get pods
    
    • 1
    • 2

    可以看到有三个Pod,每个都有唯一名称

    kubectl get svc
    
    • 1

    查看创建的无头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
    
    • 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
    kubectl apply -f ds.yaml
    kubectl get pods
    
    • 1
    • 2
    kubectl exec -it ds-test-cbk6v bash
    ls /tmp/log
    
    • 1
    • 2

    一次性任务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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    kubectl create -f job.yaml
    kubectl get jobs
    kubectl get pods
    
    • 1
    • 2
    • 3

    可以看到pi已经完成计算,STATUS显示Completed。

    kubectl delete -f job.yaml
    
    • 1

    定时任务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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    kubectl apply -f cronjob.yaml
    
    • 1
    kubectl get pods
    
    • 1

    可以看出每隔一段时间执行任务

  • 相关阅读:
    MongoDB基础入门
    springboot-aop-redis-lua 实现的分布式限流方案
    Ubuntu20.04+RTX3090ti+cuda11.6+cudnn8.4.1+pytorch安装过程记录
    云计算的两地三中心和灾备介绍
    正点原子嵌入式linux驱动开发——Linux按键输入
    Unity DOTS技术(八)状态组件
    【赠书活动】AI时代项目经理必备技能
    接口 测试
    微信3.7版小程序数据分析
    使用uni-app开发app时遇到mqtt.js不可用的问题
  • 原文地址:https://blog.csdn.net/qq_41242680/article/details/126525283