pod:是k8s项目中的原子调度单位。
docker:Namespace 做隔离,Cgroups 做限制,rootfs做文件系统。
容器本质是进程,而k8s是操作系统。
pod就是类似于进程组。
部署的一些应用有着类似“进程”和“进程组”的关系,必须部署在一台机器上,受限于容器的单进程。
例子:linux系统将信号SIGKILL信号,发送给进程组,则该进程组将收到信号让所有进程终止运行。
pod在k8s中更重要的意义:容器的设计模式。
pod的实现原理:一组共享的某些资源的容器。pod中的所有容器是共享一个Network Namespace并且可以声明同一个Volume。
例子:A,B容器的pod,共享网络和Volume容器 。只是需要
$ docker run --net=B --volumes-from=B --name=A image-A ...
如果是这样的话,容器B就必须比A先启动。不再是对等关系了这样。
image.png在k8s中pod的实现需要一个Infra容器。它永远是第一个创建的容器,而其他用户定义的容器是通过Join network Namespace的方式与它关联。
这个也以为:他们可以直接通过localhost通信。一个pod只有一个ip。所有网络资源一个pod一份。 Pod生命周期只和Infra有关。
这样一个Volume对应的宿主机目录对于Pod来说只有一个:Pod里面的容器只要声明挂载这个Volume,就一定可以共享Volume对应的宿主机目录。
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: 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 the debian container > /pod-data/index.html"]
在这个例子中:两个容器都挂载了 shared-data目录,都可以获取/data目录,nginx容器可以在/usr/share/nginx/html下获取debian生成的index.html文件。
例子1:war包与web服务
apiVersion: v1
kind: Pod
metadata:
name: javaweb-2
spec:
initContainers:
- image: geektime/sample:v2
name: war
command: ["cp", "/sample.war", "/app"]
volumeMounts:
- mountPath: /app
name: app-volume
containers:
- image: geektime/tomcat:7.0
name: tomcat
command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
volumeMounts:
- mountPath: /root/apache-tomcat-7.0.42-v2/webapps
name: app-volume
ports:
- containerPort: 8080
hostPort: 8001
volumes:
- name: app-volume
emptyDir: {}
这个 Init Container 类型的 WAR 包容器启动后,我执行一句"cp", "/sample.war", "/app" 。而后这个/app会挂载到app-volume下面。同时tomcat也挂这个到自己目录下,也就是被两个容器共享。
例子2:容器的日志收集。
1.将Volume挂载到/var/log目录下。
2.。。。。。。。。
网友评论