一、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