k8s——Pod、Label、NameSpace

一、Pod: Kubernetes中的最小调度对象

1.1 说明

Pod(容器组)是k8s创建和调度的最小单元。一个Pod封装多个容器(container)、存储资源(volume)、一个独立网络ip和管理控制容器运行方式。

Pod可以单独运行一个容器,也可以兼容多个容器运行,多个容器共享资源。

1.2 Pod创建

yaml示例:创建一个名为nginx的Pod,这个Pod中包含一个名为container-0的容器,使用nginx:alpine镜像,使用的资源为100m core CPU、200Mi内存。

  • metadata:一些名称/标签/namespace等信息。
  • spec:Pod实际的配置信息,包括使用什么镜像,volume等。

 Pod定义好后就可以使用kubectl创建,如果上面YAML文件名称为nginx.yaml,则创建命令如下所示,-f表示使用文件方式创建。

$ kubectl create -f nginx.yaml
pod/nginx created

1.3 Pod信息查询

Pod创建完成后,使用命令查询Pod状态

 $ kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
nginx              1/1             Running             0          40s

READY为1/1,表示这个Pod中有1个容器,其中1个容器的状态为Ready。

-o 表示输出形式
name:仅打印资源名称而不打印其他内容。
wide:以纯文本格式输出额外信息,对于 Pod 来说,输出中包含了节点名称。
示例
kubectl get pods -A -o=wide:获取所有 Pod 的详细信息,包括节点名称。
kubectl get pods -A -o=yaml:获取所有 Pod 的 YAML 格式信息。
kubectl get pods --sort-by=.metadata.name:按名称排序输出所有 Pod。
kubectl get pods -o custom-columns=NAME:.metadata.name,RESC:.metadata.resourceVersion:根据自定义列名输出 Pod 的名称和资源版本。

使用kubectl describe命令查看Pod的详情。

$ kubectl describe pod nginx 

1.4 Pod删除

        删除pod时,Kubernetes终止Pod中所有容器。 Kubernetes向进程发送SIGTERM信号并等待一定的秒数(默认为30)让容器正常关闭。如果它没有在这个时间内关闭,Kubernetes会发送一个SIGKILL信号杀死该进程。 

按名删除Pod

$ kubectl delete po nginx pod1 pod 2
pod "nginx" deleted

删除所有Pod。

$ kubectl delete po --all
pod "nginx" deleted

根据Label删除Pod

$ kubectl delete po -l app=nginx
pod "nginx" deleted

1.5 使用环境变量

配置spec.containers.env字段

 查询环境变量

1.6 容器启动命令

启动容器就是启动主进程,启动前需要的前置操作可以通过,CMD或ENTRYPOINT完成,示例使用Dockerfile中设置ENTRYPOINT ["top", "-b"]

FROM ubuntu
ENTRYPOINT ["top", "-b"]

实际使用时,只需配置Pod的containers.command参数,该参数是list类型,第一个参数为执行命令,后面均为命令的参数。 

1.7 容器的生命周期

容器生命周期钩子,完成容器前后命令操作处理。

  • 启动后处理(PostStart):容器启动后触发。
  • 停止前处理(PreStop):容器停止前触发。

 实际使用时,只需配置Pod的lifecycle.postStart或lifecycle.preStop参数,如下所示。

二、存活探针(Liveness Probe 监控检查)

2.1 背景介绍

        k8s的自愈能力只能保证Pod崩溃后重启,但是如内存泄漏,JVM进程存活,但是容器进程不可用,无法自愈,提供存活探针完成容器健康检查。分成三种探测机制:

  • HTTP GET:向容器发送HTTP GET请求,如果Probe收到2xx或3xx,说明容器是健康的。
  • TCP Socket:尝试与容器指定端口建立TCP连接,如果连接成功建立,说明容器是健康的。
  • Exec:Probe执行容器中的命令并检查命令退出的状态码,状态码为0说明容器是健康的。

2.2 HTTP GET

        

2.3 TCP Socket

2.4 Exec 

2.5 高级配置

  • delay:延迟,delay=0s,表示在容器启动后立即开始探测,没有延迟时间
  • timeout:超时,timeout=1s,表示容器必须在1s内进行响应,否则这次探测记作失败
  • period:周期,period=10s,表示每10s探测一次容器
  • success:成功,#success=1,表示连续1次成功后记作成功
  • failure:失败,#failure=3,表示连续3次失败后会重启容器

 

三、Label

3.1 为什么需要Label

Pod过多时管理起来不方便,通过Label可以进行标记分类。

标签管理分类前:

标签管理分类后:

3.2 添加Label

Label 是key-Value形式,示例如下:

--show-labels 查询时展示Label信息

-L只查询固定标签

 对已存在的Pod,直接使用kubectl label命令直接添加Label。

修改Label

四、NameSpace

4.1 目的

使用NameSpace主要是可以把资源进行分组。组织上划分,对运行的对象来说,它不能做到真正的隔离。举例来说,如果两个Namespace下的Pod知道对方的IP,而Kubernetes依赖的底层网络没有提供Namespace之间的网络隔离的话,那这两个Pod就可以互相访问。

 4.2 指定NameSpace查询

coredns是用于做服务发现、everest-csi是用于对接存储服务、icagent是用于对接监控系统。

kube-system这个命名空间中,能够做到与其他Pod之间隔离。

4.3 创建Namespace

apiVersion: v1 
kind: Namespace 
metadata: 
  name: custom-namespace 

使用kubectl命令创建。

$ kubectl create -f custom-namespace.yaml
namespace/custom-namespace created

您还可以使用kubectl create namespace命令创建。

$ kubectl create namespace custom-namespace 
namespace/custom-namespace created

在指定Namespace下创建资源。

$ kubectl create -f nginx.yaml -n custom-namespace 
pod/nginx created