Hi,大家好,欢迎大家和我一起学习 K8S。

Deployment 是 K8S v1.2 引入的概念,与之一起引入还有 ReplicaSet。这两个概念是等同的,准确说是 Deployment 内部调用 ReplicaSet 来实现。

之前这个概念是由 Replication Controller 来实现的,但由于和 K8S 代码中的模块重名,所以就改成 Deployment + ReplicaSet 的组合。

Deployment 实现了 Pod 的副本管理,使得应用的表现形态和用户期望的状态保持一致。比如用户期望应用部署为 3 副本,如果在运行过程中有一个副本挂了,那么 Deployment 会自动拉起一个副本。

Deployment 对于应用的编排、自动扩容和缩容、升级回滚等功能都是至关重要的。

下面我们通过一个例子来看看 Deployment 是如何工作的。

定义一个 nginx.yaml 文件(对 yaml 文件不熟悉的可以查阅这篇文章):

apiVersion: apps/v1   
kind: Deployment    
metadata:    
  name: nginx-deployment    
spec:
  replicas: 2    
  template:      
    metadata:
      labels:    
        app: web-server
    spec:        
      containers:  
      - name: nginx      
        image: nginx:1.12.1     
        ports:  
        - containerPort: 80

这个文件定义了一个 nginx 容器应用,两个 Pod 副本。也就是每个 Pod 中会跑一个 nginx 应用。

执行kubectl create -f nginx.yaml创建 Deployment 对象,在执行 kubectl get deploy 查看创建的 Deployment。

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_Pod

可以看到,其中两个参数 desired(期待副本数)和 current(当前副本数)都为 2,保持一致,我们再执行 kubectl get pod -o wide 查看当前 Pod 的情况:

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_Deployment_02

可以看到,创建了两个 Pod 自动调度到了 Node1 和 Node2 上。这说明每个 Pod 副本是由 Deployment 统一创建并维护的。

为了一探究竟,我们继续深挖 Deployment。

执行 kubectl describe deployment nginx-deployment 查看该 Deployment 的详细信息。

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_nginx_03

图中圈住的地方告诉我们,这里创建了一个 ReplicaSet,也就是说 Deployment 内部是调用 ReplicaSet 来完成 Pod 副本的创建的。是否是这样,我们继续验证。

执行 kubeclt get replicaset 显示创建的 ReplicaSet 对象:

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_Pod_04

可以看到这里的 ReplicaSet 名称和上面 Deployment 信息里显示的是一样的,同样,执行 kubectl describe replicaset xxx 显示该 ReplicaSet 的详细信息。

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_应用系统采用K8S容器多副本部署_05

图中,有两处地方值得注意。一处是 Controlled By,表明 ReplicaSet 是由谁创建并控制的,显然这里显示是 Deployment。第二处是 Events,Events 记录了 K8S 中每一种对象的日志信息,这里的信息有助于排错查问题。我们可以看到这里记录了两个 Pod 副本的创建,Pod 的名称和我们在上面执行 kubectl get pod 看到的结果是一样的。

继续执行 kubectl describe pod xxx 查看其中一个 Pod 的详细信息:

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_Pod_06

可以看到这个 Pod 是由 ReplicaSet 创建的。

到此,我们不难得出下面这幅图:

应用系统采用K8S容器多副本部署 k8s的多副本有什么用_Pod_07

用户通过 kubeclt 创建 Deployment,Deployment 又创建 ReplicaSet,最终由 ReplicaSet 创建 Pod。

从命名上我们也可以看出,子对象的名字 = 父对象的名字 + 随机字符串。

总结

本文我们从实践上剖析了 Deployment 创建 Pod,实际上经过 ReplicaSet 进行创建。Deployment 最主要是对 Pod 进行副本管理,这样可以进行很多自动化管理的复杂操作,后面我们逐步从实践上去剖析 Pod 的各种操作。


我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。



转载于: