9-5 深入Pod - pod相关的点点滴滴(上)
设计思想
pod是最小的调度单位
本质还是容器的隔离(共享了同一个network namespace 共享了一个volume docker也可以使用docker run --net=xxx --volume-from=xxx 实现)
pause容器,每个pod都有它,并且会率先启动
创建pod-network.yaml
apiVersion: v1
kind: Pod
metadata :
name: pod-network
spec:
containers :
- name: web
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
- name: dubbo
env:
- name: DUBBO_P0RT
value: "20881"
image : harbor.pdabc.com/kubernetes/dubbo:v1
ports:
- containerPort: 20881
hostPort: 20881
protocol: TCP
1pod对网络的设计
创建pod
kubectl create -f pod-network.yaml
kubectl get pods -o wide
到node3上执行docker ps |grep network
最先启动的是pause
进入其中一个容器
docker exec -it 0b0a79e9320d /bin/sh
发现当前容器是dubbo服务 但是可以同时看到tomcat的端口
通过wget 去访问8080端口 说明网络是通的
运行ifconfig 并记录下容器的ip为10.244.5.83
退出并进入另一个容器
发现ip是一样的 共享一个ip地址
2pod对volume的设计
先删除pod-network.yaml
kubectl delete -f pod-network.yaml
创建pod-volume.yaml
模拟业务容器写入日志 日志容器采日志 共用一个volume的情况 共享日志目录
创建pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
containers:
- name: web
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
volumeMounts:
- name: shared-volume
mountPath: /shared-web
- name: dubbo
env:
- name: DUBBO_PORT
value: "20881"
image: harbor.pdabc.com/kubernetes/dubbo:v3
ports:
- containerPort: 20881
hostPort: 20881
protocol: TCP
volumeMounts:
- name: shared-volume
mountPath: /shared-dubbo
volumes:
- name: shared-volume
hostPath:
path: /shared-volume-data
kubectl create -f pod-volume.yaml
这里我第一次创建的时候 容器一直处于error或者CrashLoopBackOff状态 通过describe 查看日志也看不出什么.后来发现是弄错镜像了.v1版本的镜像dockerfile 不对
查看到pod启动在node3上,在node3进入容器看一下
进入第一个容器 并创建jiaminxu.txt的文件 验证是否可以共享
查看两个volume容器的/etc/hosts文件是否一致
docker ps |grep volume
docker exec -it c881e17ea8b8 cat /etc/hosts
docker exec -it 5837140fd00c cat /etc/hosts
证明了这个hosts文件是pod负责创建并管理的 并不是容器管理的,如果需要自定义修改hosts,不能在容器层面修改.需要修改pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
hostAliases:
- ip: "10.244.5.86"
# 可以添加多个主机名
hostnames:
- "web-alia.pdabc.com"
containers:
- name: web
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
volumeMounts:
- name: shared-volume
mountPath: /shared-web
- name: dubbo
env:
- name: DUBBO_PORT
value: "20881"
image: harbor.pdabc.com/kubernetes/dubbo:v3
ports:
- containerPort: 20881
hostPort: 20881
protocol: TCP
volumeMounts:
- name: shared-volume
mountPath: /shared-dubbo
volumes:
- name: shared-volume
hostPath:
path: /shared-volume-data
kubectl delete -f pod-volume.yaml
kubectl create -f pod-volume.yaml
已经添加
继续修改pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
hostNetwork: true
hostPID: true
hostAliases:
- ip: "10.244.5.86"
hostnames:
- "web-alia.pdabc.com"
containers:
- name: web
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
volumeMounts:
- name: shared-volume
mountPath: /shared-web
- name: dubbo
env:
- name: DUBBO_PORT
value: "20881"
image: harbor.pdabc.com/kubernetes/dubbo:v3
ports:
- containerPort: 20881
hostPort: 20881
protocol: TCP
volumeMounts:
- name: shared-volume
mountPath: /shared-dubbo
volumes:
- name: shared-volume
hostPath:
path: /shared-volume-data
delete 之后create
kubectl delete -f pod-volume.yaml
kubectl create -f pod-volume.yaml
进入容器之后ps 可以看到很多进程
生命周期
继续修改pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
hostNetwork: true
hostPID: true
hostAliases:
- ip: "10.244.5.86"
hostnames:
- "web-alia.pdabc.com"
containers:
- name: web
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
volumeMounts:
- name: shared-volume
mountPath: /shared-web
# poststart这步是容器执行entrypoint命令进行启动的时候,也会同时执行exec的command,不要放一些需要容器启动之后的命令 .
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo web starting ... >> /var/log/messages"]
# 这个命令是串行的,在容器停止之前会启动这个脚本,这个执行完之后才会停止容器,并且会等待命令执行完毕,有默认超时时间.
preStop:
exec:
command: ["/bin/sh", "-c", "echo web stoping ... >> /var/log/messages && sleep 5"]
- name: dubbo
env:
- name: DUBBO_PORT
value: "20881"
image: harbor.pdabc.com/kubernetes/dubbo:v3
ports:
- containerPort: 20881
hostPort: 20881
protocol: TCP
volumeMounts:
- name: shared-volume
mountPath: /shared-dubbo
volumes:
- name: shared-volume
hostPath:
path: /shared-volume-data
delete 并且create
查看tomcat容器的messages 有启动的日志
再delete