重启策略
Always: 当容器终止退出后,总是重启容器,默认策略。 OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器。 Never:当容器终止退出,从不重启容器。
[root@master ~]# kubectl explain pod.spec.restartPolicy
KIND: Pod
VERSION: v1
FIELD: restartPolicy <string>
DESCRIPTION:
Restart policy for all containers within the pod. One of Always, OnFailure,
Never. Default to Always. More info:
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
修改策略为Never
[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: default
labels:
app: web
spec:
containers:
- name: web1
image: nginx
- name: busybox
image: busybox
command:
- '/bin/sh'
- '-c'
- 'sleep 36000'
restartPolicy: Never
默认的话不用修改,现在改为never,停止容器后不会重启
[root@master ~]# kubectl apply -f pod.yaml
pod/pod-1 created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 2/2 Running 0 14m
[root@master ~]# kubectl get pods -o wide -w #-w实时监控,在node1上面用docker命令关上其中一个,发现不会重启
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 2/2 Running 0 19m 10.244.1.2 node1 <none> <none>
pod-1 1/2 NotReady 0 19m 10.244.1.2 node1 <none> <none>
^V^C[root@master ~]#
修改策略为Always
先修改pod.yaml文件,改为Always
[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: default
labels:
app: web
spec:
containers:
- name: web1
image: nginx
- name: busybox
image: busybox
command:
- '/bin/sh'
- '-c'
- 'sleep 36000'
restartPolicy: Always
删除原先的pod.yaml ,重启启动一个新的pod
[root@master ~]# kubectl delete -f pod.yaml
pod "pod-1" deleted
[root@master ~]# kubecel apply -f pod.yaml
-bash: kubecel: 未找到命令
[root@master ~]# kubectl apply -f pod.yaml
pod/pod-1 created
启动好后,在node1上面删除nginx
[root@node1 ~]# docker stop 53d1dcf613a7
53d1dcf613a7
提前监控pods
[root@master ~]# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 2/2 Running 0 6m57s 10.244.1.3 node1 <none> <none>
pod-1 1/2 NotReady 0 7m11s 10.244.1.3 node1 <none> <none>
pod-1 2/2 Running 1 7m27s 10.244.1.3 node1 <none> <none>
发现等一段时间后,会重新启动.
健康检查类型
livenessProbe (存活检查) :如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。 readinessProbe (就绪检查) :如果检查失败,Kubernetes会把Pod从service endpoints中剔除。
[root@master ~]# kubectl explain pods.spec.containers.livenessProbe
针对名字叫web1 的
[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: default
labels:
app: web
spec:
containers:
- name: web1
image: nginx
livenessProbe:
httpGet:
port: 80
- name: busybox
image: busybox
command:
- '/bin/sh'
- '-c'
- 'sleep 36000'
restartPolicy: Always
检查80端口能否访问,能访问就不重启,不能访问就重启。
与重启策略相结合使用,
支持的检查方式
httpGet:发送HTTP请求,返回200-400范围状态码为成功。 exec: 执行hell命令返回状态码是0为成功。 tcpSocket:发起TCP Socket建立成功。
环境变量
变量值几种定义方式:
- 自定义变量值
- 变量值从Pod属性获取
- 变量值从Secrt,ConfigMap
初始化容器
Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为- -次性任务。
- 支持大部分应用容器配置,但不支持健康检查
优先应用容器执行
应用场景:
- 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器
- 初始化配置:例如给应用容器准备配置文件
创建一个有初始化容器的Pod 创将一个Pod,该Pod中包含一个应用容器和初始化容器。在应用容器开始之前,初始化容器的初始化任务已经完成。文件名:pod.yaml
示例:部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取放到应用容器中。
[root@master ~]# cat init.yaml
apiVersion: v1
kind: Pod
metadata:
name: init-pod
namespace: default
spec:
initContainers:
- name: download
image: busybox
command:
- "wget"
- "-O"
- "/opt/index.html"
- http://www.baidu.com
volumeMounts:
- name: wwwroot
mountPath: "/opt"
containers:
- name: nginx
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
volumes:
- name: wwwroot
emptyDir: {}
#创建
[root@master ~]# kubectl apply -f init.yaml
pod/init-pod created
#此时init容器进行启动工作
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 0/2 ContainerCreating 0 22s
#当init容器完成后,应用容器启动并进行工作
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 2/2 Running 0 4m47s
当我们Pod正常Running之后,我们可以通过kubectl describe pod [pod-name]查看到init容器的一个状态 如果失败init容器默认会在State中显示CrashLoopBackOff (重启/异常),在Reason会显示Error
State 代表状态
Reason 原因
Terminated 终止
Completed 完成
深入理解Pod对象:调度
- 创建一个Pod的工作流程
Kubernetes基于list-watch机制的控制器架构,实现组件间交互的解耦。 其他组件监控自己负责的资源,当这些资源发生变化时,kube- apiserver会通知这些组件,这个过程类似于发布与订阅。 - Pod中影响调度的主要属性
根据资源调度,根据策略调度 - 资源限制对Pod调度的影响
- nodeSelector & nodeAffinity
- Taint (污点) & Tolerations (污点容忍)
- nodeName
|