pod管理包括但不限于:
- 创建、删除、更新、查询
- 资源限制
- 调度约束
- 重启策略
- 健康检查
- 问题定位
pod是k8s集群中最小的单元,一个pod可以包含一个容器,也可以包含多个容器。
通过pod.yaml
来创建pod对象。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
然后通过命令kubectl create -f pod.yaml
执行创建pod对象。
通过kubectl get pod -o wide
查看到刚创建的pod:
查询pod就通过下面的命令查看:
// 查看pod信息
kubectl get pod
// 详细查看pod信息
kubectl get pod -o wide
// 查看指定namespace的pod(默认default不需要指定)
kubectl get pod -n [namespace]
// 查看pod描述
kubectl describe pod [podname]
kubectl delete pod [podname]
还可以指定创建pod时的yaml文件进行删除指定的pod:
kubectl delete -f pod.yaml
更新pod必须先删除pod然后创建新的。
这里在上一步删除之后,先修改pod.yaml
文件,将镜像升级到1.12:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
然后重复开始创建的一部执行命令:
kubectl create -f pod.yaml
更新成功了。
还有一个方法是修改yaml文件后执行命令kubectl replace -f pod.yaml --force
来用新的yaml生成的pod替换原有的pod。这里使用--force
参数是因为在替换的时候可能会失败,所以使用这个参数表示强制替换。
这个命令的原理也是先删除原有pod,再创建新的pod
限制pod的资源是为了防止异常的情况下导致资源占用过多使得宿主机甚至服务响应慢或者不可用的情况。
在创建pod的时候指定pod资源,编辑pod_res.yaml
文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
其中resources字段就是限制资源的,requests是保证最小使用的情况,limits保证容器使用资源不超过这个限制。上边的配置就表示:内存最小64M最大不超过128M,CPU最小250m最大不超过500m。这种限制是交给docker进行限制的。
现在创建这个具有限制条件的pod:
kubectl create -f pod_res.yaml
然后通过kubectl describe pod nginx-pod
查看这个pod的详细信息,其中可以看到这个资源限制部分的内容:
例如在一个集群中拥有两套环境,假设想要让pod跑在某一个节点上就需要对pod进行调度约束:
调度约束的方式有两种:
Pod.spec.nodeName 强制约束Pod调度到指定Node节点上
Pod.spec.nodeSelector 通过lable-selector机制选择节点
编辑pod_direct.yaml
文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
nodeName: 10.10.99.228
containers:
- name: nginx
image: nginx
其中nodeName就指定pod部署节点位置。
然后创建这个pod:
kubectl create -f pod_direct.yaml
这个方式是通过匹配节点的标签来将pod部署在指定的node上的,所以节点必须先打好标签:
kubectl label node 10.10.99.228 env_role=dev
更改pod_direct.yaml
文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod2
labels:
app: nginx
spec:
nodeSelector:
env_role: dev
containers:
- name: nginx
image: nginx
创建这个pod(注意这个pod名字叫nginx-pod2)
kubectl create -f pod_direct.yaml
重启策略有三种:
Always:当容器停止,总是重建容器,默认策略。
OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
Never:当容器终止退出,从不重启容器。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
restartPolicy: OnFailure
只需要在yaml文件中的containers这一级指定restartPolicy就可以了。
在k8s集群中,如果容器出现异常,那么默认情况下k8s会重建这个容器。但是如果容器中的程序出现异常,k8s则还会认为这个容器是正常的,依旧将请求转发到这个容器。
提供Probe机制,有以下两种类型:
livenessProbe:如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
readinessProbe:如果检查失败,Kubernetes会把Pod从service endpoints中剔除。
Probe支持以下三种检查方法:
httpGet:发送HTTP请求,返回200-400范围状态码为成功。
exec:执行Shell命令返回状态码是0为成功。
tcpSocket:发起TCP Socket建立成功。
在创建pod的时候指定健康检查方式(pod_healthcheck.yaml):
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /index.html
port: 80
这里是采用了httpGet方式,判断服务80端口的http返回结果,首先创建容器:
kubectl create -f pod_healthcheck.yaml
pod已经建立
通过命令kubectl describe pod nginx-pod
可以看到健康检查的配置:
他就会不断请求这个web服务的页面,判断返回值。
也可以通过观察这个pod服务的日志来查看检查请求:
kubectl log nginx-pod
通过命令进入容器删除检测的页面:
kubectl exec -it nginx-pod bash
rm -f /usr/share/nginx/html/index.html
检查返回404错误状态
通过pod的事件可以看到整个过程:检测到404后删除pod并重建:
一般是通过常用的三个指令:
// 查看pod具体信息
kubectl describe pod [podname]
// 查看pod日志
kubectl log [podname]
// 连接pod
kubectl exec -it [podname] bash