pod管理

pod管理包括但不限于:
- 创建、删除、更新、查询
- 资源限制
- 调度约束
- 重启策略
- 健康检查
- 问题定位

概述


pod是k8s集群中最小的单元,一个pod可以包含一个容器,也可以包含多个容器。
pod管理_第1张图片

创建/查询/更新/删除

创建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就通过下面的命令查看:

// 查看pod信息
kubectl get pod

// 详细查看pod信息
kubectl get pod -o wide

// 查看指定namespace的pod(默认default不需要指定)
kubectl get pod -n [namespace]

// 查看pod描述
kubectl describe pod [podname]

删除pod

kubectl delete pod [podname]

pod管理_第2张图片

还可以指定创建pod时的yaml文件进行删除指定的pod:

kubectl delete -f pod.yaml

更新pod

更新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

pod管理_第3张图片
这里写图片描述

更新成功了。

还有一个方法是修改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管理_第4张图片

调度约束


例如在一个集群中拥有两套环境,假设想要让pod跑在某一个节点上就需要对pod进行调度约束:

调度约束的方式有两种:
Pod.spec.nodeName 强制约束Pod调度到指定Node节点上
Pod.spec.nodeSelector 通过lable-selector机制选择节点

Pod.spec.nodeName方式

编辑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.spec.nodeSelector方式

这个方式是通过匹配节点的标签来将pod部署在指定的node上的,所以节点必须先打好标签:

kubectl label node 10.10.99.228 env_role=dev

查看刚打的标签:
pod管理_第5张图片

更改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检查机制

提供Probe机制,有以下两种类型:
livenessProbe:如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。

readinessProbe:如果检查失败,Kubernetes会把Pod从service endpoints中剔除。

Probe检查方法

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管理_第6张图片

pod已经建立

通过命令kubectl describe pod nginx-pod可以看到健康检查的配置:
pod管理_第7张图片

他就会不断请求这个web服务的页面,判断返回值。

也可以通过观察这个pod服务的日志来查看检查请求:
kubectl log nginx-pod

pod管理_第8张图片

通过命令进入容器删除检测的页面:

 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

你可能感兴趣的:(Kubernetes)