这两天搭建了一个Kubernetes集群,包含三个节点,如图所示:

pPdtmJ1.png

接下来该学习如何在k8s集群上运行第一个k8s应用了。

准备镜像

首先第一步,我们应该准备我们运行这个应用所需要的容器镜像。

编写应用配置文件

有了容器镜像之后,我们需要编写应用配置文件告诉k8s我们想要如何运行我们的容器。

应用配置文件一般是YAML格式的,其中包含容器的定义、参数、配置等等信息,然后只需一条指令(kubectl create -f)就可以通过这个YAML文件把容器运行起来。

一个典型的YAML格式应用配置文件示例如下:

pPdUECR.png

运行应用

# 执行如下指令即可运行k8s应用
kubectl create -f nginx-test.yaml

# 通过如下指令查看应用的运行状态是否与预期一致
# 这个指令从k8s中获取指定的API对象
kubectl get pods -l app=nginx

pPr8atJ.png

可以看到两个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

pPrJdQ1.png

比如可以看到,这个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

效果如下:
pPrY0pj.png

也可以通过一条指令删除这个Deployment

# xxx.yaml为这个对象对应的YAML文件
kubectl delete -f xxx.yaml

参考文献

[1] 张磊. 深入剖析Kubernetes[M]. 第1版. 人民邮电出版社, 2021.3.