4、运行容器
4、运行容器
一、概念
1.1、容器
每个运行的容器都是可重复的; 包含依赖环境在内的标准,意味着无论你在哪里运行它都会得到相同的行为。
容器将应用程序从底层的主机设施中解耦。 这使得在不同的云或 OS 环境中部署更加容易。
Kubernetes 集群中的每个节点都会运行容器, 这些容器构成分配给该节点的 Pod。 单个 Pod 中的容器会在共同调度下,于同一位置运行在相同的节点上。
1.2 、容器镜像
容器镜像是一个随时可以运行的软件包, 包含运行应用程序所需的一切:代码和它需要的所有运行时、应用程序和系统库,以及一些基本设置的默认值。
容器旨在设计成无状态且不可变的: 你不应更改已经运行的容器的代码。如果有一个容器化的应用程序需要修改, 正确的流程是:先构建包含更改的新镜像,再基于新构建的镜像重新运行容器。
1.3、容器运行时
容器运行环境是负责运行容器的软件。
二、容器中字段解释
FIELDS:
args <[]string>给command进行运行的参数
command <[]string>运行命令
env <[]Object>环境变量
envFrom <[]Object>
image <string>镜像名称
imagePullPolicy <string>镜像下载方式 Always, Never, IfNotPresent. Defaults to Always
lifecycle <Object>生命周期
livenessProbe <Object>生存探针
name <string> -required-容器名称
ports <[]Object>要暴漏的端口
readinessProbe <Object>就绪探针
resources <Object>资源限制
securityContext <Object>安全策略
startupProbe <Object>启动探针
stdin <boolean>
该容器是否应该为容器中的stdin分配缓冲区
运行时。如果没有设置,从容器中的stdin读取将始终导致EOF。默认为false。
stdinOnce <boolean>
terminationMessagePath <string>容器终止到的文件的路径将要写入的消息被安装到容器的文件系统中。
terminationMessagePolicy <string> 指示应该如何填充终止消息。
tty <boolean>这个容器是否应该为自己分配一个TTY,也需要'stdin'是真的
volumeDevices <[]Object>是容器要使用的卷的列表。
volumeMounts <[]Object>将Pod卷安装到容器的文件系统中。不能更新。
workingDir <string>容器的工作目录。
三、环境变量
使用环境变量来设置参数
env:
- name: MESSAGE
value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
四、生命周期钩子
Kubernetes中为容器提供了两个 hook(钩子函数):
PostStart此钩子函数在容器创建后将立刻执行。但是,并不能保证该钩子函数在容器的
ENTRYPOINT之前执行。该钩子函数没有输入参数。PreStop此钩子函数在容器被 terminate(终止)之前执行,例如:
- 通过接口调用删除容器所在 Pod
- 某些管理事件的发生:健康检查失败、资源紧缺等
如果容器已经被关闭或者进入了
completed状态,preStop 钩子函数的调用将失败。该函数的执行是同步的,即,kubernetes 将在该函数完成执行之后才删除容器。该钩子函数没有输入参数。
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: alpine
command: ["/bin/sh", "-c", "echo hello; "]
volumeMounts:
- name: mount1
mountPath: /app
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo world;"]
preStop:
exec:
command: ["/bin/sh","-c","echo 66666;"]
在容器启动后立刻发送 postStart 事件,但是并不能确保 postStart 事件处理程序在容器的 EntryPoint 之前执行。postStart 事件处理程序相对于容器中的进程来说是异步的(同时执行),然而,Kubernetes 在管理容器时,将一直等到 postStart 事件处理程序结束之后,才会将容器的状态标记为 Running。
Kubernetes 在决定关闭容器时,立刻发送 preStop 事件,并且,将一直等到 preStop 事件处理程序结束或者 Pod 的
--grace-period超时,才删除容器
五、资源限制
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr
image: nginx
resources:
#
limits: # 限制最大大小 -Xmx
memory: "200Mi"
cpu: "700m"
# 启动默认给分配的大小 -Xms
requests:
memory: "200Mi"
cpu: "700m"