Kubernetes:全面了解 Deployment

本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:

https://k8s.whuanle.cn【适合国内访问】

https://ek8s.whuanle.cn 【gitbook】

Deployment 是 Kubernetes 提供的一种自我修复机制来解决机器故障维护的问题。前面提到了单独部署 Pod,但是这种方式只适合临时的 Pod,用于测试调试。如果要用于生产,则需要 Deployment 等控制器管理部署 Pod,维护 Pod 的副本数量以及 Pod 监控和维护。

对于 Kubernetes 对象的部署,例如 Pod、Deployment、Service 等,有三种部署方式:

  • Using Generators (Run, Expose)

  • Using Imperative way (Create)

  • Using Declarative way (Apply)

在 2.1 章中,我们已经学习了 Run 和 apply 等,在本篇以及后面的章节中,我们会一步步深入学习这些部署方式。

本篇包含或需要掌握以下内容:

  • 创建 Deployment

  • 修改 Deployment

  • 查看 Deployment 、Pod、Services、副本

在本篇文章中,我们将部署一个 Nginx 实例,并学会 部署以及管理 Deployment、Pod。

Deployment

当我们单独使用 docker 部署应用时,为了应用挂了后能够重启,我们可以使用 --restart=always 参数,例如:

docker run -itd --restart=always -p 666:80 nginx:latest

但是这种方式只能单纯重启容器,并不具备从机器故障中恢复的能力,即当一台服务器挂了后,此服务器上所有的容器全部挂掉。

Kubernetes Deployment 是一种 Pod 管理方式,它可以指挥 Kubernetes 如何创建和更新你部署的应用实例,创建 Deployment 后,Kubernetes master 会将应用程序调度到集群中的各个节点上。Kubernetes Deployment 提供了一种与众不同的应用程序管理方法。

Deployment 的创建,有两种方法,一种是直接使用命令创建(kubectl create),一种是通过 YAML(kubectl apply),后面我们会介绍这两种创建方法。

创建 Deployment

在 Kubernetes 中,Pod 是调度的最小单位,一个 Pod 中包含多个 容器,所以我们的各种操作都是在 Pod 之上。

我们来使用 deployment 部署一个 Pod,这个 Pod 包含一个 Nginx 容器。

kubectl create deployment nginx --image=nginx:latest

格式:

kubectl create deployment {deployment对象名称} --images={镜像名称和标签}

此时,nginx 容器会以 Pod 的方式部署到节点中,但是被部署到哪个节点是随机的,如果你只有一个 worker 节点,则 Pod 必定在这个 Worker 节点上。当然,我们可以获取到具体的调度信息,从中查看 Pod 被调度到哪个节点。

root@instance-1:~# kubectl get deployments -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx   1/1     1            1           52s   nginx        nginx:latest   app=nginx
root@instance-1:~# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
nginx-55649fd747-s4824   1/1     Running   0          61s   192.168.56.4   instance-2   <none>           <none>

可以看到, Pod 在 instance-2 中运行着。

Deployment 会为我们自动创建 Pod,Pod 由 {deployment名称}-{随机名称} 组成。

[Info] 提示

还有一个地方也说一下,kubectl get xxx 时,带不带 s 都没关系,例如 kubectl get nodes / kubectl get node 都是一样的。

不过,一般从语义上,我们获取全部对象时,可以使用 kubectl get nodes,获取具体的对象时,可以使用 kubectl get node nginx。类似的,kubectl describe nodes 、kubectl describe node nginx。实际上加不加 s 都一样。

kubectl apply/create

当我们创建一个 deployment 时,kubectl create 和 kubectl apply 效果是一样的,但是 apply 还具有更新(update) 的功能。

kubectl apply 会在以前的配置、提供的输入和资源的当前配置之间 找出三方差异,以确定如何修改资源,kubectl apply 命令将会把推送的版本与以前的版本进行比较,并应用你所做的更改, 但是不会自动覆盖任何你没有指定更改的属性

另外还有 kubectl replace 、kubectl editkubectl replace 是破坏性更新/替换,容易导致问题;kubectl edit 可以更新 Deployment 等已存在的对象。

根据 Kubernetes 官方的文档说明,应始终使用 kubectl apply 或 kubectl create --save-config 创建资源。

前面已经学习了 kubectl create,这里学习一下 kubectl apply

通过 YAML 文件部署 nginx:

kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

很多开源软件提供了 YAML 文件,我们通过 YAML 文件可以快速部署服务,如 Redis、Consul 等。

这里再说一下创建 Deployment 的区别。

如果使用 create 创建,命令格式:

kubectl create deployment {deployment的名字} --image={镜像名称}

如果使用 apply 命令创建,YAML 中需要指定一些信息,可定制性很高。

kind: Deployment
... ...
medatada:name:nginx
... ...spec:containers:- image: nginx:latest

然后执行 kubectl apply -f xxx.yaml 文件。

一个是 kubectl create deployment ;另一个是 kubectl apply -f,在 yaml 中指定 kind: Deployment

如果我们只需要快速创建,使用命令形式就行;如何生产生产,还是得使用 YAML 文件,并于留存记录。

要删除一个对象,可以使用 kubectl delete -f {名称}.yaml,如删除 calico。

kubectl delete -f calico.yaml

检查 YAML

有时我们不知道我们的创建命令或 yaml 是否正确,可以使用 --dry-run=client ,--dry-run=client 参数来表示当前内容只是预览而不真正提交。

kubectl create deployment testnginx --image=nginx:latest --dry-run=client

在一些 k8s 认证中,我们没时间一点点写 yaml ,但是又需要定制,此时可以使用 --dry-run=client -o yaml ,既可以不生效 Deployment,又可以导出 yaml 文件。

[Info] 提示

-o wide 可以查看对象更多的字段信息;kubectl describe 可以查看对象的全部详细信息;-o yaml 或 -o json 可以查看对象的定义/描述文件。

--dry-run 取值必须为none、server或client。如果客户端策略,只打印将要发送的对象,而不发送它。如果是服务器策略,提交服务器端请求而不持久化资源。

命令示例如下:

kubectl create deployment testnginx --image=nginx:latest --dry-run=client -o yaml
# -o json 可以输出 json 格式

576b33edd081efb2ab23962001a4cb2c.png

使用这样的方法,可以快速获得需要的 YAML 模板,然后复制到 YAML 文件,根据需要改动、定制。除了 deployment,其它 kubernetes 对象也可以使用这种方法。

查看 Deployment

我们以 Deployment 的方式部署 Pod ,就会创建一个 Deployment 对象,获得 deployment 列表:

kubectl get deployments
kubectl get deployments -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           2m24sNAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
nginx   1/1     1            1           2m42s   nginx        nginx:latest   app=nginx

在 kubectl get ... 后面加上 -o wide 可以获得更多的标签信息。

使用 kubectl get events 可以获得集群中最近发生的事件,如创建 Deployment 到部署容器过程的详细事件记录。

Successfully assigned default/nginx-55649fd747-wdrjj to instance-2
Pulling image "nginx:latest"
Successfully pulled image "nginx:latest" in 8.917597859s
Created container nginx
Started container nginx
Created pod: nginx-55649fd747-wdrjj
Scaled up replica set nginx-55649fd747 to 1

使用 kubectl describe deployment nginx 可以获得更加详细的信息,是各种信息的集合。

60439e8a5629ce8c5d61a28d9df0df64.png

查看 Pod

我们没有直接创建 Pod,而是通过 Deployment 创建,接下来我们需要了解如何查看 Pod 。

kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-55649fd747-msw8g   1/1     Running   0          4h16m

可以看到一个 Pod 名为 nginx- ,因为我们是利用 Deployment 部署 Pod 的,没有指定这个 Pod 的名称,所以默认 Pod 名称以 Deployment 名称为前缀。

我们查看这个 pods 被部署到了哪个节点上:

kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE         
nginx-55649fd747-msw8g   1/1     Running   0          4h19m   192.168.56.57   instance-2

可以看到,这个 Pod 在 instances-2 这个节点上,同时这个 Pod 也有一个 IP,Kubernetes 会为每个 Pod 分配一个唯一的 IP,这个 IP 可以在节点上访问,其它 Pod 也可以通过 IP 访问此 Pod。

由于这个 Pod 里面的容器是 Nginx(80端口),所以我们可以访问这个 IP 可以打开 Nginx 页面。

root@instance-1:~# curl 192.168.56.57
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {
... ...

对于没有指定的 Deployment、Pod、Service 等对象,会默认分配到 default 命名空间中,我们在执行kubectl get {} 时,会获取 default 命名空间中的对象, 后面加上 --all-namespaces 可以获得所有命名空间中的对象,使用 --namespace= 可以指定获取某个命名空间中的对象。

kubectl get pods --all-namespaces
# kubectl get pods --namespace=default
NAMESPACE              NAME                                         READY   STATUS      RESTARTS   AGE
default                nginx-55649fd747-msw8g                       1/1     Running     0          4h28m
kube-system            etcd-instance-1                              1/1     Running     1          13d
kube-system            kube-apiserver-instance-1                    1/1     Running     1          13d
kube-system            kube-controller-manager-instance-1           1/1     Running     1          13d
kube-system            kube-proxy-bhj76                             1/1     Running     1          13d
kube-system            kube-proxy-pm597                             1/1     Running     0          13d
kube-system            kube-scheduler-instance-1                    1/1     Running     1          13d
kubernetes-dashboard   dashboard-metrics-scraper-856586f554-4nd9v   1/1     Running     1          13d
kubernetes-dashboard   kubernetes-dashboard-78c79f97b4-288js        1/1     Running     1          13d

在 worker 节点上执行 docker ps,可以看到 Nginx 容器:

root@instance-2:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
fe7433f906a0   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 6 seconds              k8s_nginx_nginx-55649fd747-wdrjj_default_ea41dcc4-94fe-47f9-a804-5b5b1df703e9_0

实时修改

使用 kubectl edit 可以实时修改一个对象,这里我们使用前面已经部署好的 Nginx 这个 Deployment,因为创建的 Pod 名称有点长,我们希望直接改成 nginx。

修改 deployment:

kubectl edit pod nginx-55649fd747-msw8g

在 metadata 字段中,找到 name: nginx-55649fd747-msw8g ,修改为合适的名称。

修改完毕后,会提示:

A copy of your changes has been stored to "/tmp/kubectl-edit-w11bx.yaml"
error: At least one of apiVersion, kind and name was changed

出于某些原因,直接修改 name 字段是不行的,还需要修改其它地方。

这里读者了解,可以通过 kubectl edit 实时直接修改对象即可。后面还会介绍另一种修改方法。

导出 yaml

我们可以从已经创建的 Deployment 、Pod、Service 等对象导出 yaml 文件,使用 -o yaml 即可导出(-o json 导出json)。

kubectl get deployment nginx -o yaml
# 保存到文件
# kubectl get deployment nginx -o yaml > mynginx.yaml

然后终端会打印:

apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "1"creationTimestamp: "2021-04-21T00:37:13Z"generation: 1labels:app: nginxname: nginxnamespace: default
... ...

虽然我们创建对象时的命令很简单,但是生成的 YAML 很复杂。

我们可以尝试把 yaml 导出到 mynginx.yaml 文件中,然后我们删除这个 Deployment。

kubectl get deployment nginx -o yaml > mynginx.yaml
kubectl delete deployment nginx

然后利用导出的 mynginx.yaml 再创建一个 Deployment。

kubectl apply -f mynginx.yaml

多个 容器

一个 Pod 中,是可以包含多个容器的,我们可以使用命令或 YAML 形式创建包含多个容器的 Pod 服务。示例如下:

root@master:~# kubectl create deployment testnginx --image=nginx:latest --image=busybox:latest --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: testnginxname: testnginx
spec:replicas: 1selector:matchLabels:app: testnginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: testnginxspec:containers:- image: nginx:latestname: nginxresources: {}- image: busybox:latestname: busyboxresources: {}
status: {}

总结

本小章中不只是讲解 Deployment,还包含了很多日常管理对象的命令,读者可多做练习,加深记忆。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最冤!美国原子弹之父被骂了9年!最后他上台领奖,竟一把推开了总统.........

全世界只有3.14 % 的人关注了爆炸吧知识原子裂变不及人心善变“漫天奇光异彩&#xff0c;犹如圣灵逞威&#xff0c;祇有千只太阳&#xff0c;始能与它争辉。”1945年7月15日&#xff0c;奥本海默注视着远处的蘑菇云&#xff0c;想起了《摩诃婆罗多经&#xff1a;福者之歌》中的…

spring 基于java的配置

2019独角兽企业重金招聘Python工程师标准>>> 7.10 Classpath scanning and managed componets 文档地址: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-classpath-scanning 本章中大部分例子是用xml来指定配置元数据,以…

WPF 实现3D翻转倒计时控件~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇倒计时控件01—代码如下一、创建 NumberCardControl.xaml代码如下。<UserControl x:Cl…

Android之Android studio基本调试和快捷键

第一种调试方法: 如果APP是单进程,直接debug运行,如下图 第二种调试方法: 第二种就是调试当前已经处于运行状态下的App,这也是我们用的更多的一种调试手段,即 Attach debugger to Android process 。点击运行按钮右侧第三个按钮,弹出 Choose Process 窗口,选择对应的进…

Windows 2008 R2安装DHCP服务器问题及解决方法

错误一&#xff1a;0x80074E6F 指定的服务器已在目录服务中造成此错误的原因是DHCP服务器没有正常卸载&#xff0c;第二次安装就会报如下图错误解决方法1.卸载DHCP服务器2.重启服务器3.打开adsiedit.msc4.如下图展开到 CNNetServices5.删除CNYour ServerName6.重新安装DHCP服务…

免费动态域名解析

DDNS 顾名思义就是动态域名解析&#xff0c;让域名绑定在动态 IP 上&#xff0c;比如拨号上网的 ADSL 用户。国内的 DDNS 服务有花生壳和 3322.org 这种提供商&#xff0c;我一直在用花生壳的免费 DDNS&#xff0c;可是近期情况非常糟糕&#xff0c;我到北京以来&#xff0c;就…

2021 年 CNCF 和开源速度的年终报告

深入了解开发速度最快的项目&#xff0c;可以很好地表明哪些领域正在起飞&#xff0c;哪些平台可能在未来几个月和几年内取得成功。如何评估一个项目的活跃度&#xff0c;通常从这几个方面, commits, contributions, issues 和 pull requests&#xff0c;而使用气泡图是一种很巧…

清华姚班毕业生不配自信?张昆玮在豆瓣征女友,却被网友群嘲......

全世界只有3.14 % 的人关注了爆炸吧知识不要看脸好好说话没想到&#xff0c;清华也有被瞧不起的一天。上周&#xff0c;山西某网友在D瓣上发布了一则征友贴&#xff1a;总结下来&#xff0c;就是一句话&#xff1a;俺&#xff0c;一介俗人&#xff0c;二本教师&#xff0c;兼职…

python自带的函数有哪些_为什么说 Python 内置函数并不是万能的?

在Python猫的上一篇文章中&#xff0c;我们对比了两种创建列表的方法&#xff0c;即字面量用法 [] 与内置类型用法 list()&#xff0c;进而分析出它们在运行速度上的差异。在分析为什么 list() 会更慢的时候&#xff0c;文中说到它需要经过名称查找与函数调用两个步骤&#xff…

抽象类与接口比较

为什么80%的码农都做不了架构师&#xff1f;>>> 老生重谈&#xff0c;每次谈却有不同的收获。抽象类与接口联系 1、是什么 抽象类&#xff1a; public abstract class Door{public int height 250;public int width 150;void open(){System.out.print(&qu…

Prism源代码解析(IRegionManager)

概要本文主要介绍Prism的IRegionManager, 主要分析源代码的执行流程, 来介绍内部实现的几个核心接口调用过程。通过本文, 你可以熟练的掌握Prism当中以下接口的作用以及使用方法, 如下所示:IRgionManagerINavigationAwareINavigateAsyncIRegionNavigationServiceIConfirmNaviga…

Android后台强制结束进程,Application入口或者activity回调的是哪个方法?

问题描述dengdeng 解决方案1如果是系统强制结束&#xff0c;不会调用的 转载于:https://www.cnblogs.com/yiguobei99/p/4002126.html

日本的电视节目到底能有多特别?

1 是不是设计师忘了开扇窗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 路灯&#xff1a;&#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当代大学生的真实水平&#xff08;素材来源网络&#xff0…

记一次 Oracle无法连接 问题分析

前言今天&#xff0c;同事告诉我&#xff0c;有台Oracle服务器异常断电&#xff0c;重启后发现无法连接了。分析过程1.检查服务状态查看Oracle的listerner服务和service服务&#xff0c;发现都是正在运行状态&#xff0c;说明服务是正常的。2.检查端口状态在客户机上使用&#…

最详细的最小堆构建、插入、删除的过程图解

转载&#xff1a;http://blog.csdn.net/hrn1216/article/details/51465270 1.简介 最小堆是一棵完全二叉树&#xff0c;非叶子结点的值不大于左孩子和右孩子的值。本文以图解的方式&#xff0c;说明 最小堆的构建、插入、删除的过程。搞懂最小堆的相应知识后&#xff0c;最大堆…

初探mysql数据库模式(一)

数据库模式是什么&#xff1f; 数据库模式是描述整个数据库的数据结构和数据库底层架构的事务。它分为逻辑模式&#xff08;俗称&#xff1a;“模式”&#xff09;&#xff0c;外模式(俗称&#xff1a;“子模式”or“用户模式”)&#xff0c;内模式(俗称&#xff1a;“存…

数学界最恐怖的存在!54张图读懂2600年数学史,看完跪下了......

全世界只有3.14 % 的人关注了爆炸吧知识“中国现代数学之父”华罗庚曾说过宇宙之大&#xff0c;粒子之微火箭之速&#xff0c;化工之巧地球之变&#xff0c;生物之谜日用之繁&#xff0c;无处不用数学回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程…

R中大数据量数据框的合并慎重使用rbind

最近在用R处理百万级的数据&#xff0c;程序本身是线性扫描&#xff0c;可是随着数据量的增加&#xff0c;运行时间却不是线性增加&#xff0c;一度几天都运行不完。 怀疑是其中rbind函数造成的&#xff0c;查询到这篇文章&#xff0c;也说了这个问题 http://blog.sina.com.cn/…