03-Kubernetes中的Deployment

1. 什么是Deployment

Deployment 是 Kubernetes 众多工作负载中的一种,用于控制 Pod,使 Pod 拥有多副本、自愈、扩缩容等能力,可以简单理解为 Pod 的控制器。

利用 Deployment 也可以创建 Pod,下面来比较一下两种方式创建 Pod 的区别。

方式一:使用 kubectl run 创建 Pod

kubectl run my-nginx --image=nginx -n hello-world

方式二:使用 kubectl create deployment 创建 Pod

kubectl create deployment my-tomcat --image=tomcat:8.5.68 -n hello-world

如果此时要删除上面创建的 Pod ,对于方式一创建的,很简单,直接执行下面的这行语句即可:

kubectl delete pod my-nginx -n hello-world

而要删除方式二创建的 Pod ,我们还能用下面的这行语句吗?

kubectl delete pod my-tomcat -n hello-world

这么做,是删不掉的。因为每删除一次,k8s 又会自动创建一个新的 my-tomcat 的 Pod(Deployment自愈能力的体现)。

原因在于方式二是通过 Deployment 的方式创建的 Pod(以部署一个应用的方式)。

如果要删除方式二创建的 Pod,可以通过下面的步骤进行:

# 第一步,获取deploy(部署)列表信息
kubectl get deploy -n hello-world

# 第二步,通过删除deploy(部署)的方式删除Pod
kubectl delete deploy my-tomcat -n hello-world

2. Deployment的各种能力

2.1 多副本能力

副本:可以理解为对于一个应用而言,将它运行在一个 Pod 上就是起一个副本,将它运行在多个 Pod 上,就是起了多个副本。

下面通过两种方式,来实现多副本的能力。

方式一:命令行方式

# 通过部署的方式,创建nginx的3个副本
kubectl create deployment nginx-base --image=nginx --replicas=3 -n hello-world

# 查看部署列表信息
kubectl get deploy -n hello-world

# 删除本次部署(即同时删除3个Pod)
kubectl delete deploy nginx-base -n hello-world

方式二:yaml文件方式

(1)写一个 yaml 文件,例如 nginx-base.yaml

apiVersion: apps/v1 # 版本号
kind: Deployment    # 资源类型
metadata:
  labels:
    app: nginx-base # 标签名称
  name: nginx-base  # 本次部署的名字
  namespace: hello-world # 命名空间
spec:
  replicas: 3 # 副本数量
  selector:
    matchLabels:
      app: nginx-base
  template:
    metadata:
      labels:
        app: nginx-base
    spec:
      containers:
      - image: nginx # 容器的镜像名称
        name: nginx  # 容器名

(2)执行 nginx-base.yaml 文件

kubectl apply -f nginx-base.yaml
2.2 扩缩容能力

扩容:遇到流量高峰,需要增加副本数量,降低当前负载

缩容:流量高峰过去,不需要这么多副本,减少数量

方式一:命令行方式

# 将nginx-base的副本数量扩容到5个
kubectl scale --replicas=5 deployment/nginx-base -n hello-world

# 将nginx-base的副本数量缩减到2个
kubectl scale --replicas=2 deployment/nginx-base -n hello-world

方式二:修改yaml方式

打开对应的 yaml 文件,修改副本发数量,然后保存退出即可。

(1)打开文件

kubectl get deploy

kubectl edit deployment nginx-base

(2)编辑文件

apiVersion: apps/v1 # 版本号
kind: Deployment    # 资源类型
metadata:
  labels:
    app: nginx-base # 标签名称
  name: nginx-base  # 本次部署的名字
  namespace: hello-world # 命名空间
spec:
  replicas: 2 # 副本数量
  selector:
    matchLabels:
      app: nginx-base
  template:
    metadata:
      labels:
        app: nginx-base
    spec:
      containers:
      - image: nginx # 容器的镜像名称
        name: nginx  # 容器名

(3)保存退出

2.3 自愈及故障转移能力

自愈能力:假设某个 Pod 发生故障,不能正常对外提供服务,此时 k8s 会自动杀死该 Pod ,然后再将该 Pod 重新启动。

转移能力:假设某个 Pod 所在的结点 node-01 发生了宕机,整个服务器坏掉,不能正常使用,当 k8s 经过一小段时间(可能是5分钟)检测后,发现该服务器确实不能提供服务了,那么 k8s 会自动在其它结点上重新创建 node-01 结点里面的所有 Pod ,以达到正常对外提供服务的目的。

2.4 滚动更新能力

k8s 在更新集群应用时,对于每个结点上的 Pod ,会先启动一个新的 Pod ,然后再停掉对应的老的 Pod,如此循环,直至实现每个结点上的 Pod 的更新,才算完成本次集群应用的更新。

方式一:命令行方式

kubectl set image deployment/nginx-base nginx=nginx:1.16.1 --record -n hello-world

kubectl rollout status deployment/nginx-base -n hello-world

方式二:修改yaml方式

打开对应的 yaml 文件,修改副本发数量,然后保存退出即可。

(1)打开文件

kubectl get deploy

kubectl edit deployment nginx-base

(2)编辑文件

apiVersion: apps/v1 # 版本号
kind: Deployment    # 资源类型
metadata:
  labels:
    app: nginx-base # 标签名称
  name: nginx-base  # 本次部署的名字
  namespace: hello-world # 命名空间
spec:
  replicas: 2 # 副本数量
  selector:
    matchLabels:
      app: nginx-base
  template:
    metadata:
      labels:
        app: nginx-base
    spec:
      containers:
      - image: nginx:1.16.1 # 容器的镜像名称
        name: nginx  # 容器名

(3)保存退出

2.5 版本回退能力

如果对当前这次部署不满意,无法正常提供服务,k8s可以回滚到之前的历史版本。

#历史记录
kubectl rollout history deployment/nginx-base -n hello-world

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

#回滚到上次版本
kubectl rollout undo deployment/nginx-base -n hello-world

#回滚到指定版本
kubectl rollout undo deployment/nginx-base --to-revision=2 -n hello-world

3. 工作负载

除了 Deployment 外,k8s 还有 StatefulSet 、DaemonSet 、Job 等类型的工作负载

有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署。

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值