Kubernetes API是管理各类资源对象的唯一入口,它提供了一个RESTful风格的接口用于增、删、改、查操作,并将结果存储在etcd中。对于用户而言,直接操作API无疑是不方便的,因此,Kubernetes也为我们提供了kubectl命令行工具,可以让我们使用命令的方式调用API。
当需要创建资源对象时,kubectl可以通过配置列表来声明这些 “对象”。配置列表可以被看作是对象“属性”的描述文件,格式可以是 “JSON” 或 “YAML”,常用的是YAML格式。
以Pod为例,以下是一个简单的pod.yaml文件模板。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
可以看到该文件内容是由几个模块组成,分别是apiVersion、kind、metadata和spec,它们的功能定义如下:
apiVersion:这里指定创建该对象所使用的Kubernetes API版本,目前Kubernetes大部分常见的核心资源对象都归属于v1这个核心API。
kind:指定对象所属的资源类型,如Pod、Service、Deployment等。
metadata:用于配置对象的元数据信息,如名称、标签、注释、namespace等,其中标签是K8s中一个具有特色的概念,我们会在下篇文章中单独介绍。
spec:用于描述对象的规格,可以看作是对象期望的状态。如本例中的Pod对象包含了一个名称为myapp-pod的容器,该容器的镜像为busybox,并带有启动命令。那么,当执行这个配置列表时,kubernetes将按照这个规格去创建Pod。
除了以上四个部分,对象还会有一个status字段,它用于描述对象的实际状态,这部分的内容由Kubernetes系统负责维护和更新。在任何时段,Kubernetes会努力管理着对象的实际状态与期望状态相匹配。
当完成配置列表后,接下来就是将其在集群中声明创建。
如下:
$ kubectl create -f pod.yaml
pod/myapp-pod created
现在,我们查看资源,可以对象实例已经起来了。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 87s