如何解析k8s中pod控制器的Deployment、DaemonSet、StatefulSet
admin
2023-03-31 17:21:21
0

pod控制器分类:
1、ReplicationController
2、ReplicaSet
3、Deployment
4、StatefulSet
5、DaemonSet
6、Job,Cronjob
7、HPA
pod控制器:一般包括3部分
1、标签选择器
2、期望的副本数(DaemonSet控制器不需要)
3、pod模板
deploy控制器构建于rs控制器之上,新特性包括:
1、事件和状态查看
2、回滚
3、版本记录
4、暂停和启动
5、支持两种自动更新方案
Recreate删除重建
RollingUpdate回滚升级(默认方式)

创建deploy
$ kubectl run --help
$ kubectl run nginx --image=nginx --port=80 --replicas=2        #用命令直接创建
$ kubectl run nginx --image=nginx --port=80 --dry-run -o yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80

创建deploy控制器时会自动创建rs控制器,二者具有相同的标签选择器
$ kubectl get deploy
nginx                    1/1     1            1           7s
$ kubectl get rs

修改pod副本数的方式
1、kubectl edit deploy nginx
2、kubectl scale deploy nginx --replicas=5
3、修改yaml文件

升级pod镜像的方法:
1、直接修改yaml
2、kubectl edit deploy nginx
3、kubectl set image deploy/nginx nginx=nginx:1.9 --record        #升级并记录,可实现回滚,推荐使用该方法

滚动升级是deployment pod升级时的默认策略,也可以修改默认值
用命令kubectl edit deploy nginx可以查看默认值

  replicas: 3
  selector:
    matchLabels:
      run: nginx
  minReadySeconds: 5       #默认看不到,需要手工添加
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

默认情况下,当6个pod副本需要升级时:Kubernetes 将终止1个实例(625%=1.5个实例,向下舍去=1),创建3个新实例(625%=1.5个实例,向上舍入=2,加1个实例来弥补1个终止实例=3个实例),此时总共运行8个副本。一旦新的pod就绪,它将从旧的副本集中终止另外2个实例,以便将部署恢复到所需的副本数,然后重复这个过程,直到部署完成为止。
minReadySeconds:Kubernetes在等待设置的时间后才进行升级
maxSurge:升级过程中最多可以比原先设置多出的POD数量
maxUnavaible:升级过程中最多有多少个POD处于无法提供服务的状态

滚动升级相关命令
$ kubectl set image deploy/nginx nginx=nginx:1.7.9 --record
$ kubectl set image deploy/nginx nginx=nginx --record
$ kubectl rollout status deploy nginx        #查看升级状态
$ kubectl rollout pause deployment nginx        #升级暂停
$ kubectl rollout resume deployment nginx       #恢复升级
$ kubectl describe deploy nginx         #查看升级详情
$ kubectl rollout history deploy/nginx        #查看升级历史
deployment.extensions/nginx
REVISION  CHANGE-CAUSE
4         kubectl set image deploy/nginx nginx=nginx:1.7.9 --record=true
5         kubectl set image deploy/nginx nginx=nginx --record=true
$ kubectl rollout history deployment nginx --revision=5
$ kubectl rollout undo deployment/nginx --to-revision=4          #回滚到指定版本
$ kubectl rollout undo deployment nginx-deploy        #回滚到前一个版本

显式指定滚动升级参数

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
    minReadySeconds: 5      
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80

DaemonSet用于在每个Kubernetes节点中将守护进程的副本作为后台进程运行,说白了就是在每个节点部署一个Pod副本,当节点加入到Kubernetes集群中,Pod会被自动调度到该节点上运行。
每个节点有一个ds pod,新加入的节点也会自动生成一个ds pod
ds pod不受调度策略控制
使用DaemonSe场景:
1、集群存储守护程序,如glusterd、ceph要部署在每个节点上以提供持久性存储;
2、节点监视守护进程,如Prometheus监控集群,可以在每个节点上运行一个node-exporter进程来收集监控节点的信息;
3、日志收集守护程序,如fluentd或logstash,在每个节点上运行以收集容器的日志
示例:

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: nginx-ds
  labels:
    k8s-app: nginx
spec:
  template:
    metadata:
      labels:
        k8s-app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx
        ports:
        - name: http
          containerPort: 80

无状态服务(Stateless Service):所有pod只需要共享一个持久存储,并不需要每个pod一个持久存储,并且多个实例对于同一个请求响应的结果是完全一致的
有状态服务(Stateful Service):每个pod都需要一个独立的持久存储,对于这种类型的资源,我们一般是通过创建一个Headless Service类型的服务来暴露服务,将clusterIP设置为None就是一个无头的服务。
1、有状态服务一般使用pvc模板和存储类为每个pod自动生成一对pv和pvc来实现持久化存储。
2、也可以手动创建pv,然后和利用StatefulSet中的volumeClaimTemplates自动生成的pvc进行配对。

手动创建pv用于StatefulSet
1、创建两个pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001        #第二个是pv002
  labels:
    release: stable
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: /tmp/data

2、先创建无头服务

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
    role: stateful

3、创建StatefulSet pod使用pv

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"        #使用上面创建的无头服务
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
        role: stateful
    spec:
      containers:
      - name: nginx
        image: cnych/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

volumeClaimTemplates会根据其对应的pv自动生成pvc并自动配对,数量由replicas: 2决定。

使用pvc模板和存储类自动生成pv和pvc
1、创建存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: course-nfs-storage
provisioner: fuseim.pri/ifs

2、先创建无头服务

apiVersion: v1
kind: Service
metadata:
  name: nfs-web
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
    role: stateful

3、使用存储类创建StatefulSet pod

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nfs-web
spec:
  serviceName: "nfs-web"         #使用上面创建的无头服务
  replicas: 2
  template:
    metadata:
      labels:
        app: nfs-web
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
      annotations:
        volume.beta.kubernetes.io/storage-class: course-nfs-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
            #storageClassName: course-nfs-storage        使用存储类
      resources:
        requests:
          storage: 1Gi

会自动生成两对pv和pvc

相关内容

热门资讯

特朗普下令不打了,美国的“余粮... 可以说戛然而止,快得让很多人都无法适应。前两周,每一天美国都要打击伊朗一通。就在7月24日白宫会议前...
穆杰塔巴最新表态:支持黎真主党 △伊朗最高领袖穆杰塔巴·哈梅内伊(资料图)当地时间7月26日晚,伊朗最高领袖穆杰塔巴·哈梅内伊对黎巴...
美军瘫痪一艘驶向伊朗的油轮,特... 美国总统特朗普虽下令暂停打击伊朗,但美军仍在执行对霍尔木兹海峡的封锁任务。针对美军瘫痪一艘驶向伊朗油...
“小牌大耍”的底气到底是哪里来... 澎湃首席评论员 李平这两天,“艺人李权哲乘高铁占座事件”在网上引发热议,该艺人参加的活动主办方曾发布...
越南籍船舶南海遇险沉没,中方已... 据凤凰卫视报道,一艘越南船舶7月24日夜间在越南庆和以东220海里附近遇险沉没,船上共62名越南籍人...
李权哲占座、蒙面、装死:娱乐圈... 你买了一张高铁一等座的票,找到自己的位置,18A。有人坐着。你拿出手机看了眼购票记录——没错,18A...
杭州景区咖啡店闯入1条幼蛇,仅... 夏天气温高、湿度大,蛇类活动进入高峰期,千万别被“小蛇无害”的刻板印象骗了!有些幼蛇看着迷你可爱,实...
AI开源公开信签署企业增至50... IT之家 7 月 26 日消息,英伟达、微软、IBM、Meta 等 25 家美国科技企业本周(7 月...
南阳快手短视频代运营企业的服务... 在短视频平台快速发展的背景下,企业通过快手等渠道进行内容运营已成为常见的市场动作。对于希望借助短视频...
普通人该如何跟上科技发展的步伐 这个被称作科技的词汇, 听起来既有宏大之感, 又颇为遥远, 好似仅仅归属于在实验室里专心致志钻研的科...