随笔 - 11  文章 - 0  评论 - 0  阅读 - 1619

k8s-Deployment

控制器Controller Manager

控制器确保pod资源符合预期的状态,pod资源出现故障时,尝试进行重启,当重启策略无效时,会重建pod。

1、分类

ReplicaSet

代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并支持滚动式自动扩容和缩容功能。
查看代码
  
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: # rs名称
  namespace: dev
  labels: # rs的标签
    controller: rs
spec:
  replicas: 4  # 副本数
  selector:
    matchLabels: # 指定管理哪些pod  Labels匹配规则
      app: nginx-pod
  # matchExpression:  # Expression匹配规则
      - {key: app, operator: In, value: [nginx-pod]}
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx1
        image: nginx:1.17.1
        ports:
        - containerPort: 80
  

Deployment

工作在rs之上,用于管理无状态应用,支持滚动更新和回滚功能,提供声明式配置。

DaemonSet

用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务,如ELK服务。

Job

  只要完成任务就退出,不需要重启或重建。

CronJob

周期性任务控制,不需要持续后台运行。

StatefulSet

管理有状态应用。

2、Deployment

  • 支持rs的所有功能
  • 支持发布的停止和继续
  • 支持版本的回退和滚动升级

kubectl scale deploy myblog --replicas=2 # 新增副本
kubectl edit rs rsName # 编辑rs

完整案例

查看代码
  
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: test
spec:
  replicas: 1 # 指定pod副本
  selector:  # 指定pod选择器
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:  # 给pod打标签
        app: mysql
    spec:
      hostNetwork: true
      volumes:
      - name: mysql-data
        hostPath: /opt/mysql/data
      nodeSelector:
        component: mysql
      containers:
      - name: mysql
        image: mysql:5.7-utf8
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: myblog
              key:  MYSQL_USER
        - name: MYSQL_ROOT_PASSWD
          valueFrom:
            secretKeyRef:
              name: myblog
              key: MYSQL_PASSWD
        - name: MYSQL_DATABASE
          value: 'myblog'
        resources:
          requests:
            memory: 100Mi
            cpu: 50m
          limits:
            memory: 500Mi
            cpu: 100m
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 3306
          initialDealySeconds: 15
          periodSeconds: 20
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  
查看代码
  
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rs-test
  namespace: dev
  labels:
    controller: deploy
spec:
  replicas: 3
  revisionHistorylimit: 3  # 保留历史版本,默认10
  paused: false # 暂停部署
  progressDeadlineSeconds: 600
  strategy: # 策略
    type: RollingUpdate # 滚动更新策略
    rollingUpdate:
      maxSurge: 30% # 最大额度可存在的副本数,也可整数
      maxUnavailable: 30%  # 最大不可用状态的pod的最大值,同上
  selector:
    matchLabels:
      app: nginx-pod
  # matchExpressions:
    # - {key: app, operator: In, values: [nginx-pod]}
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports: 
        - containerPort: 80
  

3、pod驱逐

node资源不足的时候,把pod驱逐至其他节点。

1、kube-controller-manager:周期性检查节点状态,当节点处于NotReady状态超过一段时间,驱逐该节点上的所有pod。

pod-eviction-timeout:NotReady状态节点超过该时间,执行驱逐,默认5min,适用于k8s 1.13版本之前。

1.13版本之后,集群开启TainBasedEvictions和TaintNodesByCondition功能,即taint-based-evictions,即节点若失联或者其他异常,k8s自动为node打上污点,同时为pod添加下面配置:

toleration:
- effect: NoExecute
   key: node.kubernetes.io/not-ready
   operator: Exists
   tolerationSeconds: 300
- effect: NoExecute
   key: node.kubernetes.io/unreachable
   operator: Exists
   tolerationSeconds: 300 #pod独立设置驱逐容忍时间

2、kubelet,周期性检查本节点资源,资源不足,按照优先级驱逐部分pod。

4、服务更新

更新方法

  • kubectl apply -f xxx.yaml # 修改yaml
  • kubectl edit deploy myblog # 在线更新
  • kubectl set image deploy myblog myblog(containerName)=172.17.1.1:5000/myblog:v2 --record

5、更新策略

滚动更新:先增后减。

过程:先创建rs1,rs1新增pod+1,旧版本rs0删除pod-1,rs1新增pod+1,rs0删除pod-1,最后pod都在rs1上,保留rs0。

spec:
  replicas: 2 # 指定副本数
  selector:
    matchLabels:
      app: myblog
  stragegy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate  # 指定更新方式,默认滚动更新

- maxSurge

最大激增数(最大存活数),更新过程中,最多可以比replicas预先设定值多出的pod数量,可设置固定值或者百分比,默认25%,向上取整,3.44

- maxUnavailable

更新过程中,最多有几个pod处于无法服务的状态,可以固定值或百分比,默认25%,向下取整,3.6取3。

6、服务回滚

revision:更新应用时,k8s会记录当前版本号,即revision,若升级出现问题,可会滚到某个特定的revision,默认配置下k8s只会保留10个revision。

和镜像挂钩,记录操作rs的历史。

kubectl rollout history deploy myblog  # 查看历史

kubectl create -f xxx.yaml  --record

kubectl set image deploy myblog myblog=127.0.0.1:5000/myblog:v2 --record=true

posted on   weikuo  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示