K8s基础之-Pod
k8s入门
·
第一章:什么是Pod
- Pod可以简单的理解为是一组、一个或多个容器构成,每个Pod还包含一个Pause容器。Pause容器是Pod容器的父进程,它主要负责僵尸进程的回收管理,同时通过Pause容器可以使得一个Pod里面的不同容器共享存储、网络、PID、IPC等,容器之间可以使用localhost:port的方式相互访问,可以使用volume等实现数据共享。根据docker的构造,Pod可被建模为一组具有共享命名空间、卷、IP地址和PORT端口的容器。
1.1 创建一个Pod
1、使用这个命令把nginx:1.15.2版本的yaml文件拉取到本地
kubectl run nginx --image=nginx:1.15.2 -oyaml --dry-run > pod.yaml
2、下面是pod.yaml文件的内容
candidate@master01:~/practise$ cat pod.yaml
apiVersion: v1 #apiVersion版本
kind: Pod #资源的数据类型,deployment ststefulset service
metadata: #元数据信息
creationTimestamp: null
labels: #标签
run: nginx #key=value
name: nginx #pod名称
spec: #定义pod
containers: #配置容器的地方
- image: nginx:1.21.6 #指定容器的镜像
name: nginx #指定容器的名称
resources: {}
command: ["sleep","5"]
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
3、创建一个pod
candidate@master01:~/practise$ kubectl create -f pod.yaml
pod/nginx created
4、查看此pod的状态,可以看到status是running,restarts表示的是重启的次数,age表示运行的时间
candidate@master01:~/practise$ kubectl get pod
NAME READY STATUS RESTARTS AGE
11-factor-app 1/1 Running 9 (21m ago) 127d
foo 1/1 Running 9 (20m ago) 127d
front-end-55455ccf94-pjl2m 1/1 Running 9 (20m ago) 127d
nginx 1/1 Running 0 66s
presentation-5f64bd874c-68z8p 1/1 Running 9 (20m ago) 127d
5、pod是不能被修改的,只能被删除,两种方式:
kubectl delete -f pod.yaml
kubectl delete pod nginx
1.2 更改pod的启动命令和参数
- candidate@master01:~/practise$ kubectl explain pod.spec.containers
apiVersion: v1 #apiVersion版本
kind: Pod #资源的数据类型,deployment ststefulset service
metadata: #元数据信息
creationTimestamp: null
labels: #标签
run: nginx #key=value
name: nginx #pod名称
spec: #定义pod
containers: #配置容器的地方
- image: nginx:1.21.6 #指定容器的镜像
name: nginx #指定容器的名称
resources: {}
command: ["sleep","5"]
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
1.3 pod状态及pod故障排查命令
状态 | 说明 |
---|---|
Pending(挂起) | Pod 已被 Kubernetes 系统接收,但仍有一个或多个容器未被创建,可以通过kubectl describe 查看处于 Pending Pending(挂起) 状态的原因 |
Running(运行中) | Pod已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行的状态,或者是正在启动或者重启,使用kubectl logs -f |
Succeeded(成功) | 所有容器执行成功并终止,并且不会再次重启 |
Failed(成功) | 所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过 logs 和 describe 查看 Pod 日志和状态 |
Unknown(成功) | 通常是由于通信问题造成的无法获得 Pod 的状态 |
- Pod处于running状态就一定是可用的么?
- 答:status需要是running,并且ready 前后都需要是1才行
1.4 pod状态及pod故障排查命令
- 通过 spec.containers[].imagePullPolicy 参数可以指定镜像的拉取策略,目前支持的策略如下:
操作方式 | 说明 |
---|---|
Always | 总是拉取,当镜像 tag 为 latest 时,且 imagePullPolicy 未配置,默认为 Always |
Nerver | 不管是否存在都不会拉取 |
IfNotPresent | 镜像不存在时拉取镜像,如果 tag 为非 latest,且 imagePullPolicy 未配置,默认为 IfNotPresent |
1、进行测试修改,修改nginx的版本号(当前系统中并不存在),然后kubect delete -f pod.yaml或者kubectl delete pod nginx,再进行启动:kubectl create -f pod.yaml,
2、使用kubectl get pod nginx -o yaml可以看出nginx这个pod对应的yaml文件
spec:
containers:
- image: nginx:1.21.7
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
1.5 pod重启策略
- 可以使用 spec.restartPolicy 指定容器的重启策略
操作方式 | 说明 |
---|---|
Always | 默认策略,容器失效时,自动重启该容器 |
OnFailure | 容器以不为0的状态码终止,自动重启该容器 |
Never | 无论何种状态,都不会重启 |
restartPolicy是pod级别的,不是container级别的:
如上图中,container级别下command参数启动5秒后就结束,查看pod的状态,发现启动一次以后不管是成功还是失败后都不会再次进行启动
spec: #定义pod
containers: #配置容器的地方
- image: nginx:1.21.7 #指定容器的镜像
name: nginx #指定容器的名称
resources: {}
command: {"sleep","10"}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
修改restartPolicy参数为Always之后,再次启动查看状态
能够发现他这个状态是completed然后又变成running说明他是会不停的进行重启的
第二章:Pod探针
2.1、 Pod的三种探针
种类 | 说明 |
---|---|
startupProbe | Kubernetes1.16 新加的探测方式,用于判断容器内的应用程序是否已经启动。如果配置了 startupProbe,就会先禁用其他探测,直到它成功为止。如果探测失败,Kubelet会杀死容器,之后根据重启策略进行理,如果探测成功,或没有配置 startupProbe,则状态为成功,之后就不再探测。 |
livenessProbe | 用于探测容器是否在运行,如果探测失败,kubelet 会“杀死”容器并根据重启策略进行相应的处理。如果未指定该探针,将默认为 Success |
readinessProbe | 一般用于探测容器内的程序是否健康,即判断容器是否为就绪(Ready)状态。如果是,则可以处理请求,反之 Endpoints Controller 将从所有的 Service 的 Endpoints中删除此容器所在 Pod 的 IP 地址。如果未指定,将默认为 Success |
2.2、 Pod探针的实现方式
实现方式 | 说明 |
---|---|
ExecAction | 在容器内执行一个指定的命令,如果命令返回值为 0,则认为容器健康 |
TCPSocketAction | 通过 TCP 连接检查容器指定的端口,如果端口开放,则认为容器健康 |
HTTPGetAction | 对指定的 URL 进行 Get 请求,如果状态码在 200~400 之间,则认为容器健康 |
更多推荐
已为社区贡献3条内容
所有评论(0)