Kubernetes最核心的功能就是编排,而编排操作都是依靠控制器对象来完成的,高级的控制器对象控制基础的控制器对象,基础的控制器对象再去控制Pod
,Pod
里面再包容器。Kubernetes
项目里API
对象的层级结构大概就是这样。前面的文章:(Kubernetes Pod入门指南) 已经介绍了Pod
概念和使用方法,今天我们来介绍管理Pod
的最基础的一个控制器ReplicaSet
。
光从ReplicaSet
这个控制器的名字(副本集)也能想到它是用来控制副本数量的,这里的每一个副本就是一个Pod
。ReplicaSet
它是用来确保我们有指定数量的Pod
副本正在运行的Kubernetes
控制器,意在保证系统当前正在运行的Pod
数等于期望状态里指定的Pod
数目。
一般来说,Kubernetes
建议使用Deployment
控制器而不是直接使用ReplicaSet
,Deployment
是一个管理ReplicaSet
并提供Pod
声明式更新、应用的版本管理以及许多其他功能的更高级的控制器。所以Deployment
控制器不直接管理Pod
对象,而是由 Deployment
管理ReplicaSet
,再由ReplicaSet
负责管理Pod
对象。
redis副本集,明白了这个逻辑后就明白为什么要在学习Deployment
前先来了解ReplicaSet
这个控制器对象了。
ReplicaSet
会通过标签选择器(Label-Selector)管理所有带有与选择器匹配的标签的容器。创建Pod
时,它会认为所有Pod
是一样的,是无状态的,所以在创建顺序上不会有先后之分。如果使用相同的标签选择器创建另一个ReplicaSet
,则之前的ReplicaSet
会认为是它创建了这些Pod
,会触发控制循环里的逻辑删掉多余的Pod
,新的ReplicSet
又会再次创建Pod
。双方的当前状态始终不等于期望状态,这就会引发问题,因此确保ReplicaSet
标签选择器的唯一性这一点很重要。
下面这个配置文件的模板里罗列了定义ReplicaSet
对象的YAML
文件内容的主要组成部分:
apiVersion: apps/v1
kind: ReplicaSet
metadata: name: some-namelabels:app: some-Apptier: some-Tier
spec: replicas: 3 # 告诉k8s需要多少副本Selector: # 用于匹配Pod的标签选择器matchLabels:tier: someTiertemplate:metadata:labels:app: some-Apptier: someTierspec: # 与Pod对象的spec定义类似Containers:
Kubernetes
里所有的API
对象都由四部分组成:
mongodb副本集连接?apiVersion -- 当前使用的Kubernetes
的API版本。
kind -- 你想创建的对象的种类。
metadata -- 元数据,用于唯一表示当前的对象,比如name、namespace等。
spec -- 当前对象的指定配置。
kube-controller-manager、但是ReplicaSet
的spec部分的定义看起来与其他对象的spec定义略有不同。上面的示例中有两个spec
字段。第一个spec
声明的是ReplicaSet
的属性--定义有多少个Pod
副本(默认将仅部署1个Pod
)、匹配Pod
标签的选择器等。第二个spec
用于Pod
里的容器属性等配置。
实际上" .spec.template"里的内容就是声明Pod
对象时要定义的各种属性,所以这部分也叫做PodTemplate(Pod模板)。还有一个值得注意的地方是:在.spec.selector
中定义的标签选择器必须能够匹配到spec.template.metadata.labels
里定义的Pod
标签,否则Kubernetes
将不允许创建ReplicaSet
。
了解了什么是副本集,以及如何编写副本集的声明文件后,接下来我们动手创建一个副本集。在此示例中,我们将通过replica.yaml
文件创建一个具有3个Pod
副本的nginx
应用。
# replica.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: myapp-replicaslabels:app: myapptier: frontend
spec:replicas: 3selector:matchLabels:tier: frontendmatchExpressions:- {key: tier, operator: In, values: [frontend]}template:metadata:labels:app: myapptier: frontendspec:containers:- name: nginximage: nginxports:- containerPort: 80
首先我们运行kubectl create命令使用上面定义的声明文件创建对象。
$ kubectl create -f replica.yaml
replicaset.apps "myapp-replicas" created
kubernetes控制器、接下来通过命令确保副本集创建成功
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
myapp-replicas 3 3 3 15s
上面的命令返回显示了myapp-replicas
副本集部署了三个副本,三个都是就绪状态。接下来我们再看一下每个Pod
副本的运行状态:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-replicas-67rkp 1/1 Running 0 33s
myapp-replicas-6kfd8 1/1 Running 0 33s
myapp-replicas-s96sg 1/1 Running 0 33s
所有3个都处于运行状态,重启次数都是0,这意味着目前为止我们的应用程序没有崩溃过。我们还可以使用kubectl describe
命令查询副本集对象的详细信息,信息里的Events
部分详细显示了ReplicaSet
控制器进行过哪些编排动作。
$ kubectl describe replicaset myapp-replicas
Name: myapp-replicas
Namespace: default
Selector: tier=frontend,tier in (frontend)
Labels: app=myapptier=frontend
Annotations:
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:Labels: app=myapptier=frontendContainers:nginx:Image: nginxPort: 80/TCPHost Port: 0/TCPEnvironment: Mounts: Volumes:
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 12m replicaset-controller Created pod: myapp-replicas-6kfd8Normal SuccessfulCreate 12m replicaset-controller Created pod: myapp-replicas-67rkpNormal SuccessfulCreate 12m replicaset-controller Created pod: myapp-replicas-s96sg
总体来说ReplicaSet
需要掌握的基本概念就这么多,从上面的YAML
文件中我们可以看到,一个 ReplicaSet
对象的定义,其实就是由副本数目的定义和一个 Pod 模板组成的。等下篇文章讲到Deployment
对象时你就会发现,ReplicaSet
对象定义文件里的内容其实是Deployment
对象的子集。
k8s controller、实际应用中我们不直接创建使用ReplicaSet
对象,而是直接使用更高级的控制器对象Deployment
,由 Deployment
管理ReplicaSet
。
Kubernetes入门实践--部署运行Go项目
如何避免用动态语言的思维写Go代码
1.看到这了就点个「在看」吧,你点一次小编涨工资两毛。
2.关注公众号网管叨bi叨
,「每周为您分享原创技术文章」!
“在看转发”是最大的支持
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态