Pod是一组紧密关联的容器组合,共享PID,NETWORK,UTS namespace。一个Pod
里可以运行多个容器。一个Pod里多个容器共享网络和文件系统
原理
K8S真正处理的还是宿主机操作系统上的namespace和Cgroups,而不存在一个
Pod边界或者隔离环境。Pod里所有的容器共享的是同一个Network NameSpace
并且可以共享同一个volume。 在K8S项目里需要一个中间容器,这个容器叫
Infra容器,在这个Pod里,Infra容器永远是第一个被创建的容器,其他用户定义
容器则是通过join network NameSpace方式与Infra容器建立关联
Infra容器占用很小的资源,是一个特殊的镜像,名称:http://k8s.gcri/pause
这个镜像处于一个暂停的状态。在Infra容器hold住Network NameSapce后,用户
容器就可以加入到Infra容器的Network NameSpace中
示例
- 创建Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-test
labels:
name: redis-master
spec:
containers:
- name: master01
image: redis
ports:
- containerPort: 6379
hostPort: 6388
- name: master02
image: paubo/sshd
ports:
- containerPort: 22
hostPort: 8888
执行命令: kubectl apply -f pod-test.yaml
对于同一个Pod里所有容器,它们进出的流量可以认为都是通过Infra容器完成的。在配置网络
只需关注Pod的网络还不是容器的网络即Infra的Network NameSpace即可。共享volume也只需
把volume定于在Pod层。一个volume对应的宿主机的目录对于Pod来说只有一个,Pod容器只需声明
挂载这个volume即可共享这个volume对应的宿主极目录
apiVersion: v1
kind: Pod
metadata:
name: java-web
spec:
restartPolicyL: Never
volumes:
- name: shared-data
hostPath:
path: /data
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: debian-container
image: debian
volumeMounts:
- name:shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c","echo hello from debian container > /pod-data/index.html"]
如上Pod中有两个容器nginx-container,debian-container,都声明挂载同一个volume
而这个volume是一个hostPath类型,也就是宿主机上的目录/data,这样两个容器都挂载了这个
宿主机目录/data。这样设计可以在一个容器跑多个不相关应用
apiVersion: v1
kind: Pod
metadata:
name: java-web
spec:
initContainers:
- image: geetime/sample:v2
name: war
command: ["cp", "/sample.war", "/app"]
volumeMouts:
- mountPath: /app
name: app-volume
containers:
- image: geetime/tomcat:7.0
name: tomcat
command: ["sh","-c","/tomcat/bin/start.sh"]
volumeMounts:
- mountPath: /tomcat/webapps
name: app-volume
ports:
- containerPort: 8080
hostPort: 8001
volumes:
- name: app-volume
emptyDir: {}
定义两个容器,第一个容器只有一个war包放在根目录下,声明initContainers将war包
拷贝到/app目录下,第二个容器的作用是启动一个tomcat,和initContainers挂载同一
个volume,而且initContainers一定逼containers里的容器先启动。这样在tomcat启动时
其webapps目录下就有war包
Pod重要参数说明
- NodeSelector 提供Node和Pod绑定
apiVersion: v1
kind: Pod
spec:
nodeSelector:
disktype:ssd
-
NodeName 如果Pod该参数被赋值,K8S就会认为这个Pod已经经过调度了,调度的结果
就是赋值的节点名称,一般由调度器负责设置 -
HostAliases 定义Pod的hosts文件里的内容
-
shareProcessNamespace 如果设置为true,表示开启共享Pid NameSpace
-
LivenessProbe 健康检测
apiVersion: v1
kind: Pod
metadata:
name: pod-health-check
labels:
name: pod-health-check
namespace: default
spec:
containers:
- name: xx-health-check
image: xx
command:
- "/bin/sh"
- "-c"
- "touch /tmp/health; sleep 30; rm -f /tmp/health; sleep 600"
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /tmp/health"
initialDelaySeconds: 5
periodSeconds: 5
容器启动后exec进入容器执行cat /tmp/health命令,如果文件存在则返回0表示健康,如果返回值不为0,
则表示异常。容器启动5秒后开始检测,并且每5秒检查一次
除了在容器执行命令外,livenessProbe也可以定义发起http和TCP请求
livenessProbe:
httpGet:
path: /xxx-url
port: xxx
httpHeaders:
- name:X-Custom-Header
value: xxx
initialDelaySeconds: 3
periodSeconds: 3
livenessProbe:
tcpSocket:
port: xxx
httpHeaders:
initialDelaySeconds: 5
periodSeconds: 10
- restartPolicy 指的是容器的恢复机制,有以下几种恢复策略
6.1 Always 任何情况下,只要容器不在运行状态,就会自动重启容器
6.2 OnFailure 只在容器异常的情况下才会重启容器
6.3 Never 从来不重启容器
加入一个Pod里只有一个容器,这个容器异常推出了,只有当restartPolicy=Nerver时
Pod才会进入Failed状态。而其他情况下,因为有重启策略存在,这个Pod会一直保持
running状态。而如果这个Pod有多个容器,如果只有一个容器异常退出,即使restartPolicy=never
只有当这个Pod里所以的容器都异常的情况下,这个Pod才会进入Failed状态
- ReadinessProbe 就绪性检查,检查我们应用是否就绪。ReadinessProbe 的健康检测和 LivenessProbe 一样
apiVersion: v1
kind: Pod
metadata:
name: httpget-readinessprobe
namespace: default
spec:
containers:
- name: httpget-pod
image: nginx
ports:
- name: nginx-port
containerPort: 80
readinessProbe:
httpGet:
path: /index.html
port: nginx-port
initialDelaySeconds: 3
- lifecycle用于容器启动后,停止前的操作
postStart 容器启动后立即执行
preStop 容器停止前立即执行
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-test
namespace: default
spec:
containers:
- name: lifecycle-test
image: busybox
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "mkdir -p /data/web/html; echo 'lifecycle test' >> /data/web/html/index.html "]
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
标签:容器,name,对象,image,volume,Pod,K8S,data
From: https://www.cnblogs.com/codechange/p/17832330.html