k8s 三之Pod的介绍+pod生命周期+探针
什么是podpod的工作方式pod实验截图
文章目录
一、什么是pod
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
二、pod的工作方式
1. Pod模版
K8s一般不直接创建Pod,而是通过控制器和模版配置来管理和调度。
2. Pod重启
在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过restartPolicy字段设置重启策略如下:
- Always: 只要退出就会重启。
- OnFailure: 只有在失败退出(exit code不等于0)时,才会重启。
- Never: 只要退出,就不再重启
注意:这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上。
3. Pod资源限制
Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括 requests(请求,调度器保证调度到资源充足的Node上)和 limits(上限)等。
4. Pod健康检查
在Pod部署到Kubernetes集群中以后,为了确保Pod处于健康正常的运行状态,Kubernetes提供了两种探针,用于检测容器的状态:
- Liveness Probe : 检查容器是否处于运行状态。如果检测失败,kubelet将会杀掉容器,并根据重启策略进行下一步的操作。如果容器没有提供Liveness Probe,则默认状态为Success。
- ReadinessProbe : 检查容器是否已经处于可接受服务请求的状态。如果Readiness Probe失败,端点控制器将会从服务端点(与Pod匹配的)中移除容器的IP地址。如果一个容器未提供Readiness Probe,则默认状态是Success。
kubelet在容器上周期性的执行探针以检测容器的健康状态,kubelet通过调用被容器实现的处理器来实现检测,在Kubernetes中有三类处理器:
- ExecAction : 在容器中执行一个指定的命令。如果命令的退出状态为0,则判断认为是成功的。
- TCPSocketAction : 在容器IP地址的特定端口上执行一个TCP检查,如果端口处于打开状态,则视为成功。
- HTTPGetAcction : 在容器IP地址的特定端口和路径上执行一个HTTP Get请求使用container的IP地址和指定的端口以及请求的路径作为url,用户可以通过host参数设置请求的地址,通过scheme参数设置协议类型(HTTP、HTTPS)如果其响应代码在200~400之间,设为成功。
健康检测的结果为下面三种情况:
- Success : 表示容器通过检测
- Failure : 表示容器没有通过检测
- Unknown : 检测失败,因此不会采取任何行动。
5. 初始化容器
Pod可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个优先于容器启动的 init 容器。如果为一个 Pod 指定了多个 init 容器,这些 init 容器会按顺序逐个运行。每个 init 容器都必须运行成功,下一个才能够运行。当所有的 init 容器运行完成时,Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。
为什么需要 init 容器?
在开发一个程序时,通常初始化代码与主体业务代码放置在同一个程序中。而kubernetes提供初始化容器这种功能,初始化容器与普通容器有各自独立的image,本质上是将初始化逻辑与主体业务逻辑分离并放置在不同的image中,以下是初始化容器的主要用处:
(1)初始化容器可以包含不能随普通容器一起发布出去的敏感信息。
(2)初始化容器可以包含用户自定义的代码、工具,如sed、awk、python等方便完成初始化、设置工作。
(3)因为初始化逻辑与主体业务逻辑分布在不同的image中,因此image构建者与主体业务逻辑开发者可以各自独立的工作。
(4)初始化容器使用Linux namespace,不同于普通应用容器,具有不同的文件系统视图,并且对于低层的操作系统有更大的访问权限。
(5)当应用启动的前置条件不具备时,初始化容器可以阻止普通应用容器启动,避免在条件不具备时反复启动注定会失败的容器而浪费系统资源。
init 容器和普通容器的区别
Init 容器与普通的容器非常像,除了如下两点:
(1)它们总是运行到完成
(2)init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 init 容器必须运行成功,下一个才能够运行。
6. pod的生命
- 一般Pod不会消失,直到人为销毁他们,这可能是一个人或控制器。
- 建议创建适当的控制器来创建 Pod,而不是直接自己创建 Pod。因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。
- 三种可用的控制器:
(1)使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod。
(2)对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod。
(3)提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod 。
三、pod实验截图
1. init容器实验
vim init.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: nginx
imagePullPolicy: IfNotPresent
initContainers:
- name: init-myservice
image: busyboxplus
command: ["sh", "-c", "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
vim service.yml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
单独运行无法成功init因为在等待myservice运行
创建myservice
pod变成running状态(注意虚拟机内要含有busyboxplus镜像,否则可能报错)
2. liveness测试
vim live.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 2
timeoutSeconds: 3
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
补充:另一个liveness实例
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
探针的使用
由于没有test页面所以报错
此时运行正常
3. readiness测试
vim readiness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness
name: readiness-http
spec:
containers:
- name: readiness
image: nginx
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
4. 负载均衡
负载均衡演示
可以访问容器地址
server2和server3同下
发现实现了负载均衡
更多推荐
所有评论(0)