当前位置: 首页 > news >正文

k8s学习-Deployment

Kubernetes通过各种Controller来管理Pod的生命周期 。 为了满足不同业 务 景 , Kubernetes 开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。我们⾸先学习最常用Deployment。

1.1 Kubectl命令直接创建

第一种是通过kubectl命令直接创建:

kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2

在最新的 Kubernetes 版本中,kubectl create deployment 命令不再直接支持 --replicas 参数。副本数的指定现在通常是通过 kubectl scale 命令来完成。

kubectl create deployment nginx-deployment --image=nginx:1.7.9
#使用 kubectl scale 命令设置副本数:
kubectl scale deployment nginx-deployment --replicas=2

这样我们就部署了一个具有2个副本的nginx-deployment 。

1.2 YAML配置文件创建

第二种是通过配置文件+kubectl apply(kubectl create也可以)创建:
vi nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: web_servertemplate:metadata:labels:app: web_serverspec:containers:- name: nginximage: nginx:1.7.9

kubectl apply -f nginx.yml

[root@k8s-master kubernetes]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
busybox            2/2     2            2           32m
nginx-deployment   2/2     2            2           6m7s

1.3 删除deployment

kubectl delete deployment nginx-deployment

执行之后,K8S会自动帮我们删除相关Deployment、ReplicaSet(副本集)以及Pod。

1.4 Deployment配置⽂件简介

既然 用YAML配置文件 署应用 , 现在就很有必要了解⼀下Deployment的配置格式了,其他Controller(比如DaemonSet)非常类似。
vi nginx-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: web_servertemplate:metadata:labels:app: web_serverspec:containers:- name: nginximage: nginx:1.7.9

这是一个Kubernetes Deployment的YAML文件,用于定义一个NGINX容器的部署。以下是每一行的解释:

  1. apiVersion: apps/v1: 指定使用的 Kubernetes API 版本,这里是 Apps API 的版本。

  2. kind: Deployment: 定义资源对象的类型,这是一个 Deployment 对象,用于在集群中管理 Pod 的部署。

  3. metadata: 定义 Deployment 元数据,包括资源的名称。

  4. name: nginx-deployment: 指定 Deployment 的名称为 “nginx-deployment”。

  5. spec: 定义 Deployment 的规范,包括副本数、选择器和模板。

  6. replicas: 2: 指定要创建的 Pod 副本数为 2,表示要在集群中运行两个相同的 NGINX Pod。

  7. selector: 定义标签选择器,用于选择属于该 Deployment 的 Pod。

  8. matchLabels: 指定 Pod 必须具有哪些标签以匹配该 Deployment 的选择器。

  9. app: web_server: 指定标签 “app” 的值必须为 “web_server”,用于匹配 Pod。

  10. template: 定义要创建的 Pod 的模板。

  11. metadata: 定义 Pod 模板的元数据,包括标签。

  12. labels: 指定 Pod 的标签,这里设置 “app” 标签的值为 “web_server”。

  13. spec: 定义 Pod 的规范,包括容器。

  14. containers: 定义 Pod 中运行的容器的列表。

  15. - name: nginx: 定义容器的名称为 “nginx”。

  16. image: nginx:1.7.9: 指定要使用的 NGINX 镜像及其版本。

因此,这个 YAML 文件描述了一个名为 “nginx-deployment” 的 Deployment,该 Deployment 负责管理两个运行 NGINX 容器的 Pod,并且这些 Pod 必须具有标签 “app: web_server”。容器使用 NGINX 1.7.9 版本的镜像。

1.5伸缩

伸缩是指在线增加或减少Pod的副本数。Deployment nginx-deployment初始是两个副本。

[root@k8s-master kubernetes]# kubectl get deployment nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           21s

现在修改nginx.yml⽂件,将副本改成5个
spec:
replicas: 5
执行kubectl apply -f nginx-deployment.yml

[root@k8s-master kubernetes]# kubectl get deployment nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   5/5     5            5           114s

1.6 Failover

下⾯我们模拟k8s-node2故障,关闭该节点,编辑yml文件恢复到3个节点。

[root@k8s-node2 ~]# halt -h
[root@k8s-master kubernetes]# kubectl get nodes
NAME         STATUS     ROLES    AGE   VERSION
k8s-master   Ready      master   57m   v1.18.0
k8s-node1    Ready      <none>   56m   v1.18.0
k8s-node2    NotReady   <none>   56m   v1.18.

查看pod(可能需要等待一会)

[root@k8s-master kubernetes]# kubectl get pod -o wide
NAME                                READY   STATUS        RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-79c457c54b-js27q   1/1     Terminating   1          17m    10.244.2.10   k8s-node2   <none>           <none>
nginx-deployment-79c457c54b-r297k   1/1     Running       0          3m2s   10.244.1.11   k8s-node1   <none>           <none>
nginx-deployment-79c457c54b-vvvhr   1/1     Terminating   1          15m    10.244.2.9    k8s-node2   <none>           <none>
nginx-deployment-79c457c54b-whsp8   1/1     Running       0          17m    10.244.1.6    k8s-node1   <none>           <none>
nginx-deployment-79c457c54b-z5n54   1/1     Running       0          3m2s   10.244.1.12   k8s-node1   <none>           <none>

k8s-node2上的Pod最终标记为Terminating状态,并在k8s-node1上新建两个Pod,维持副本总数量为3。
当k8s-node2恢复后,Terminating的Pod会自动被删除,不过已经运行在k8s-node1的Pod是不会重新调度回k8s-node2的。

1.7用label控制Pod位置

默认情况下,K8S的Scheduler会均衡调度Pod到所有可用的Node节点,但是有些时候希望将指定的Pod部署到指定的Node节点。例如,一个I/O密集型的Pod可以尽量部署在配置了SSD的Node节点,又或者一个需要GPU的Pod可以尽量部署在配置了GPU的Node节点上。

不用担心,K8S为我们提供了label来实现这个功能,label是一个key/value对,可以灵活设置各种自定义的属性。比如,我们这里假设我们的k8s-demo示例项目是一个I/O密集型的API,还假设k8s-node1是一个配置了SSD的Node节点:
  
kubectl label node k8s-node1 disktype=ssd
kubectl get node --show-labels=true

在这里插入图片描述
修改yml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: web_servertemplate:metadata:labels:app: web_serverspec:containers:- name: nginximage: nginx:1.7.9nodeSelector:disktype: ssd

然后,再次apply创建资源:

kubectl apply -f nginx-deployment.yml
验证一下,所有的k8s-demo的Pod全都调度到了k8s-node1上面,符合预期:

[root@k8s-master kubernetes]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-744c4bcdf6-4bzgh   1/1     Running   0          37s   10.244.1.13   k8s-node1   <none>           <none>
nginx-deployment-744c4bcdf6-b5t2f   1/1     Running   0          36s   10.244.1.14   k8s-node1   <none>           <none>
nginx-deployment-744c4bcdf6-ch65k   1/1     Running   0          35s   10.244.1.15   k8s-node1   <none>           <none>

相关文章:

  • javaweb学习day01(HTML)
  • 前端关于学习方式,解决问题的面试题(本人真实面试题)
  • Windows系统还原打印机系统教程
  • kafka简单介绍和代码示例
  • 【深度学习入门】深度学习基础概念与原理
  • 一款优秀的双链笔记Blossom 安装教程 私有部署的云端双链笔记软件Blossom
  • UI设计中插画赏析和产品色彩分析
  • 昇思MindSpore技术公开课——第三课:GPT
  • GO基础进阶篇 (十四)、Http编程
  • 现阶段Python和Java哪个更吃香?
  • 代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
  • 网络安全(黑客)—2024秩序
  • 实验二 体系结构
  • 红队打靶练习:HOLYNIX: V1
  • 爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Apache Spark Streaming 使用实例
  • Cumulo 的 ClojureScript 模块已经成型
  • go语言学习初探(一)
  • happypack两次报错的问题
  • Protobuf3语言指南
  • Python学习笔记 字符串拼接
  • Redis 中的布隆过滤器
  • select2 取值 遍历 设置默认值
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • text-decoration与color属性
  • Vim Clutch | 面向脚踏板编程……
  • 从setTimeout-setInterval看JS线程
  • 动态魔术使用DBMS_SQL
  • 基于组件的设计工作流与界面抽象
  • 开源地图数据可视化库——mapnik
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • MPAndroidChart 教程:Y轴 YAxis
  • ​力扣解法汇总946-验证栈序列
  • ​什么是bug?bug的源头在哪里?
  • #### go map 底层结构 ####
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)fiber的基本认识
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (九)One-Wire总线-DS18B20
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (一)UDP基本编程步骤
  • (转)关于pipe()的详细解析
  • ***原理与防范
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET处理HTTP请求