学习本节内容前,希望你已经对Kubernetes中的Pod,ReplicaSet,Deployment等对象有了初步的了解,具体可以参考以下文章:
在Kubernetes中,几乎一切都是对象。常见的对象包括:Node,Pod,Deployment,ReplicationController, ReplicaSet等等。我们通常通过在描述文件中指定kind来创建不同种类的对象。Kubernetes通过etcd存储我们创建的对象,从而使应用按照你期望的方式稳定运行在容器中。
1. 理解Kubernetes对象
Kubernetes对象本质上一种用于持久化的实体,Kubernetes使用这些持久化实体来描述一个集群。通常一个Kubernetes对象可以包含以下信息:
- 需要运行的应用以及运行在哪些node上
- 应用可以使用哪些资源
- 应用运行时的一些配置,例如重启策略,升级以及容错性
因此,一个Kubernetes对象,其实就是你意图的体现(通过.yaml文件来描述)。一旦你创建了一个对象后,Kubernetes会确保这个对象一直处于你所期望的状态。
1.1 对象定义和对象状态
每一个Kubernetes对象都包含两个属性:对象定义(Spec)和对象状态(Status)。Spec包含了你期望对象应有的状态,一般通过.yaml文件来描述。Status是该对象当前实际的状态。Kubernetes最大的魅力就在于,在任何状况下,它都会尽力确保对象的状态处于你所期望的状态。
举个例子,一个Deployment类型的对象,代表了你在集群上运行的一个应用。当你创建这个对象的时候,指定了replicas=3,这意味着你希望这个应用以拥有三个副本的状态下运行。如果其中一个副本由于程序问题崩溃了,那么当前应用的Status就是副本数为2,这与你期望的状态(Spec: replicas=3)不相同,因此Kubernetes会自动为你新建一个副本,从而使此应用的实际状态与你期望的状态相符。
2. 创建Kubernetes对象
创建一个Kubernetes对象通常分为两步:
- 创建对象描述文件
- 通过kubectl命令行接口创建对象
2.1 Kubernetes对象描述文件
Kubernetes对象描述文件是一个必须满足yaml语法的文件。下面是一个用于描述Deployment类型的对象的例子:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
一个描述文件通常包含以下字段:
- apiVersion: 使用哪个版本的Kubernetes API来创建此对象
- kind:要创建的对象类型,例如Pod,Deployment等
- metadata:用于唯一区分对象的元数据,包括:name,UID和namespace
- spec: 其它描述信息。不同类型的对象拥有不同的spec定义。详情参见API文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/
2.2 kubectl命令行接口
描述文件创建好之后,就可以通过kubectl命令行接口来创建对象了:
kubectl apply -f nginx-deployment.yaml
输出信息如下:
deployment "nginx-deployment" created