一、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!
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
#可以看到,当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
#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
· 创建两个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
至此,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环境变量传递成功;
精彩链接
发表评论