【四】K8S_Deployment

Deployment作用

Kubernetes(K8S)中的 Deployment 是用于定义和管理应用程序部署的重要资源对象。Deployment 在 K8S 中具有以下用途和相关概念:

  1. 应用程序部署和更新:Deployment 用于指定应用程序的部署配置,包括容器镜像、副本数、环境变量、存储卷等。通过 Deployment,您可以方便地定义和管理应用程序的初始部署,并进行后续的版本更新和升级。
  2. ReplicaSet:Deployment 通过与 ReplicaSet 关联来管理 Pod 的副本。ReplicaSet 定义了创建和维护一组相同的 Pod 的规则。Deployment 使用 ReplicaSet 来确保指定数量的 Pod 副本在运行,并负责升级或回滚这些副本。
  3. 滚动更新和回滚:Deployment 提供了无缝的应用程序版本升级和回滚机制。您可以通过更新 Deployment 的配置或容器镜像来触发滚动更新。Deployment 将逐步替换旧版的 Pod,以确保在升级过程中始终有足够的可用副本。如果需要回滚到先前的版本,也可以轻松地执行回滚操作。
  4. 健康检查和自动修复:Deployment 负责监测 Pod 的健康状态,并自动修复故障的副本。您可以配置 Deployment 以使用健康检查来确定是否要替换失败的 Pod 实例。这确保了应用程序的高可用性和稳定性。
  5. 扩展和缩减:Deployment 允许您根据流量需求动态调整 Pod 的副本数。通过修改 Deployment 的副本数,在需要时进行水平扩展以应对高流量,或者在需要时进行缩减以减少资源消耗。K8S 会自动管理 Pod 的创建和删除过程。
  6. 持久化存储:Deployment 可以指定需要挂载到 Pod 中的持久化存储卷。这允许应用程序在多个 Pod 之间共享数据,并在容器重启或重新调度时保留数据。

通过使用 Deployment,您可以轻松地管理和控制应用程序的部署、更新和扩展。它提供了易于使用和强大的功能,使得应用程序在 K8S 集群中能够高效、可靠地运行。

deployment的冗余能力

创建一个deployment的pod用delete删除不了,下面案例两种创建pod的不通

[root@master ~]# kubectl run nginx --image=nginx
pod/nginx created
[root@master ~]# kubectl create deployment myginx01 --image=nginx
deployment.apps/myginx01 created
 
 
[root@master ~]# kubectl delete  pod nginx
pod "nginx" deleted
 
[root@master ~]# kubectl delete pod myginx01-5c9d6dbf77-k75d5
pod "myginx01-5c9d6dbf77-k75d5" deleted
[root@master ~]# kubectl get pod 
NAME                        READY   STATUS    RESTARTS   AGE
myginx01-5c9d6dbf77-k8f8x   1/1     Running   0          2m45s

也可以在开一个窗口看一下效果

[root@master ~]# watch  -n 1  kubectl get pod 

只有把delopment删除以后才可以删除pod

[root@master ~]# kubectl delete deploy myginx01
deployment.apps "myginx01" deleted
[root@master ~]# kubectl get pod
No resources found in default namespace.

 

 

deployment的多副本部署

[root@master ~]# kubectl create deploy mynginx --image=nginx --replicas=3
deployment.apps/mynginx created
 
[root@master ~]# kubectl get pod -owide
NAME                       READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
mynginx-5b686ccd46-4w2nm   1/1     Running   0          36s   192.168.196.146   node01   <none>           <none>
mynginx-5b686ccd46-cxtjn   1/1     Running   0          36s   192.168.196.144   node01   <none>           <none>
mynginx-5b686ccd46-j5xpq   1/1     Running   0          36s   192.168.196.145   node01   <none>           <none>
[root@master ~]# kubectl get deploy
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
mynginx   3/3     3            3           92s

也可以在bashboard上部署

 

【四】K8S_Deployment

用yaml部署

先创建一个yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels:
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: nginx

 

[root@master ~]# kubectl apply -f pod.yaml 
deployment.apps/my-dep created
[root@master ~]# kubectl get deploy
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
my-dep    2/3     3            2           30s
mynginx   5/5     5            5           16m
[root@master ~]# kubectl get deploy
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
my-dep    3/3     3            3           35s
mynginx   5/5     5            5           16m
[root@master ~]# 

 

deployment的扩缩容

kubectl scale --replicas=5 deployment/my-dep

kubectl edit deploy my-dep

案例走起:

[root@master ~]# kubectl get deploy
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   3/3     3            3           7m17s
[root@master ~]# kubectl scale deploy/my-dep --replicas=5
deployment.apps/my-dep scaled
[root@master ~]# kubectl get deploy
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   5/5     5            5           8m10s
[root@master ~]# kubectl scale deploy/my-dep --replicas=2
deployment.apps/my-dep scaled
[root@master ~]# kubectl get deploy
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   2/2     2            2           8m42s
[root@master ~]# kubectl edit deploy my-dep
deployment.apps/my-dep edited
[root@master ~]# kubectl get deploy
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   2/3     3            2           11m

deployment的自愈能力

案例走起:

在node01节点上停止一个容器看效果

[root@node01 ~]# docker ps |grep my-dep-5b7868d854-dgrt4
14744aac665a   nginx                                               "/docker-entrypoint.…"   13 minut8s_nginx_my-dep-5b7868d854-dgrt4_default_bc8be424-2226-44f3-8dc5-49b08d1ef3fe_0
96beef3e2dba   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                 13 minut8s_POD_my-dep-5b7868d854-dgrt4_default_bc8be424-2226-44f3-8dc5-49b08d1ef3fe_0
[root@node01 ~]# docker ps |grep my-dep-5b7868d854-dgrt4
14744aac665a   nginx                                               "/docker-entrypoint.…"   14 minutdgrt4_default_bc8be424-2226-44f3-8dc5-49b08d1ef3fe_0
96beef3e2dba   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                 14 minutrt4_default_bc8be424-2226-44f3-8dc5-49b08d1ef3fe_0
[root@node01 ~]# docker stop 14744aac665a
14744aac665a
[root@node01 ~]# 

 发现node01节点的容器重启了一次

 

[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-dgrt4   1/1     Running   1          16m
my-dep-5b7868d854-lq6mz   1/1     Running   0          27m
my-dep-5b7868d854-pgp9n   1/1     Running   0          27m

现在我们把node01服务器关机看效果 

 

[root@master ~]# kubectl get pod -w
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-dgrt4   1/1     Running   1          20m
my-dep-5b7868d854-lq6mz   1/1     Running   0          31m
my-dep-5b7868d854-pgp9n   1/1     Running   0          31m
my-dep-5b7868d854-dgrt4   1/1     Terminating   1          25m
my-dep-5b7868d854-6qzt6   0/1     Pending       0          0s
my-dep-5b7868d854-6qzt6   0/1     Pending       0          0s
my-dep-5b7868d854-6qzt6   0/1     ContainerCreating   0          0s
my-dep-5b7868d854-6qzt6   0/1     ContainerCreating   0          1s
my-dep-5b7868d854-6qzt6   1/1     Running             0          2s
[root@master ~]# kubectl get pod -o wide
NAME                      READY   STATUS        RESTARTS   AGE     IP                NODE     NOMINATED NODE   READINESS GATES
my-dep-5b7868d854-6qzt6   1/1     Running       0          2m18s   192.168.140.81    node02   <none>           <none>
my-dep-5b7868d854-dgrt4   1/1     Terminating   1          27m     192.168.196.154   node01   <none>           <none>
my-dep-5b7868d854-lq6mz   1/1     Running       0          38m     192.168.140.80    node02   <none>           <none>
my-dep-5b7868d854-pgp9n   1/1     Running       0          38m     192.168.140.79    node02   <none>           <none>

滚动更新

以yaml的方式查看pod

[root@master ~]# kubectl get deploy my-dep -o yaml
...
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
...

现在我们要变更镜像的版本

 

[root@master ~]# kubectl set image deploy/my-dep nginx=nginx:1.16.1  --record
deployment.apps/my-dep image updated

查看效果:

 

[root@master ~]# kubectl get pod -w
NAME                      READY   STATUS              RESTARTS   AGE
my-dep-5b7868d854-6qzt6   1/1     Running             0          10m
my-dep-5b7868d854-lq6mz   1/1     Running             0          46m
my-dep-5b7868d854-pgp9n   1/1     Running             0          46m
my-dep-6b48cbf4f9-x25jn   0/1     ContainerCreating   0          23s
my-dep-6b48cbf4f9-x25jn   1/1     Running             0          50s
my-dep-5b7868d854-6qzt6   1/1     Terminating         0          10m
my-dep-6b48cbf4f9-gfhnf   0/1     Pending             0          0s
my-dep-6b48cbf4f9-gfhnf   0/1     Pending             0          0s
my-dep-6b48cbf4f9-gfhnf   0/1     ContainerCreating   0          0s
my-dep-5b7868d854-6qzt6   1/1     Terminating         0          10m
my-dep-6b48cbf4f9-gfhnf   0/1     ContainerCreating   0          1s
my-dep-5b7868d854-6qzt6   0/1     Terminating         0          10m
my-dep-6b48cbf4f9-gfhnf   1/1     Running             0          2s
my-dep-5b7868d854-lq6mz   1/1     Terminating         0          46m
my-dep-6b48cbf4f9-ztzzw   0/1     Pending             0          0s
my-dep-6b48cbf4f9-ztzzw   0/1     Pending             0          0s
my-dep-6b48cbf4f9-ztzzw   0/1     ContainerCreating   0          0s
my-dep-5b7868d854-lq6mz   1/1     Terminating         0          46m
my-dep-6b48cbf4f9-ztzzw   0/1     ContainerCreating   0          1s
my-dep-5b7868d854-lq6mz   0/1     Terminating         0          46m
my-dep-5b7868d854-6qzt6   0/1     Terminating         0          10m
my-dep-5b7868d854-6qzt6   0/1     Terminating         0          10m
my-dep-5b7868d854-lq6mz   0/1     Terminating         0          46m
my-dep-5b7868d854-lq6mz   0/1     Terminating         0          46m
my-dep-6b48cbf4f9-ztzzw   1/1     Running             0          17s
my-dep-5b7868d854-pgp9n   1/1     Terminating         0          46m
my-dep-5b7868d854-pgp9n   1/1     Terminating         0          46m
my-dep-5b7868d854-pgp9n   0/1     Terminating         0          46m
my-dep-5b7868d854-pgp9n   0/1     Terminating         0          47m
my-dep-5b7868d854-pgp9n   0/1     Terminating         0          47m
[root@master ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP                NODE     NOMINATED NODE   READINESS GATES
my-dep-6b48cbf4f9-gfhnf   1/1     Running   0          2m41s   192.168.196.158   node01   <none>           <none>
my-dep-6b48cbf4f9-x25jn   1/1     Running   0          3m31s   192.168.196.157   node01   <none>           <none>
my-dep-6b48cbf4f9-ztzzw   1/1     Running   0          2m39s   192.168.196.159   node01   <none>           <none>
[root@master ~]# 

 

[root@master ~]# kubectl get deploy -o yaml
 
...
  spec:
        containers:
        - image: nginx:1.16.1
          imagePullPolicy: Always
          name: nginx
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File

 

版本回退

查看历史命令

[root@master ~]# kubectl rollout history deployment/my-dep
deployment.apps/my-dep 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deploy/my-dep nginx=nginx:1.16.1 --record=true

设置回退到1的时候:

[root@master ~]# kubectl rollout undo deploy/my-dep --to-revision=1
deployment.apps/my-dep rolled back

参考一下镜像版本:

[root@master ~]# kubectl get deploy/my-dep -o yaml |grep image
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"my-dep"},"name":"my-dep","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"my-dep"}},"template":{"metadata":{"labels":{"app":"my-dep"}},"spec":{"containers":[{"image":"nginx","name":"nginx"}]}}}}
                f:imagePullPolicy: {}
                f:image: {}
      - image: nginx
        imagePullPolicy: Always

Kubernetes-核心概念-其他工作负载

Deployment: 无状态应用部署,比如微服务,提供多副本等功能

StatefulSet:有状态应用部署,比如redis,提供稳定的存储、网络等功能

DaemonSet:守护型应用部署,比如日志收集组件,在每个机器都运行一份

Job/CronJob:定时任务部署,比如垃圾清理组件,可以在指定时间运行

原创文章,作者:AIRF,如若转载,请注明出处:http://www.ai-rf.com/index.php/2023/09/17/%e3%80%90%e5%9b%9b%e3%80%91k8s_deployment/

(0)
AIRFAIRF
上一篇 2023年9月17日
下一篇 2023年9月17日

相关推荐

  • docker容器分配指定内存和cpu

    如何给分配内存和cpu?默认情况下,容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,下面…

    ChatGPT 2023年8月14日
  • 【五】K8S_Service | ClusterIP模式(默认模式)| NodePort模式

    Service概念 在Kubernetes(K8S)中,Service的用途和相关概念如下: 服务发现:Service充当了一组Pod的稳定网络地址和DNS名称的抽象。它提供了一种…

    2023年9月17日
  • Docker基础命令(常用的docker命令)

    镜像相关命令 搜索镜像 # 从网络上查找需要的镜像 docker search 镜像名称 docker 搜索镜像 拉取镜像 # 从Docker的仓库下载镜像到本地,镜像名称格式为名…

    ChatGPT 2022年11月28日
  • 【精选】kubectl 常用命令指南

    kubectl 常用命令指南 Kubctl 命令是操作 kubernetes 集群的最直接的方式,特别是运维人员,需要对这些命令有一个详细的掌握 Kubectl 自动补全 # se…

    ChatGPT 2023年12月26日
  • Kubernetets-Cka考试题库

    本次测试的所有问题都必须在指定的cluster配置环境中完成。为尽量减少切换,系统已对问题进行分组,同一cluster内的所有问题将连续显示。 开启TAB补全 做题前先配置k8s自…

    ChatGPT 2022年2月18日
  • 【七】K8S_存储卷

    存储卷介绍 在Kubernetes(K8S)中,存储卷(Storage Volume)是一种持久化的存储机制,用于在Pod中保存数据,并提供了一种抽象层来将底层存储技术(如本地磁盘…

    2023年9月17日
  • 【三】K8S_NameSpace和Pod

    一、NameSpace Kubernetes(K8S)中的 Namespace 是一种用于组织和隔离集群资源的方式。它具有以下用途和相关概念: 资源隔离:Namespace 提供资…

    2023年9月17日
  • CentOS 使用 Kubeadm 方式搭建 K8s 集群,一次性成功!

    Kubeadm 方式搭建 K8s 集群 1.27.0 版本,一次性成功,具体步骤如下: 集群规划及架构 系统初始化准备(所有节点同步操作) 安装并配置cri-dockerd插件 安…

    2023年11月20日
  • 适合在虚拟化环境中运行 Kubernetes 的几个场景

    1. 前言 虚拟化技术的快速发展为企业提供了更高的灵活性、资源利用率和成本效益。同时,Kubernetes作为一个开源的容器编排系统,能够有效地管理和调度容器化应用程序。将Kube…

    Deepseek 2023年9月19日
  • 【六】K8S_Ingress | Service的统一网关入口

    Ingress简介 在Kubernetes(K8S)中,Ingress的主要用途是管理和暴露集群中的HTTP和HTTPS服务。它充当了从集群外部流量到集群内部服务的入口,并提供了一…

    2023年9月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注