Kubernetes:了解 Deployment

简介: Kubernetes:了解 Deployment

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 nodeskubectl describe node nginx。实际上加不加 s 都一样。


kubectl apply/create


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


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

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

根据 Kubernetes 官方的文档说明,应始终使用 kubectl applykubectl 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 格式

微信图片_20220505193423.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           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 可以获得更加详细的信息,是各种信息的集合。

微信图片_20220505193413.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


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
340 1
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
757 0
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
弹性计算 运维 Kubernetes
Kubernetes(K8S) Controller - Deployment 介绍
Kubernetes(K8S) Controller - Deployment 介绍
215 1
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?
|
存储 Kubernetes 调度
在K8S中,deployment的创建过程包括什么?
在K8S中,deployment的创建过程包括什么?
|
Kubernetes API 容器
在K8S中,deployment的yaml文件如何编写呢?
在K8S中,deployment的yaml文件如何编写呢?
|
Kubernetes 容器 Perl
在k8S中,deployment升级策略是什么?
在k8S中,deployment升级策略是什么?
|
Kubernetes API Perl
在k8S中,deployment升级过程是什么?
在k8S中,deployment升级过程是什么?

推荐镜像

更多