参考文章:
pod 特性
pod 是 k8s 的最小工作单元。
每个 pod 可以运行一个或多个容器。
k8s 管理的是 pod 而不是直接管理容器,pod 中的容器会作为一个整体被 Master 调度到一个 node 上运行。
pod 的设计理念是支持多个容器在一个 pod 中共享网络地址和文件系统,通过进程间通信和文件共享这种简单高效的方式组合完成服务。
之前看过一篇文章,可以这么理解 docker、pod 和 k8s 的关系:(如果有说错,望指正!)
docker 是进程,pod 是应用,k8s 是操作系统。 操作系统只管理应用的生命周期,并不关心进程的情况。同一个应用间的进程可以共享某些资源。
多个容器被放到同一个 pod 中的主要原因是:大多数应用都是由一个主进程和一个或多个辅助进程组成,它们之前需要共享资源。
pod 中的所有容器,共享同一个 Network Namespce,且可以声明共享同一个 Volume。
基础
创建 pod
在之前聊到过 k8s 是声明式 API,所以,pod 和其他 k8s 资源一样,大多情况下是通常YAML描述文件来创建的。
k8s 会将 yaml 文件转译成内部的 REST API,因此我们其实也可以通过 带 JSON 数据的 k8s REST API 来创建。
pod 中最基础的 yaml 描述文件:
apiversion: v1 <----表示描述文件遵循 v1 版本
kind: Pod <----表示类型是 pod
metadata:
name: kubia-manual <--- pod 的名称
spec:
containers:
- image: luksa/kubia <---创建容器所用的镜像
name: kubia <---容器的名称
ports:
- containerPort:8080 <--应用监听的端口
protocal: TCP
- apiversion: 指的是该 yaml 需要遵循的版本号, 在一些特殊情况下,不同的版本号,其 yaml 的字段是不通用的。
- kind: 指的是 api 对象的类型(上一节聊的常见的几种 api 对象,就是填在这个位置)。
- matedata: (上上节也说过),它是用来标识 API 对象的,每个对象都至少有 3 个元数据:namespace、name 和 uid。namespace 如果不填,默认为 default, uid 是系统生成的。
- spec 里是该 pod 的核心内容;
- containers: 存放的是容器的关于容器的信息。
注:
在上面 yaml 描述文件中 port.containerPort 属性,这个指定端口纯粹是展示性的,对于客户端是否可以通过端口连接到 pod 没有任何的作用。
同时如果容器将端口绑定到 0.0.0.0 的端口来接收连接,那么即使端口没有在这里 spec 中明确列出来,其他 pod 也能够连接到该端口。
在 spec 中 port.containerPort 明确端口暴露的意义:
- 在端口定义下,每个使用集群的人都可以快速的查看每个 pod 对外暴露的端口。
- 明确定义端口还可以允许用户为每个端口指定一个名称,方便用户使用。
写好 yaml 文件后,执行以下命令就可以创建 pod :
kubectl create -f xxx.yaml
常用命令总结:
最基础的命令如下:
kubectl create -f xxx.yaml // 创建 pod
kubectl get pod xxx -o yaml // 查看 k8s 的 pod 信息,并以 yaml 形式显示
kubectl get pod xxx -o json // 查看 k8s 的 pod 信息,并以 json 形式显示
kubectl logs xxx // 查看 pod 日志
kubectl logs pod_name -c container_name // 如果 pod 中有多个容器,使用 -c 命令,可以查看pod_name 中某个 container_name 容器的日志
以上命令均为 查看 namespace 为 default 的 pod 信息。 如果想要查询其他 namespace 下 pod 的信息,需要加 -n 参数,例如查看 namespace 为 component 下所属的 pod :
kubectl get pod -n component
其他命令也是类似的操作。
至于 namespace 的含义,在之前也介绍过:
k8s 中的 namespace 就类似于 windows 中的多个桌面,或者 linux 中的多个终端;namespace 之间的 api 对象是不可见的。只有在同一个 namespace 中的 api 对象,才能互相可见。 (pod 间调用是另一回事。)
稍微进阶点的命令如下:
// 进入某一 pod 中,该 pod 的 status 必须为 running 才行
kubectl -n component exec -it xxx sh
// 查看 pod 详细信息
kubectl describe pod xxx
// 查看镜像
kubectl describe pod xxx |grep Image
当我们对 pod 的 yaml 文件做了修改,想要更新 pod 或者想要删除 pod 的命令:
// 删除掉 pod
kubectl delete -f xxx.yml
// 更新或者添加 pod
kubectl apply -f xxx.yml
apply 和 create 区别:
简单通俗一句话就是 apply 命令 包含 create 命令。
apply 命令更能体现 k8s 是声明式 api 的含义。 apply 就是说,我期望达到的一个最终状态是 xxx.yaml,如果 k8s 里没有,那就新建一个 pod,如果 k8s 里有 pod,那就把它更新到我所期望的最终状态。 apply 并不关系中间发生了什么,只关心最后的结果。
所以,推荐无脑使用 apply 命令。
进阶
未完待续...