kubernetes编排原理:Pod
1 为什么需要Pod
复习:
Namespace做隔离,Cgroups做限制,rootfs做文件系统
容器的本质是进程
今日学习:
在操作系统中,进程通常以进程组的方式“有原则”地组织在一起。
一些容器之间需要紧密协作(超亲密关系):互相之间发生直接的文件交换、使用localhost 或者Socket文件进行本地通信、会发生非常频繁的远程调用、需要共享某些Linux Namespace(例如一个容器需要加入另一个容器的 Network Namespace)等
Pod是一个逻辑概念,是一组共享了某些资源的容器。Pod里所有容器都共享一个Network Namespace,实现上则需要一个中间容器–Infra容器(永远是第一个被创建的容器),其他用户定义的其他容器则通过Join Network Namespace的方式与Infra容器关联在一起。
Pod中的容器A、B:
它们可以直接使用localhost进行通信
他们看到的网络设备跟Infra一样
一个Pod只有一个IP地址,也就是这个Pod的Network Namespace对应的IP地址
所有网络资源都是一个Pod一份,被所有Pod中容器共享
Pod的生命周期只跟Infra容器一致,而与容器A和容器B无关
ps:如果为k8s开发网络插件,应考虑如何配置Pod的Network Namespace,而不是考虑每一个用户容器如何使用你的网络配置。
共享Volume:
kubernetes项目只需要把所有的Volume的定义都设计在Pod层级即可,Pod里的容器只要声明挂载这个Volume,就一定可以共享这个Volume对应的宿主机目录
apiVersion: v1
kind: pod
metadata:
name: two-containers
spec:
restartPolicy: Never
volumes:
- name: share-data
hostPath:
path: /data
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: share-data
mountPath: "/usr/share/nginx/html"
- name: debian-container
image: debian
volumeMounts:
- name: share-data
mountPath: "/pod-data"
command: ["/bin/sh"]
args: ["-c","echo Hello from the debian container > /pod-data/index.hgtml"]
kubectl exec two-containers -it -c nginx-container /in/bash
cd /usr/share/nginx/html/
ls
index.hgtml
WAR包与Web服务器解决方法//貌似pull失败
apiVersion: v1
kind: Pod
metadata:
name: javaweb-2
spec:
initContainers:
- image: geektime/sample:v2
name: war
command: ["cp","/sample.war","/app"]
volumeMounts:
- name: app-volume
mountPath: /app
containers:
- name: tomcat
image: geektime/tomcat:7.0
command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
volumeMounts:
- name: app-volume
mountPath: /root/apache-tomcat-7.0.42-v2/webapps
ports:
- containerPort: 8080
hostPort: 8001
volumes:
- name: app-volume
emptyDir: {
}
这里声明了两个容器,第一个容器使用的镜像是 geektime/sample:v2 ,这个镜像只有一个存放在根目录的 WAR 包 sample.war。另一个容器使用的镜像是 Tomcat。
WAR 包容器声明的是一个 initContainer 类型。initContainer 和 container 的区别在于,initContainer 会先于 container 且按照声明顺序运行,等 initContainer 运行完成才会运行普通的 container(有关顺序的容器:定义为Init Container)。
Pod 上挂载的 volume 是一个空目录 app-volume,即它只用于容器间共享。WAR 包容器将 app-volume 挂载到自己的 /app 目录。Tomcat 容器将 app-volume 挂载到自己的 /root/apache-tomcat-7.0.42-v2/webapps 目录下。当 WAR 包容器运行时就会将 sample.war 拷贝到对应目录上,因此 Tomcat 在运行时就能