本文为作者的 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

可以看到, 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 格式

使用这样的方法,可以快速获得需要的 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 2m24s NAME 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 可以获得更加详细的信息,是各种信息的集合。

查看 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

Kubernetes:了解 Deployment的更多相关文章

  1. Kubernetes中Deployment部署故障排除

    Kubernetes中Deployment部署故障排除 字符型思维导图 排查pod状态(带标签):kubectl get pods,是否有等待处理的pod? 是?kubectl describe po ...

  2. Kubernetes之Deployment控制器

    Deployment 简介 deployment 是用来管理无状态应用的,面向的集群的管理,而不是面向的是一个不可变的个体,举例:有一群鸭子,要吃掉一个,只需要再放一个新的鸭仔就好了,不会影响什么,而 ...

  3. 使用kubernetes的deployment进行RollingUpdate

    rolling update,可以使得服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新. replication controller与deployment的区别 replicatio ...

  4. (部署)使用kubernetes的deployment进行RollingUpdate

    rolling update,可以使得服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新. replication controller与deployment的区别 replicatio ...

  5. 【转】kubernetes 中 deployment 支持哪些键值

    这个比较全,可以参考 ================= https://www.addops.cn/post/kubernetes-deployment-fileds.html ========== ...

  6. 【Kubernetes】Deployment控制器模型

    在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...

  7. kubernetes的Deployment, DaemonSet, Job 和 CronJob事例

    k8s kubernetes给node节点添加标签和删除node节点标签 Deployment配置文件exampledeploymentv1.yaml apiVersion: apps/v1 kind ...

  8. Kubernetes之deployment

    Kubernetes实现了零停机的升级过程.升级操作可以通过使用ReplicationController或者ReplicaSet实现,但是Kubernetes提供了另一种基于ReplicaSet的资 ...

  9. kubernetes之deployment滚动升级

    参考:https://blog.51cto.com/wutengfei/2116663 创建和管理多个Pod--Deployment Deployment 为 Pod 和 ReplicaSet 提供了 ...

  10. Kubernetes的Deployment对象使用

    一.什么是Deployment对象 明明ReplicaSet已经可以控制pod的数量了,为什么还需要Deployment? Deploymen实际上一个两层控制器,遵循一种滚动更新的方式来实升级现有的 ...

随机推荐

  1. HttpServletResponse 入门

    继承体系 功能: 设置响应消息 1. 设置响应行 格式:HTTP/1.1 200 ok 设置状态码:setStatus(int sc) 2. 设置响应头:setHeader(String name, ...

  2. 初学python写个自娱自乐的小游戏

    一.摘要 当编写完后的代码执行第一次后达到了目标的预期效果,内心有些许满足,但是当突发情况产生后,程序便不能正常运行,于是准备从简单的版本开始出发,综合考虑使用者的需求,和使用过程中会遇到的问题,一步 ...

  3. 脚本注入1(boolean&&get)

    现在,我们回到之前,练习脚本支持的布尔盲注(get型). 布尔盲注的应用场景是查询成功和失败时回显不同,且存在注入点的地方. 这里以Less-8为例: 发现查询成功时,会显示:失败则无回显. 同时发现 ...

  4. 如何访问位于内网的Ubuntu主机

    如何访问位于内网的Ubuntu主机 内网主机为Ubuntu桌面版 内网主机Ubuntu字符串界面版 SSH远程主机管理工具推荐 SSH远程文件访问工具推荐 如何访问位于内网的Ubuntu主机 内网主机 ...

  5. 将manjaro作为主力开发系统,我遇到了哪些坑。

    首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...

  6. time_formatter攻防世界学习

    time_formatter 前言:这题说实话分析量蛮大的,首先是程序内壁比较绕,而且调用了之前许多没有见到的函数---如snprintf_che,以及strsup(好像打错了),getegid(), ...

  7. wifi 热点配置最优信道

    wifi热点服务hostapd启动需要配置hostad.conf文件,其中有一个参数channel是用来配置信道的,信道的可选参数如下: # channel 1-14 is 2.4 GHz ; cha ...

  8. P2598 [ZJOI2009]狼和羊的故事(最小割)

    P2598 [ZJOI2009]狼和羊的故事 说真的,要多练练网络流的题了,这么简单的网络流就看不出来... 题目要求我们要求将狼和羊分开,也就是最小割,(等等什么逻辑...头大....) 我们这样想 ...

  9. k8s入坑之路(9)k8s网络插件详解

    Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...

  10. 攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup

    攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup 题目介绍 题目考点 PHP代码审计 Writeup 打开 http://220.249.52.134:37877 常规操 ...