• Pod控制器


    目录

    一、Pod控制器

    1.Pod控制器及其功用

    2.pod控制器有多种类型

    3.Pod与控制器之间的关系

    (1)Deployment

    (2)查看控制器配置

    (3)查看历史版本

    二、SatefulSet

    三、安装CoreDNS

    1.方法一:

    2.方法二

    四、创建pv

    1.定义PV

    2.创建statefulset

    3.滚动更新

    五、DaemonSet

    六、Job

    七、CronJob 


    一、Pod控制器

    1.Pod控制器及其功用

    Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。

    2.pod控制器有多种类型

    (1)ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。

    ReplicaSet主要三个组件组成:

    1)用户期望的pod副本数量
    2)标签选择器,判断哪个pod归自己管理
    3)当现存的pod数量不足,会根据pod资源模板进行新建
    帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

    (2)Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。

     ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC的作用。

    (3)DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
    特性:服务是无状态的
    服务必须是守护进程

    (4)StatefulSet:管理有状态应用

    (5)Job:只要完成就立即退出,不需要重启或重建

    (6)Cronjob:周期性任务控制,不需要持续后台运行

    3.Pod与控制器之间的关系

    controllers:在集群上管理和运行容器的 pod 对象, pod 通过 label-selector 相关联。
    Pod 通过控制器实现应用的运维,如伸缩,升级等。

    (1)Deployment

    1. vim nginx-deployment.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-deployment
    6. labels:
    7. app: nginx
    8. spec:
    9. replicas: 3
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. containers:
    19. - name: nginx
    20. image: nginx:1.15.4
    21. ports:
    22. - containerPort: 80
    23. kubectl create -f nginx-deployment.yaml
    24. kubectl get pods,deploy,rs

    (2)查看控制器配置

    1. kubectl edit deployment/nginx-deployment
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. annotations:
    6. deployment.kubernetes.io/revision: "1"
    7. creationTimestamp: "2021-04-19T08:13:50Z"
    8. generation: 1
    9. labels:
    10. app: nginx Deployment资源的标签
    11. name: nginx-deployment
    12. namespace: default
    13. resourceVersion: "167208"
    14. selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deployment
    15. uid: d9d3fef9-20d2-4196-95fb-0e21e65af24a
    16. spec:
    17. progressDeadlineSeconds: 600
    18. replicas: 3 期望的pod数量,默认是1
    19. revisionHistoryLimit: 10
    20. selector:
    21. matchLabels:
    22. app: nginx
    23. strategy:
    24. rollingUpdate:
    25. maxSurge: 25% 升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
    26. maxUnavailable: 25% 升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
    27. type: RollingUpdate 滚动升级
    28. template:
    29. metadata:
    30. creationTimestamp: null
    31. labels:
    32. app: nginx Pod副本关联的标签
    33. spec:
    34. containers:
    35. - image: nginx:1.15.4 镜像名称
    36. imagePullPolicy: IfNotPresent 镜像拉取策略
    37. name: nginx
    38. ports:
    39. - containerPort: 80 容器暴露的监听端口
    40. protocol: TCP
    41. resources: {}
    42. terminationMessagePath: /dev/termination-log
    43. terminationMessagePolicy: File
    44. dnsPolicy: ClusterFirst
    45. restartPolicy: Always 容器重启策略
    46. schedulerName: default-scheduler
    47. securityContext: {}
    48. terminationGracePeriodSeconds: 30
    49. ......

    (3)查看历史版本

    kubectl rollout history deployment/nginx-deployment

    二、SatefulSet

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: nginx
    5. labels:
    6. app: nginx
    7. spec:
    8. ports:
    9. - port: 80
    10. name: web
    11. clusterIP: None
    12. selector:
    13. app: nginx
    14. ---
    15. apiVersion: apps/v1
    16. kind: StatefulSet
    17. metadata:
    18. name: web
    19. spec:
    20. selector:
    21. matchLabels:
    22. app: nginx # has to match .spec.template.metadata.labels
    23. serviceName: "nginx"
    24. replicas: 3 # by default is 1
    25. template:
    26. metadata:
    27. labels:
    28. app: nginx # has to match .spec.selector.matchLabels
    29. spec:
    30. terminationGracePeriodSeconds: 10
    31. containers:
    32. - name: nginx
    33. image: k8s.gcr.io/nginx-slim:0.8
    34. ports:
    35. - containerPort: 80
    36. name: web
    37. volumeMounts:
    38. - name: www
    39. mountPath: /usr/share/nginx/html
    40. volumeClaimTemplates:
    41. - metadata:
    42. name: www
    43. spec:
    44. accessModes: [ "ReadWriteOnce" ]
    45. storageClassName: "my-storage-class"
    46. resources:
    47. requests:
    48. storage: 1Gi

    StatefulSet组成

    Headless Service(无头服务):用于为Pod资源标识符生成可解析的DNS记录。
    volumeClaimTemplates(存储卷申请模板):基于静态或动态PV供给方式为Pod资源提供专有的固定存储。
    StatefulSet:用于管控Pod资源。
     

    三、安装CoreDNS

    1.方法一:

    下载链接:https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base

    1. vim transforms2sed.sed
    2. s/__DNS__SERVER__/10.0.0.2/g
    3. s/__DNS__DOMAIN__/cluster.local/g
    4. s/__DNS__MEMORY__LIMIT__/170Mi/g
    5. s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: coredns.yaml.base/g
    6. sed -f transforms2sed.sed coredns.yaml.base > coredns.yaml

    2.方法二

    上传 coredns.yaml 文件

    1. kubectl create -f coredns.yaml
    2. kubectl get pods -n kube-system
    3. vim nginx-service.yaml
    4. apiVersion: v1
    5. kind: Service
    6. metadata:
    7. name: nginx-service
    8. labels:
    9. app: nginx
    10. spec:
    11. type: NodePort
    12. ports:
    13. - port: 80
    14. targetPort: 80
    15. selector:
    16. app: nginx
    17. kubectl create -f nginx-service.yaml
    18. kubectl get svc
    1. vim pod6.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: dns-test
    6. spec:
    7. containers:
    8. - name: busybox
    9. image: busybox:1.28.4
    10. args:
    11. - /bin/sh
    12. - -c
    13. - sleep 36000
    14. restartPolicy: Never
    15. kubectl create -f pod6.yaml

    解析kubernetes和nginx-service名称

    1. kubectl exec -it dns-test sh
    2. / # nslookup kubernetes

    查看statefulset的定义

    1. kubectl explain statefulset
    2. kubectl explain statefulset.spec

    清单定义StatefulSet

    一个完整的 StatefulSet 控制器由一个 Headless Service、一个 StatefulSet 和一个 volumeClaimTemplate 组成。

    1. vim stateful-demo.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: myapp-svc
    6. labels:
    7. app: myapp-svc
    8. spec:
    9. ports:
    10. - port: 80
    11. name: web
    12. clusterIP: None
    13. selector:
    14. app: myapp-pod
    15. ---
    16. apiVersion: apps/v1
    17. kind: StatefulSet
    18. metadata:
    19. name: myapp
    20. spec:
    21. serviceName: myapp-svc
    22. replicas: 3
    23. selector:
    24. matchLabels:
    25. app: myapp-pod
    26. template:
    27. metadata:
    28. labels:
    29. app: myapp-pod
    30. spec:
    31. containers:
    32. - name: myapp
    33. image: ikubernetes/myapp:v1
    34. ports:
    35. - containerPort: 80
    36. name: web
    37. volumeMounts:
    38. - name: myappdata
    39. mountPath: /usr/share/nginx/html
    40. volumeClaimTemplates:
    41. - metadata:
    42. name: myappdata
    43. annotations: 动态PV创建时,使用annotations在PVC里声明一个StorageClass对象的标识进行关联
    44. volume.beta.kubernetes.io/storage-class: nfs-client-storageclass
    45. spec:
    46. accessModes: ["ReadWriteOnce"]
    47. resources:
    48. requests:
    49. storage: 2Gi

    由于 StatefulSet 资源依赖于一个实现存在的 Headless 类型的 Service 资源,所以需要先定义一个名为 myapp-svc 的 Headless Service 资源,用于为关联到每个 Pod 资源创建 DNS 资源记录。接着定义了一个名为 myapp 的 StatefulSet 资源,它通过 Pod 模板创建了 3 个 Pod 资源副本,并基于 volumeClaimTemplates 向前面创建的PV进行了请求大小为 2Gi 的专用存储卷。

    四、创建pv

    stor01节点

    1. mkdir -p /data/volumes/v{1,2,3,4,5}
    2. vim /etc/exports
    3. /data/volumes/v1 网段/24(rw,no_root_squash)
    4. /data/volumes/v2 网段/24(rw,no_root_squash)
    5. /data/volumes/v3 网段/24(rw,no_root_squash)
    6. /data/volumes/v4 网段/24(rw,no_root_squash)
    7. /data/volumes/v5 网段/24(rw,no_root_squash)
    8. systemctl restart rpcbind
    9. systemctl restart nfs
    10. exportfs -arv
    11. showmount -e

    1.定义PV

    1. vim pv-demo.yaml
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5. name: pv001
    6. labels:
    7. name: pv001
    8. spec:
    9. nfs:
    10. path: /data/volumes/v1
    11. server: stor01
    12. accessModes: ["ReadWriteMany","ReadWriteOnce"]
    13. capacity:
    14. storage: 1Gi
    15. ---
    16. apiVersion: v1
    17. kind: PersistentVolume
    18. metadata:
    19. name: pv002
    20. labels:
    21. name: pv002
    22. spec:
    23. nfs:
    24. path: /data/volumes/v2
    25. server: stor01
    26. accessModes: ["ReadWriteOnce"]
    27. capacity:
    28. storage: 2Gi
    29. ---
    30. apiVersion: v1
    31. kind: PersistentVolume
    32. metadata:
    33. name: pv003
    34. labels:
    35. name: pv003
    36. spec:
    37. nfs:
    38. path: /data/volumes/v3
    39. server: stor01
    40. accessModes: ["ReadWriteMany","ReadWriteOnce"]
    41. capacity:
    42. storage: 2Gi
    43. ---
    44. apiVersion: v1
    45. kind: PersistentVolume
    46. metadata:
    47. name: pv004
    48. labels:
    49. name: pv004
    50. spec:
    51. nfs:
    52. path: /data/volumes/v4
    53. server: stor01
    54. accessModes: ["ReadWriteMany","ReadWriteOnce"]
    55. capacity:
    56. storage: 2Gi
    57. ---
    58. apiVersion: v1
    59. kind: PersistentVolume
    60. metadata:
    61. name: pv005
    62. labels:
    63. name: pv005
    64. spec:
    65. nfs:
    66. path: /data/volumes/v5
    67. server: stor01
    68. accessModes: ["ReadWriteMany","ReadWriteOnce"]
    69. capacity:
    70. storage: 2Gi
    71. kubectl apply -f pv-demo.yaml
    72. kubectl get pv

    2.创建statefulset

    1. kubectl apply -f stateful-demo.yaml
    2. kubectl get svc 查看创建的无头服务myapp-svc
    3. kubectl get sts 查看statefulset
    4. kubectl get pvc 查看pvc绑定
    5. kubectl get pv 查看pv绑定
    6. kubectl get pods 查看Pod信息
    7. kubectl delete -f stateful-demo.yaml

    当删除的时候是从myapp-2开始进行删除的,关闭是逆向关闭

    kubectl get pods -w

    此时PVC依旧存在的,再重新创建pod时,依旧会重新去绑定原来的pvc

    1. kubectl apply -f stateful-demo.yaml
    2. kubectl get pvc

    3.滚动更新

           StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。如下操作的滚动更新是按照2-0的顺序更新。

    1. vim stateful-demo.yaml 修改image版本为v2
    2. .....
    3. image: ikubernetes/myapp:v2
    4. ....
    5. kubectl apply -f stateful-demo.yaml
    6. kubectl get pods -w 查看滚动更新的过程

    在创建的每一个Pod中,每一个pod自己的名称都是可以被解析的

    kubectl exec -it myapp-0 /bin/sh

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

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

    常规service和无头服务区别
    service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
    Headless service:无头服务,不需要cluster-IP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
     

    1. vim pod6.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: dns-test
    6. spec:
    7. containers:
    8. - name: busybox
    9. image: busybox:1.28.4
    10. args:
    11. - /bin/sh
    12. - -c
    13. - sleep 36000
    14. restartPolicy: Never
    15. vim sts.yaml
    16. apiVersion: v1
    17. kind: Service
    18. metadata:
    19. name: nginx
    20. labels:
    21. app: nginx
    22. spec:
    23. ports:
    24. - port: 80
    25. name: web
    26. clusterIP: None
    27. selector:
    28. app: nginx
    29. ---
    30. apiVersion: apps/v1beta1
    31. kind: StatefulSet
    32. metadata:
    33. name: nginx-statefulset
    34. namespace: default
    35. spec:
    36. serviceName: nginx
    37. replicas: 3
    38. selector:
    39. matchLabels:
    40. app: nginx
    41. template:
    42. metadata:
    43. labels:
    44. app: nginx
    45. spec:
    46. containers:
    47. - name: nginx
    48. image: nginx:latest
    49. ports:
    50. - containerPort: 80
    51. kubectl apply -f sts.yaml
    52. kubectl apply -f pod6.yaml
    53. kubectl get pods,svc
    54. kubectl exec -it dns-test sh
    55. / # nslookup nginx-statefulset-0.nginx.default.svc.cluster.local
    56. / # nslookup nginx-statefulset-1.nginx.default.svc.cluster.local
    57. / # nslookup nginx-statefulset-2.nginx.default.svc.cluster.local
    58. kubectl exec -it nginx-statefulset-0 bash
    59. /# curl nginx-statefulset-0.nginx
    60. /# curl nginx-statefulset-1.nginx
    61. /# curl nginx-statefulset-2.nginx

    扩展伸缩

    1. kubectl scale sts myapp --replicas=4 #扩容副本增加到4个
    2. kubectl get pods -w #动态查看扩容
    3. kubectl get pv #查看pv绑定
    4. kubectl patch sts myapp -p '{"spec":{"replicas":2}}' #打补丁方式缩容
    5. kubectl get pods -w #动态查看缩容

    五、DaemonSet

    DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

    使用 DaemonSet 的一些典型用法

    1)运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。
    2)在每个 Node 上运行日志收集 daemon,例如fluentd、logstash。
    3)在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond。

    1. vim ls.yaml
    2. apiVersion: apps/v1
    3. kind: DaemonSet
    4. metadata:
    5. name: nginx-daemonSet
    6. labels:
    7. app: nginx
    8. spec:
    9. selector:
    10. matchLabels:
    11. app: nginx
    12. template:
    13. metadata:
    14. labels:
    15. app: nginx
    16. spec:
    17. containers:
    18. - name: nginx
    19. image: nginx:1.15.4
    20. ports:
    21. - containerPort: 80
    22. kubectl apply -f ls.yaml

    DaemonSet会在每个node节点都创建一个Pod

    kubectl get pods

    六、Job

    Job分为普通任务(Job)和定时任务(CronJob)
    常用于运行那些仅需要执行一次的任务

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

    参数解释
    .spec.template.spec.restartPolicy该属性拥有三个候选值:OnFailure,Never和Always。默认值为Always。它主要用于描述Pod内容器的重启策略。在Job中只能将此属性设置为OnFailure或Never,否则Job将不间断运行。

    .spec.backoffLimit用于设置job失败后进行重试的次数,默认值为6。默认情况下,除非Pod失败或容器异常退出,Job任务将不间断的重试,此时Job遵循 .spec.backoffLimit上述说明。一旦.spec.backoffLimit达到,作业将被标记为失败。

    在所有node节点下载perl镜像,因为镜像比较大,所以建议提前下载好

    1. docker pull perl
    2. kubectl apply -f job.yaml
    3. kubectl get pods

    结果输出到控制台

    kubectl logs

    清除job资源

    1. kubectl delete -f job.yaml
    2. backoffLimit
    3. vim job-limit.yaml
    4. apiVersion: batch/v1
    5. kind: Job
    6. metadata:
    7. name: busybox
    8. spec:
    9. template:
    10. spec:
    11. containers:
    12. - name: busybox
    13. image: busybox
    14. imagePullPolicy: IfNotPresent
    15. command: ["/bin/sh", "-c", "sleep 10;date;exit 1"]
    16. restartPolicy: Never
    17. backoffLimit: 2
    18. kubectl apply -f job-limit.yaml
    19. kubectl get job,pods
    20. kubectl describe job busybox

    七、CronJob 

    周期性任务,像Linux的Crontab一样。
    周期性任务

    每分钟打印hello

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

    cronjob其它可用参数的配置

    1. spec:
    2. concurrencyPolicy: Allow 要保留的失败的完成数(默认为1
    3. schedule: '*/1 * * * *' 时间表。将每分钟运行一次
    4. startingDeadlineSeconds: 15
    5. pod必须在规定时间后的15秒内开始执行,若超过该时间未执行,则任务将不运行,且标记失败
    6. successfulJobsHistoryLimit: 3 要保留的成功完成数(默认为3
    7. terminationGracePeriodSeconds: 30 job存活时间 默认不设置为永久
    8. jobTemplate: 模板。
    9. kubectl create -f cronjob.yaml
    10. kubectl get cronjob
    11. kubectl get pods
    kubectl logs

    如果报错,解决办法:绑定一个cluster-admin的权限

    kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
  • 相关阅读:
    raw照片智能处理软件 DxO PureRAW mac中文版高级功能
    docker搭建drone
    WPF真入门教程30--顺风物流单据管理系统
    SylixOS BSP开发(七)
    智能汽车能否真正实现无人驾驶,为什么?
    神经网络的发展
    各类索引-尚
    遗传算法优化的神经网络,遗传算法 优化
    C++基础——static成员
    Python 设计模式之单例模式
  • 原文地址:https://blog.csdn.net/Drw_Dcm/article/details/127792480