k8s基础6-pod

pod控制器类型

Pod通过控制器实现应用的运维,如伸缩、升级等,控制器决定了创建pod资源的方式和类型,在集群上管理和运行容器的对象通过label-selector 相关联。
控制器 又称之为工作负载,分别包含以下类型控制器:

5种控制器类型

  • 1: Deployment

  • 2: StatefulSet

  • 3: DaemonSet

  • 4:Job

  • 5: CronJob

pod工作负载.png原文链接:https://blog.csdn.net/weixin_45691464/article/details/106326605

二 deployment类型

1特点:

  • 部署无状态应用,只关心数量,不论角色等,称无状态

  • 管理Pod和ReplicaSet

  • 具有上线部署、副本设定、滚动升级、回滚等功能

  • 提供声明式更新,例如只更新一个新的image

  • 应用场景: web 服务

2示例:

# 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

Replicaset是副本数,回滚就是通过此来实现

创建资源
# kubectl create -f nginx-deployment.yaml
查看创建的pod资源、控制器和副本
# kubectl get pods,deploy,rs
查看历史版本
# kubectl rollout history deployment/nginx-deployment

等了几分钟又执行deployment截图1.pngdeployment截图2.png

satefulSet类型

1特点:

  • 部署有状态应用

  • 解决Pod独立生命周期,保持Pod启动顺序和唯一性

  • 稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)

  • 有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)

  • 有序,滚动更新

  • 应用场景: 数据库

2总结:

2.1StatefulSet与Deployment区别:

StatefulSet创建的pod是有身份的!

2.2身份三要素:

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

3有状态和无状态的区别:

3.1无状态:

  • 1)deployment认为所有的pod都是一样的

  • 2)不用考虑顺序的要求

  • 3)不用考虑在哪个node节点上运行

  • 4)可以随意扩容和缩容

3.2有状态:

  • 1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper

  • 2)实例之间不对等的关系,以及依靠外部存储的应用。

4常规service和无头服务区别

service: 一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service无头服务, 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)

5示例1:

先创建DNS资源

cd demo
rz -E
#把coredns.yaml复制过来
kubectl create -f coredns.yaml
kubectl get pods -n kube-system

vim pod3.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

#创建dns资源
kubectl create -f pod3.yaml

kubectl get pods

satefulset截图1.png

DaemonSet类型

DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:

1特点:

在每一个Node上运行一个Pod
新加入的Node也同样会自动运行一个Pod

2应用场景:Agent、监控

官方案例(监控)
简单来说我有5个房间 每个房间都安装一个摄像头

  • 日志收集,比如fluentd,logstash等

  • 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等

  • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

可以直接在每个物理节点是直接安装,这里我们使用DaemonSet部署到每个节点上,使用hostNetwork: true 和 hostPID: true 使其获得Node的物理指标信息,配置tolerations使其在master节点也启动一个pod。

2node-export举例:

用DaemonSet 控制器类型创建nginx pod资源,没有指定副本replicats,它会根据node节点的个数创建,如果再新加一个node节点,也会给新node节点创建pod

# vim ds.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

# kubectl apply -f ds.yaml 

DaemonSet会在每个node节点都创建一个Pod
# kubectl get pods

# kubectl get pods -o wide
如果再新加一个node节点,也会给新node节点创建pod

node-export示例.png

五 Job类型

1 Job分为普通任务(Job)和定时任务(CronJob)

一次性执行
应用场景:离线数据处理,视频解码等业务
https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

2应用大数据场景

2.1示例:

用job控制器类型创建资源,执行算圆周率的命令,保持后2000位,创建过程等同于在计算
,重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。

# vim job.yaml
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

在node节点提前下载perl镜像,因为镜像比较大所以提前下载好
node1 node2节点:
# docker pull perl

创建过程等同于在计算
# kubectl apply -f job.yaml 
job.batch/pi created

查看状态
# kubectl get pods
# kubectl describe pod pi-tkdlc 

查看日志,看计算结果,结果输出到控制台
# kubectl logs pi-tkdlc
3.141592653589793.............................................共2000位

job示例1.pngjob示例2.png

六 CronJob类型

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

1示例:

每隔一分钟输出一条信息,打印hello

# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

busybox 是linux内核镜像

# kubectl create -f cronjob.yaml
# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE    AGE
hello      */1 * * * *         False         0         <none>          25s
# kubectl get pods
查看日志,内容输出到控制台
# kubectl logs hello-1581917340-dzxbj
Mon Feb 17 05:29:09 UTC 2020
Hello from the Kubernetes cluster

等待一分钟后又会再执行一次
# kubectl get pods
# kubectl logs hello-1581917400-nkb72

最后删除资源,不然第二天服务器宕机
# kubectl delete -f cronjob.yaml

1