一、pod资源的概述

1,pod资源是k8s集群当中,最小的管理单位;

2,其他所有资源都是围绕着为pod资源提供服务的;给pod提供服务的;

3,pod就是“一组”容器,一个pod中可以有1个或者多个容器;

二、pod的数据持久化

1,emptyDir存储卷

        emptyDir存储卷,本质上是一个临时的目录,其生命周期与pod相同,pod被删除,则数据也会被删除;

· 编写pod资源清单

[root@k8s231 pod]# cat 05-nginx.yaml  apiVersion: v1 kind: Pod metadata:   name: nginx-multiple spec:    containers:    - image: nginx:1.20.1-alpine      name: c1

[root@k8s231 pod]# kubectl apply -f 05-nginx.yaml  pod/nginx-multiple created

· pod中nginx写入静态文件模拟访问

[root@k8s231 pod]# kubectl exec nginx-multiple -it -- sh / # cd /usr/share/nginx/html/ /usr/share/nginx/html # echo xinjizhiwa > index.html  /usr/share/nginx/html # exit [root@k8s231 pod]# curl 10.100.2.11 xinjizhiwa

· 模拟容器挂掉

[root@k8s233 ~]# docker container rm -f c8e5fb7c17bc c8e5fb7c17bc

[root@k8s231 pod]# curl 10.100.2.11  Welcome to nginx!

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

· 重新编辑pod清单挂载存储卷

[root@k8s231 pod]# cat 05-nginx.yaml  apiVersion: v1 kind: Pod metadata:   name: m05 spec:    #声明存储卷    volumes:    - name: xinjizhiwa-dir      #声明存储卷类型为emptyDir      emptyDir: {}

   containers:    - image: nginx:1.20.1-alpine      name: c1      #容器挂载存储卷      volumeMounts:      #挂载存储卷的名称      - name: xinjizhiwa-dir        #指定挂载的目录        mountPath: /usr/share/nginx/html/

[root@k8s231 pod]# kubectl apply -f 05-nginx.yaml 

· 进入nginx容器,写一个静态文件

[root@k8s231 pod]# kubectl exec m05 -it -- sh  / # echo xinjizhiwa > /usr/share/nginx/html/index.html

· 再次模拟容器挂掉

[root@k8s233 ~]# docker kill e4877ef03ad4

· 自动重新拉起容器后,再次模拟访问nginx

[root@k8s231 pod]# curl 10.100.2.12 xinjizhiwa

发现数据没丢,说明存储卷挂载成功,实现pod内容器的持久化;

问题来了,当我们删除pod,数据还会存在吗?

[root@k8s231 pod]# curl 10.100.2.13 403 Forbidden

403 Forbidden


nginx/1.20.1

#可以看到,当pod挂掉之后,数据也随之丢失;

· emptyDir存储卷特点总结

1,容器挂掉,数据不会丢失;

2,pod挂掉,数据会丢失;

3,所以,不推荐使用;

2,hostPath存储卷

        将物理机节点中的目录挂载到pod中,pod意外宕机,或者被删除,数据不丢失,仍然存在;同一个pod中不同的容器之间数据共享,同一个worker节点不同的pod之间的数据共享使用;

        在不同worker节点的pod就无法数据共享了;

· 编辑pod资源清单,挂载hostPath存储卷

[root@k8s231 pod]# vim 06-pod-hostpath.yaml

apiVersion: v1 kind: Pod metadata:   name: m06 spec:   #指定pod创建在哪个worker节点中;   nodeName: k8s232   volumes:   - name: hp-01     #声明存储卷类型是hostPath;物理机节点目录挂载     hostPath:        #指定hostPath的路径(物理机挂载路径)       path: /xinjizhiwa/pod-volumes

  containers:   - name: c1     image: nginx:1.20.1-alpine     volumeMounts:     - name: hp-01       mountPath: /usr/share/nginx/html/

· 创建pod资源

[root@k8s231 pod]# kubectl apply -f 06-pod-hostpath.yaml

· k8s232创建挂载目录,写入index文件

[root@k8s232 ~]# mkdir -p /xinjizhiwa/pod-volumes [root@k8s232 ~]# echo xinjizhiwa > /xinjizhiwa/pod-volumes/index.html

· 此时访问nginx

[root@k8s231 pod]# curl 10.100.1.4 xinjizhiwa

· 模拟删除pod再创建查看数据是否丢失

#1,模拟删除pod

[root@k8s231 pod]# kubectl delete pods m06 pod "m06" deleted

#2,重新创建pod [root@k8s231 pod]# kubectl apply -f 06-pod-hostpath.yaml  pod/m06 created [root@k8s231 pod]# kubectl get pods -o wide  NAME   READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES m05    1/1     Running   0          74m   10.100.2.13   k8s233             m06    1/1     Running   0          6s    10.100.1.5    k8s232            

#3,再次访问,发现数据没有丢失; [root@k8s231 pod]# curl 10.100.1.5 xinjizhiwa

此时,持久化成功;

3,NFS存储卷

· 所有节点安装nfs,harbor节点配置nfs

        本次学习我们使用harbor节点作为存储节点

[root@harbor ~]# yum -y install nfs-utils

创建共享目录

[root@harbor ~]# mkdir -p /k8s/data/

编辑NFS配置文件

#1,修改配置文件 [root@harbor ~]# vim /etc/exports

#2,启动并开机自启 [root@harbor ~]# systemctl enable --now nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

#3,查看nfs共享目录是否存在

[root@harbor ~]# exportfs  /k8s/data         

· harbor节点创建要挂在的nfs目录

[root@harbor ~]# mkdir /k8s/data/nginx

· 编辑pod资源清单,挂载nfs

[root@k8s231 pod]# vim 07-pod-nfs.yaml

apiVersion: v1 kind: Pod metadata:   name: volumes-nfs spec:   volumes:   - name: nfs-data     # 指定存储卷的类型是nfs     nfs:       #指定nfs在哪个节点       server: harbor       # 指定nfs挂在路径       path: /k8s/data/nginx   containers:   - name: c1     image: nginx:1.20.1-alpine     volumeMounts:     - name: nfs-data       mountPath: /usr/share/nginx/html

· 创建pod资源

[root@k8s231 pod]# kubectl apply -f 07-pod-nfs.yaml 

· 验证,删除pod重新创建数据是否丢失

[root@k8s231 pod]# kubectl delete pods volumes-nfs  pod "volumes-nfs" deleted [root@k8s231 pod]# kubectl apply -f 07-pod-nfs.yaml  pod/volumes-nfs created [root@k8s231 pod]# kubectl get pods -o wide  NAME          READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES volumes-nfs   1/1     Running   0          4s    10.100.2.15   k8s233             [root@k8s231 pod]# curl 10.100.2.15 xinjizhiwa

· 创建两个pod,都挂载相同nfs存储卷

知识点:【---】代表同一个yaml文件中,多个资源;

[root@k8s231 pod]# cat 07-pod-nfs.yaml  apiVersion: v1 kind: Pod metadata:   name: volumes-nfs01 spec:   nodeName: k8s233   volumes:   - name: nfs-data     # 指定存储卷的类型是nfs     nfs:       #指定nfs在哪个节点       server: harbor       # 指定nfs挂在路径       path: /k8s/data/nginx   containers:   - name: c1     image: nginx:1.20.1-alpine     volumeMounts:     - name: nfs-data       mountPath: /usr/share/nginx/html

---

apiVersion: v1 kind: Pod metadata:   name: volumes-nfs02 spec:   nodeName: k8s232   volumes:   - name: nfs-data     # 指定存储卷的类型是nfs     nfs:       #指定nfs在哪个节点       server: harbor       # 指定nfs挂在路径       path: /k8s/data/nginx   containers:   - name: c1     image: nginx:1.20.1-alpine     volumeMounts:     - name: nfs-data       mountPath: /usr/share/nginx/html

· 验证是否访问结果都一样

[root@k8s231 pod]# kubectl apply -f 07-pod-nfs.yaml  pod/volumes-nfs01 created pod/volumes-nfs02 created

[root@k8s231 pod]# kubectl get pods -o wide  NAME            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES volumes-nfs01   1/1     Running   0          4s    10.100.2.16   k8s233             volumes-nfs02   1/1     Running   0          4s    10.100.1.6    k8s232             [root@k8s231 pod]# curl 10.100.2.16 xinjizhiwa [root@k8s231 pod]# curl 10.100.1.6 xinjizhiwa

至此,nfs存储卷挂载、验证成功;

三、pod网络暴露

1,hostNetwork使用宿主机的网络

· 编辑pod资源清单

[root@k8s231 pod]# cat 08-pod-hnw.yaml  apiVersion: v1 kind: Pod metadata:   name: m08 spec:

  #声明使用宿主机的网络;   hostNetwork: true   containers:   - name: c1     image: nginx:1.20.1-alpine

· 查看pod

发现,ip不再是pod网段,而是宿主机的ip地址了;

[root@k8s231 pod]# kubectl get pods -o wide

此时外部浏览器访问测试

2,宿主机端口映射

· 编辑pod清单

[root@k8s231 pod]# vim 09-pod-hostport.yaml

apiVersion: v1 kind: Pod metadata:   name: m09 spec:   containers:   - name: c1     image: nginx:1.20.1-alpine     #声明容器与宿主机端口映射;     ports:     - name: c1-port       #容器端口       containerPort: 80       #宿主机端口       hostPort: 99       #指定访问协议(默认不写是TCP协议,其实不用写)       #protocol: TCP

· 创建pod资源

[root@k8s231 pod]# kubectl apply -f 09-pod-hostport.yaml

测试访问宿主机的99端口,看是否能够访问到pod的80端口;

四、pod中容器的环境变量env

        什么事pod中容器的环境变量?

        跟linux中的env是一个意思,key=value

[root@k8s231 pod]# xinjizhiwa=HELLO [root@k8s231 pod]# echo $xinjizhiwa HELLO

        也就是说,我们通过pod资源清单的编写,可以为容器中声明env环境变量;

1,编辑pod资源清单

[root@k8s231 pod]# vim 10-pod-env.yaml

apiVersion: v1 kind: Pod metadata:   name: m10 spec:   containers:   - name: c1     image: nginx:1.20.1-alpine     #声明环境变量     env:     #name就是key     - name: xinjizhiwa       #value就是value值       value: HELLO     - name: k8s       value: 1.23.17

2,创建pod资源

[root@k8s231 pod]# kubectl apply -f 10-pod-env.yaml  pod/m10 created

3,进入到pod容器中,验证是否传递成功

[root@k8s231 pod]# kubectl exec m10 -it -- sh / # env k8s=1.23.17 xinjizhiwa=HELLO ..........

/ # echo $xinjizhiwa HELLO / # echo $k8s 1.23.17

至此,env环境变量传递成功;

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。