这两天搭建了一个Kubernetes集群,包含三个节点,如图所示:
接下来该学习如何在k8s集群上运行第一个k8s应用了。
准备镜像
首先第一步,我们应该准备我们运行这个应用所需要的容器镜像。
编写应用配置文件
有了容器镜像之后,我们需要编写应用配置文件告诉k8s我们想要如何运行我们的容器。
应用配置文件一般是YAML格式的,其中包含容器的定义、参数、配置等等信息,然后只需一条指令(kubectl create -f)就可以通过这个YAML文件把容器运行起来。
一个典型的YAML格式应用配置文件示例如下:
运行应用
# 执行如下指令即可运行k8s应用
kubectl create -f nginx-test.yaml
# 通过如下指令查看应用的运行状态是否与预期一致
# 这个指令从k8s中获取指定的API对象
kubectl get pods -l app=nginx
可以看到两个nginx镜像已经运行起来了!
我们甚至没有手动拉取镜像,因为在使用kubectl create指令时,k8s会自动将所需镜像拉取下来。
很简单,不是吗?可以看到运行k8s应用的最重要的部分应该是编写对应的YAML格式文件了。
YAML格式文件
YAML格式的文件使用缩进来表示层次关系,但要注意不可用tab键来进行缩进,对于相同层级的元素,需要使用相同的空格个数来进行缩进,空格的个数并无指定,我一般使用4个。
一个YAML文件对应到k8s中就是一个API对象,k8s会按照YAML文件来创建出这些对象所定义的容器或者其他类型的API资源。
以上面的YAML文件为例
kind字段这个API对象的类型——Deployment,Deployment是一个定义多副本应用的对象(多个Pod),他的副本数(spec.replicas)为2,Pod定义发生变化时,Deployment对每个副本进行滚动更新。
Pod的定义在何处呢?在Pod模板中(spec.template)。模板中描述了我们想要创建的Pod的细节。这个Pod中包含一个容器,其镜像(image)为nginx:1.7.9,监听80端口,名字为nginx。
Pod是k8s世界中的”应用运行单元”,一个应用运行单元可以由多个容器组成。
每个API对象都有一个叫做Metadata的字段,是API对象的”标识”,是我们从k8s中找到这个对象的主要依据。
Deployment对象可以通过metadata中的labels字段从k8s中过滤出它所关心的对象,而这个规则的定义在spec.selector.matchLabels中,Deployment识别所有携带app: nginx的Pod,确保它们的数量等于2。
一个k8s的API对象的定义,大多可以分为Metadata和Spec两部分,前者存放这个对象的元数据,后者描述这个对象所要表达的功能。
查看API对象
# 使用kubectl describe命令查看一个API对象的细节,具体使用方法如下
kubectl describe pod nginx-deployment-f7ccf9478-69kkl
比如可以看到,这个pod被调度到了node3上,还有它的IP信息等等。
如何更新API对象
如果想要更新API对象,比如修改nginx的版本,一个如何做呢?
k8s提供了非常方便的方法,我们只需要修改YAML文件,再通过一条指令更新应用即可。
# 修改YAML文件后的更新指令
kubectl apply -f xxx.yaml
# 这个命令不仅可以用作更新对象,也可以用来创建对象
这就是声明式API,我们只要告诉系统我们期望得到什么样的状态(YAML文件中所描述),至于系统如何去做我们不需要去管。
进入及删除容器
可以通过如下指令进入到Pod当中
kubectl exec -it nginx-deployment-94c47774b-jxsnc -- /bin/bash
也可以通过一条指令删除这个Deployment
# xxx.yaml为这个对象对应的YAML文件
kubectl delete -f xxx.yaml
参考文献
[1] 张磊. 深入剖析Kubernetes[M]. 第1版. 人民邮电出版社, 2021.3.