k8s 核心资源 Pod 基本介绍
Pod 的官方介绍文档为 Pods, 对应的中文文档为 Pods.
每个 Pod 都会被网络插件分配 ip, 通过 kubectl get pods -n kube-system -o wide 可以查看对应的 pod ip. 其中 10.244.x.x 是网络插件分配的 ip, 192.168.x.x 是创建时指定了使用物理机的 ip.
创建 Pod 的时候可以指定挂载的存储卷. pod 中的所有容器都可以访问共享卷, 允许这些容器共享数据. pod 只要挂载持久化数据卷, pod 重启之后数据还是会存在的.
创建自主式 Pod
在 k8s 中, 所有的资源都可以使用一个 yaml 文件来创建, 创建 pod 也可以使用 yaml 配置文件. 或者使用 kubectl run 在命令行创建 Pod(不常用).
自主式 Pod
所谓的自主式 Pod, 就是直接定义一个 Pod 资源, 如下 vim pod-tomcat.yaml:
apiVersion: v1
kind: Pod # 直接指定为 Pod
metadata:
name: tomcat-test
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat-java
ports:
- containerPort: 8080
image: tomcat
imagePullPolicy: IfNotPresent
执行 kubectl apply -f pod-tomcat.yaml 创建 pod, 创建后再次执行为更新. 执行 kubectl get pods 获取所有的 pod, 执行 kubectl delete pods tomcat-test 删除 pod.
如果直接定义一个 Pod 资源, 那 Pod 被删除, 就彻底被删除了, 不会再创建一个新的 Pod, 这在生产环境还是具有非常大风险的, 所以今后我们接触的 Pod, 都是控制器管理的. 当控制器检测到启动的 Pod 数少于设定值的时候, 会自动启动.
控制器管理 Pod
常见的管理 Pod 的控制器: Replicaset, Deployment, Job, CronJob, Daemonset, Statefulset. 控制器管理的 Pod 可以确保 Pod 始终维持在指定的副本数运行. 如通过 Deployment 管理 Pod.
执行 vim nginx-deploy.yaml 填写内容如下:
apiVersion: apps/v1 #
kind: Deployment # 资源类型.
metadata:
name: nginx-test # 控制器的名字.
labels:
app: nginx-deploy
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 副本数.
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行 kubectl get pods 可以发现有两个名为 nginx-test-哈希值 的 pod 被创建了. 通过 kubectl get deploy 可以发现一个名为 nginx-test 的 deploy 资源. 通过 kubectl get rs 可以获取名为 nginx-test-哈希值 的 replicaset 资源(也可以使用 kubectl get replicaset).
即使执行了 kubectl delete pods nginx-test-哈希值 删除了一个 pod, 也会自动新创建一个新的 pod. 即始终将副本数维持在指定的数量上.
Pod 创建具体流程
第一步: 客户端提交创建 Pod 的请求, 可以通过调用 API Server 的 Rest API 接口, 也可以通过 kubectl 命令行工具. 如 kubectl apply -f filename.yaml. 或者 k8s 的 UI 页面.
第二步: API Server 将属性写入 etcd 中.
第三步: API Server 触发生成 pod 并将信息传递给 Scheduler, Scheduler 找到合适的节点返回给 API Server, API Server 再次将该值写入到 etcd 中.
第四步: API Server 触发绑定 pod 到节点并通知给 kubelet 启动 pod. kubelet 去启动容器.
第五步: 将 pod 信息上报给 API Server, API Server 再次将信息写入到 etcd 中了.
Pod 资源 YAML 编写技巧
执行 kubectl api-versions 查看所有 api 版本.
apiVersion: v1 # api 版本
kind: Pod # 创建的资源
metadata:
name: tomcat-test # pod 的名字
namespace: default # Pod 所在的名称空间
labels:
app: tomcat # pod 具有的标签
spec:
containers:
- name: tomcat-java # pod 里容器的名字
ports:
- containerPort: 8080 # 容器暴露的接口
name: web
image: tomcat # 容器使用的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略
-
执行
kubectl explain pods查看如何编写 yaml 资源清单文件. -
执行
kubectl explain pod.metadata查看如何编写metadata字段. -
执行
kubectl explain pod.spec查看如何编写spec字段. -
执行
kubectl explain pod.spec.containers查看如何编写containers字段. -
执行
kubectl explain pod.spec.containers.ports查看如何编写ports字段. -
kubectl get pods -o wide -l app= pod名称可以查看 pod 运行情况. -
kubectl logs -f pod名称获取 pod 日志. -
kubectl logs pod名称 -c 容器名称获取 pod 中指定容器的日志. -
kubectl exec -it pod名称 -- /bin/bash进入 pod 终端. -
kubectl exec -it pod名称 -c 容器名称 -- /bin/bash进入指定容器终端.
kubectl run 运行 pod 资源
kubectl run --help 查看用法.
通过 kubectl run 创建 pod. kubectl run tomcat --image=tomcat --image-pull-policy='IfNotPresent' --port=8080.
执行 kubectl get pods pod名称 -o yaml 获取 pod 的 yaml 资源文件.