k8s基础(3)—Kubernetes-Deployment

一、 Deployment概述

‌

Kubernetes Deployment ‌是Kubernetes中的一个核心概念,它是一种高级别的控制器,用于管理Pod和ReplicaSet,确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet,从而管理应用程序的生命周期‌12。

主要功能和特点

  1. ‌副本管理‌:Deployment确保在集群中有指定数量的Pod副本运行。如果Pod副本数量少于期望值,Deployment会自动创建新的Pod;如果副本数量超过期望值,则会删除多余的Pod‌23。
  2. ‌滚动更新‌:Deployment支持滚动更新策略,逐步替换旧版本的Pod为新版本,保障业务的连续性,避免一次性更新导致的服务中断‌23。
  3. ‌版本回滚‌:如果应用程序升级后出现问题,可以通过Deployment回滚到之前的版本‌23。
  4. ‌高可用性‌:当Pod失效时,Deployment会自动创建新的Pod以替换失效的Pod,保证服务的连续运行‌3。

使用场景和示例

Deployment的使用场景包括但不限于:

  • ‌应用部署‌:将构建好的容器镜像部署到Kubernetes集群中,并提供服务。
  • ‌应用升级‌:通过更新容器镜像并重新部署Deployment来实现应用的更新。
  • ‌回滚操作‌:当应用升级出现问题时,可以回滚到之前的稳定版本。

资源清单示例

以下是一个Deployment资源清单的示例:

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
      - name: php-fpm
        image: php:fpm

这个示例创建了一个名为my-deployment的Deployment,包含3个Pod副本,每个Pod运行my-image:latest镜像,并监听8080端口‌。

二、Deployment的使用

(一)创建以及删除操作

bash 复制代码
#创建pod节点
kubectl create deployment nginx01 --image=nginx

#删除pod,观察Deployment的自愈能力
kubectl delete pod nginx01-xxx

#需要删除Deployment需要进行如下操作
kubectl get deploy              #获取到运行的实例名称
kubectl delete deploy nginx01   #删除运行的实例名称

删除

(二)多副本创建

bash 复制代码
#命令行创建与删除
kubectl create deployment nginx01 --image=nginx --replicas=3

#查看创建的副本的状态
kubectl get deploy

#使用YAML创建
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx02
  name: nginx02
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx02
  template:
    metadata:
      labels:
        app: nginx02
    spec:
      containers:
        - image: nginx
          name: nginx

1、使用命令行进行创建和删除操作

1.1、查看创建的副本的状态

1.2、deployment删除

2、在dashboard上进行操作

2.1、填写表单进行操作
2.2、使用YAML文件进行操作

3、Deployment和Pod的区别

Pod 需要运行kubectl run命令进行,如果需要部署多分则需要运行多次;而使用Deployment进行部署只需要制定副本数量主节点会自动分配进行部署,而且在机器故障时也能进行自愈。

(三)扩缩容

#扩缩容命令 kubectl scale deploy/nginx02 --replicas=5 #nginx02是已经在运行的deployment的实例 #通过编辑的方式进入到deployment中进行修改 kubectl edit deployment nginx02

1、扩容

将之前的3个pod扩容到5个pod

方法一:直接使用命令行进行操作
bash 复制代码
#扩缩容命令
kubectl scale deploy/nginx02 --replicas=5  #nginx02是已经在运行的deployment的实例

#通过编辑的方式进入到deployment中进行修改
kubectl edit deployment nginx02
方法二:编辑deployment对应的实例文件进行修改
bash 复制代码
#编辑deployment对应的实例文件进行修改
$ kubectl edit deployment nginx02
对以下内容进行编辑
...
spec:
  progressDeadlineSeconds: 600
  replicas: 4                          #修改pod的副本数
...
2、缩容

将之前的5个pod缩容到2个pod

bash 复制代码
kubectl scale deploy/nginx02 --replicas=2
3、dashboard操作
3.1、扩缩容操作

(四)自愈&故障转移

自愈:指pod遇到故障时k8s会自动选择其他的node节点启动一个新的pod

故障转移:当机器遇到宕机时,大概过了几分钟之后机器k8s会重新分配node上的pod信息。

步骤一:自愈模拟

1、场景:先用deployment创建一个pod;再将pod删除模拟故障。

2、实现预期:被删除后k8s会在另一个节点上重新启动一个pod

1、自愈

(五)滚动更新

滚动更新的原理是先启动更新的pod等更新的pod起来之后再替换掉旧的pod

bash 复制代码
#将nginx版本更新为1.16.1版本
kubectl set image deployment/nginx02 nginx=nginx:1.16.1 --record

#查看版本信息
kubectl rollout status deployment/nginx02

查看到pod更新的状态信息,先进行一个pod的更新操作,更新成功之后才会关掉旧的pod

(六)版本回退

bash 复制代码
#历史记录
kubectl rollout history deployment/nginx02

#查看某个历史详情
kubectl rollout history deployment/nginx02 --revision=2

#回滚(回滚到上一个版本)
kubectl rollout undo deployment/nginx02

#回滚到指定版本
kubectl rollout undo deployment/nginx02 --to-revision=2

回退到上一次版本

更多:处理Deployment部署之外,k8s还有StatefulSet、DaemonSet、Job等类型为资源,我们都称为工作负载,有状态应用使用StatefulSet部署,无状态应用使用Deployment部署。

相关推荐
我是koten3 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
RuoyiOffice10 小时前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office
风吹稻子11 小时前
etcd备份与恢复:删了 etcd.yaml,容器为什么还在跑?——一次 K8s 控制面死锁排查实录
kubernetes
weirong14 小时前
Operator 的测试该写到哪一层?139 个用例之后我划的三条线
kubernetes
阿里云云原生15 小时前
稳定复现超 70% 的缺陷,报警到自动修复的 Agent 流水线实践
云原生
阿里云云原生16 小时前
从“自证清白”到“因果链条”:智能体如何重塑运维排障效率
云原生
阿里云云原生16 小时前
TechTalk丨从能买奶茶到能进企业,Agent 绕不开同一组问题
云原生·agent
逐流人17 小时前
手工建集群到全自动发布:k8s集群部署与DevOps流水线整合实战
ci/cd·云原生·kubernetes·云计算·devops
我不会起名字32218 小时前
K8s Pod 反复重启 CrashLoopBackOff:从 exit code 到根因的 5 步排查
云原生·容器·kubernetes·k8s
瑞克-桑切斯18 小时前
ERP 企业生产管理系统部署手册
运维·docker·云原生·容器·eureka