zoukankan      html  css  js  c++  java
  • 二进制部署K8S集群(十七)之控制器使用

    一.pod控制器

    controller用于控制pod。

    控制器主要分为:

    • ReplicationController(相当于ReplicaSet的老版本,现在建议使用Deployments加ReplicaSet替代RC)
    • ReplicaSet 副本集,控制pod扩容,裁减
    • Deployments 控制pod升级,回退
    • StatefulSets 部署有状态的pod应用
    • DaemonSet 运行在所有集群节点(包括master),比如使用filebeat,node_exporter
    • Jobs 一次性
    • Cronjob 周期性

    1.1 Deployment&ReplicaSet

    1.1.1 Replicaset控制器的功能:
    • 支持新的基于集合的selector(以前的rc里没有这种功能)
    • 通过改变Pod副本数量实现Pod的扩容和缩容
    1.1.2 Deployment控制器的功能:
    • Deployment集成了上线部署、滚动升级、创建副本、回滚等功能
    • Deployment里包含并使用了ReplicaSet
    1.1.3 YAML文件创建deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx2 # deployment名
    spec:
      replicas: 1 # 副本集,deployment里使用了
      selector:
        matchLabels:
          app: nginx # 匹配的pod标签,表示deployment和rs控制器控制带有此标签的pod
     template: # 代表pod的配置模板
       metadata:
         labels:
           app: nginx # pod的标签
      spec:
        containers: # 以下为pod里的容器定义
        - name: nginx
          image: nginx:1.15-alpine
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 80
    kubectl apply -f nginx2-deployment.yml
    kubectl get deployment
    kubectl get pods
    

    1.2 DaemonSet控制器

    • DaemonSet能够让所有(或者特定)的节点运行同一个pod。
    • 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除。
    • 如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
    • 如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。
    • DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等。
    vim nginx-daemonset.yml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nginx-daemonset
    spec:
      selector:
        matchLabels:
          name: nginx-test
     template:
       metadata:
         labels:
           name: nginx-test
       spec:
         tolerations: # tolerations代表容忍
         - key: node-role.kubernetes.io/master  # 能容忍的污点key
           effect: NoSchedule  # kubectl explain pod.spec.tolerations查看(能容忍的污点effect)
         containers:
         - name: nginx
           image: nginx:1.15-alpine
           imagePullPolicy: IfNotPresent
           resources:   # resources资源限制是为了防止master节点的资源被占太多(根据实际情况配置)
           limits:
             memory: 100Mi
           requests:
             memory: 100Mi
    

    1.3 Job控制器

    • Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
    1.3.1 创建一次性job
    vim job.yml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi # job名
    spec:
      template:
        metadata:
          name: pi # pod名
      spec:
        containers:
        - name: pi # 容器名
          image: perl # 此镜像有800多M,可提前导入到所有节点,也可能指定导入到某一节点然后指定调度到此节点
          imagePullPolicy: IfNotPresent
          command: ["perl",  "-Mbignum=bpi", "-wle", "printbpi(2000)"]
        restartPolicy: Never # 执行完后不再重启
    kubectl apply -f job.yml
    kubectl get jobs
    kubectl get pods
    kubectl logs pi-tjq9b
    
    1.3.2 创建固定次数job
    vim job2.yml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: busybox-job
    spec:
      completions: 10 # 执行job的次数
      parallelism: 1 # 执行job的并发数
     template:
       metadata:
         name: busybox-job-pod
      spec:
        containers:
        - name: busybox
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ["echo", "hello"]
        restartPolicy: Never
    kubectl apply -f job2.yml
    kubectl get job
    

    1.4 crontab控制器

    • 类似于Linux系统的crontab,在指定的时间周期运行相关的任务。
    vim cronjob.yml
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: cronjob1
    spec:
      schedule: "* * * * *"         # 分时日月周
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo hello kubernetes
                  imagePullPolicy: IfNotPresent
                  restartPolicy: OnFailure
    kubectl apply -f cronjob.yml
    kubectl get cronjob
    kubectl get pod
    

    1.5 创建service

    cat > nginx_service.yml <<eof
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      namespace: default
    spec:
      clusterIP: 10.2.11.22 # 这个ip可以不指定,让它自动分配,需要与集群分配的网络对应
      type: ClusterIP # ClusterIP类型,也是默认类型
      ports: # 指定service 端口及容器端口
      - port: 80 # service ip中的端口
        protocol: TCP
        targetPort: 80 # pod中的端口
      selector: # 指定后端pod标签(不是deployment的标签)
        app: nginx # 可通过kubectl get pod -l  app=nginx查看哪些pod在使用此标签
    

    1.6 pod版本升级(滚动更新)

    # 升级前查看版本
    kubectl describe pod nginx1-7d9b8757cf-czcz4 | grep Image # 升级前版本
      Image:      nginx:1.15-alpine
    kubectl exec nginx1-7d9b8757cf-czcz4 --nginx -v
    
    # 正式升级
    kubectl set image deployment nginx1 nginx1=nginx:1.16-alpine --record     # 升级为1.16版
    kubectl set image -h       # 查看帮助
    kubectl rollout status deployment nginx1        # 滚动更新
    
    # 查看版本
    kubectl get pods
    kubectl describe pod nginx1-7ffc8cb4fb-tn4ls |grep Image:
    kubectl exec nginx1-7ffc8cb4fb-tn4ls --nginx -v
    

    参数含义解释:
    deployment nginx1 代表名为nginx1的deployment
    nginx1=nginx:1.16-alpine 前面的nginx1为容器名
    --record 表示会记录

    1.7 pod版本回滚

    kubectl rollout history deployment nginx1    # 查看版本历史信息
    kubectl rollout history deployment nginx1--revision=1 # 定义要回退的版本为1
    kubectl rollout undo deployment nginx1 --to-revision=1 # 开始回退
    deployment.extensions/nginx1 rolled back
    kubectl rollout history deployment nginx1 deployment.extensions/nginx1 # 查看有没回退
    kubectl get pods
    kubectl describe pod nginx1-7d9b8757cf-m7rt4 |grep Image:
    kubectl exec nginx1-7d9b8757cf-m7rt4 --nginx -v
    

    1.8 副本扩容

    kubectl scale -h # 查看帮助
    kubectl scale deployment nginx1 --replicas=10 -n kube-public # 扩容为10个副本,改小字则副本缩减
    kubectl get pods -o wide
    
  • 相关阅读:
    iOS 开发学习之 User Interface(2)UIWindow 视窗
    iOS 开发学习之 User Interface(1)APP 生命周期
    OC-学习Tips
    初识Objective-C
    Android代码报错:setContentView(R.layout.activity_main)
    解决Discuz! info: MySQL Query Error
    技术网站
    java调用机器上的shell脚本
    素材网、图片库
    database工具
  • 原文地址:https://www.cnblogs.com/even160941/p/15048637.html
Copyright © 2011-2022 走看看