前言

本来没打算写这个的,但是我自己老忘╰( ̄ω ̄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~~~后面说