前言
本来没打算写这个的,但是我自己老忘╰( ̄ω ̄o) 就当留笔记了
一. pod的基本概念
1. 最小部署单元
2. 包含多个容器 (一组容器的集合)
3. 一个pod中容器共享网络命名空间
4. pod是短暂的
为什么说最小单元是pod而不是容器呢?
#首先我们要知道,容器是由docker创建的,每个容器都要在系统中占用一个进程
[root@k8s-master01 ~]# docker top test(容器id或名称)
UID PID PPID C STIME TTY TIME CMD
root 105800 105780 0 09:47 pts/0 00:00:00 bash
#查看
[root@k8s-master01 ~]# ps -ef | grep 105800
root 105800 105780 0 09:47 pts/0 00:00:00 bash
root 106111 96613 0 09:47 pts/0 00:00:00 grep --color=auto 105800
每个容器都有一个进程,被称为守护进程。会一直保持运行,如果该进程死亡,容器则会关闭。
(比如我们docker run的bash,镜像中的的cmd: ["sh","-c","xx"]所指定的进程)我们可以指定一个容器中有多个业务进程,但是这样不方便管理。
(比如某个进程死了,但守护进程依旧在跑。我们也不知道坏了。所以还是提倡一个容器一个进程,这样进程一挂,容器就关掉了)而pod则是管理多个容器的一个集合体在k8s中我们所管理的不是单个容器,而是一组容器 的集合(pod)
二. pod的实现机制
之前我们容器是由创建直接创建的,容器本身之间是通过namespace来隔离的
如果想要让两个容器共享网络,就必须要让容器都处于在同一个namepsace下
1.共享网络
首先通过pod创建容器时,会建立一个pause的容器,也被称为info容器或者说根容器
[root@k8s-master01 ~]# docker ps -a | grep pause
fb3f327f5332 lizhenliang/pause-amd64:3.0 "/pause" 7 days ago Up 7 days k8s_POD_kube-flannel-ds-pb9wm_kube-system_f0962945-f7fd-4f38-b1f8-c21a0599f4cc_0
而后续我们创建的容器被称之为业务容器
我们新建的业务容器会加入到这个pause的根容器中,让所有业务容器在同一个名称空间中,可以实现网络共享
pod
|- pause(基础容器)
|- 业务容器1
|- 业务容器2
2. 共享存储
这里涉及到一个数据卷的概念,和docker中的volume存储卷类似,都是做数据持久化的
#如下
第一个容器(write)用于写入数据,写入到我们的挂载存储卷中/data
第二个容器(read)去读取数据,读取我们挂载卷的内容/data/hello
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: write
image: centos:latest
imagePullPolicy: IfNotPresent
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos:latest
imagePullPolicy: IfNotPresent
command: ["bash","-c","tail -f /data/hello"]
volumeMounts: #具体挂载到容器的位置
- name: data
mountPath: /data
volumes: #指定挂载卷的类型及路径
- name: data
emptyDir: {} #临时存储类型,pod删除时也会清除
部署
kubectl create -f ss.yaml
#查看
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-pod 2/2 Running 0 6s
进入单个容器查看
[root@k8s-master01 ~]# kubectl exec -it my-pod -c write sh
sh-4.4#
cat /data/hello
#返回
1
2
...
100
三. 为什么说pod是短暂的
因为当我们新建、删除、pod故障退出等,pod都会重新获取ip地址
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 2/2 Running 0 3s 10.244.1.4 192.168.1.22 <none> <none>
#删除之前的pod
[root@k8s-master01 ~]# kubectl delete -f ss.yaml
#新建
[root@k8s-master01 ~]# kubectl create -f ss.yaml
pod/test-pod created
#查看
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 2/2 Running 0 1s "10.244.0.4" 192.168.1.20 <none> <none>
如果我们内部想要通过pod的ip地址来访问,就会变的非常不可靠。
解决方法svc~~~后面说