上一篇文章中,我们从零搭建了一个 Kubernetes 集群:
集群已经搭建好,下一步就是要在集群中部署应用了。
要在集群中部署应用,首先需要编写应用的配置文件,例如下面的 nginx_deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
app: nginx
spec:
containters:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-vol
volumes:
- name: nginx-vol
emptyDir: {}
在这个配置文件中,主要分为三个部分:
配置文件前两行,我们配置了这个应用的版本和类型。
类型 Deployment 是一个定义多副本 Pod 的对象,这在此前的文章中已经介绍过:
<a id="10183737"></a>
metadata 中配置了这个 API 对象的元数据,也就是这个 API 对象的标识。它是我们从 Kubernetes 中找到这个对象的主要依据。
除了上面配置的 name 外,还通过键值对的方式为这个 API 对象打上标签。
例如,在第 12 行,定义这个 Deployment 对象实际包含的 Pod 对象时,为这个 Pod 对象打上的“app: nginx”标签。
不同类型的 API 对象,他们在基础信息和元信息的定义格式和字段上基本上都是相同的。但不同类型的 API 对象却有着不同的 spec 格式,因为它是用来详细描述这个对象要表达的功能的独有定义。
再上面的例子中,由于 Deployment 对象是若干 Pod 对象的组合,所以,Deployment 的 Spec 包含了以下三方面的信息:
而在这个 Deployment 的 template 配置中,又是一个 pod 的定义,它的 spec 则包含了两个信息:
在这个例子中,我们声明了一个名为 nginx-vol,类型是 emptyDir 的 Volume,所谓的 emptyDir,就是不显式声明宿主机目录的 Volume,而是在宿主机上创建一个临时目录,挂载到容器所声明的 Volume 目录上。
所以,在容器声明中,包含了 volumeMounts 配置项,表示哪些容器内的目录需要被挂载。
要启动应用,只需要执行 kubectl 的创建命令即可:
$ kubectl apply -f nginx_deployment.yaml
如果要删除已经启动的引用,只需要执行删除命令即可:
$ kubectl delete -f nginx_deployment.yaml
通过 kubectl get 命令可以查看当前全部 API 对象的运行状态:
$ kubectl get pods -l app=nginx
通过 kubectl describe 命令可以查看一个 API 对象的细节:
$ kubectl describe pod nginx-deploment-675914928bf6-9devr
describe 命令除了返回 Pod 的详细信息,还包含所有针对这个 API 对象的重要操作,这些重要操作被显示在 Events 一项中,这对于我们的问题排查十分重要。
如果想要更新应用,首先,我们需要编辑应用的 yaml 配置文件。然后通过 kubectl apply 应用更新:
$ kubectl apply -f nginx_deployment.yaml
和 Docker 类似,kubectl 也提供了 exec 指令用来执行指令,最常用的便是直接进入容器:
$ kubectl exec -it nginx-deployment-675914928bf6-9devr -- /bin/bash