首页 > 其他分享 >k8s-Deployment

k8s-Deployment

时间:2022-11-10 18:12:22浏览次数:46  
标签:name rs myblog Deployment nginx mysql pod k8s

控制器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.4取4。

- 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

标签:name,rs,myblog,Deployment,nginx,mysql,pod,k8s
From: https://www.cnblogs.com/20190707wdd/p/16876811.html

相关文章

  • k8s03-Replication-Controller-ReplicaSet-有状态-无状态-daemonset
    ReplicationController和ReplicaSet无状态应用管理Deployment有状态应用管理StatefuSet守护进程集DaemonSetkubernets调度基础1.1RC和RSReplicationController......
  • K8S部署zooker集群
    直接贴yaml apiVersion:v1kind:Servicemetadata: name:zk-hs labels:  app:zkspec: ports: -port:2888  name:server -port:3888......
  • 【k8s连载系列】2. k8s整体架构
    一、Kubernetes的整体架构学习k8s,最终目的是为了部署应用,部署一个完整的k8s,就要知道k8s的组成。k8s主要包含两大部分:中间包含三个绿色包的是master服务器.下面是node......
  • k8s 命令操作
    kubectltaintnodek8s-master01key1=value1:NoExecute添加污点并驱逐podetcd命令操作etcdctl--endpoints=https://[127.0.0.1]:2379--cacert=/etc/kubernetes/pki......
  • 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- Ingress-Ngnix
    前置条件:使用Kubeadm部署Kubernetes(K8S)安装安装ingress-nginx组件(在master节点执行)通过ip+port号进行访问,使用Service里的NodePort实现,把端口对外暴露缺陷......
  • 如何快速入门k8s
    1什么是k8sKubernetes也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成......
  • k8s iptables 改造ipvs
    1.修改iptables为ipvs模式 ipvs采用的hash表,iptables采用一条条的规则列表。集群数量越多iptables规则就越多,而iptables规则是从上到下匹配,所以效率就越是低下......
  • 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)
    使用Kubeadm部署Kubernetes(K8S)安装--持久化存储(NFS网络存储)NFS存在一个弊端,需要知道NFS服务器的地址,配在yaml中PV:持久化存储,对存储资源进行抽象,对外提供可......
  • 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)
    使用Kubeadm部署Kubernetes(K8S)安装Volume是Pod中能够被多个容器访问的共享目录。Kubernetes的Volume定义在Pod上,它被一个Pod中的多个容器挂载到具体的......
  • K8s系列---【打污点】
    1.污点语法kubectltaintnode[node]key=value[effect][effect]可取值:[NoSchedule|PreferNoSchedule|NoExecute]NoSchedule:一定不能被调度PreferNoSche......