一、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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
· 重新编辑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
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>#可以看到,当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-volumescontainers:
- 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 <none> <none>
m06 1/1 Running 0 6s 10.100.1.5 k8s232 <none> <none>#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 <world>
· 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 <none> <none>
[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 <none> <none>
volumes-nfs02 1/1 Running 0 4s 10.100.1.6 k8s232 <none> <none>
[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文章来源:https://www.toymoban.com/news/detail-833207.html
至此,env环境变量传递成功;文章来源地址https://www.toymoban.com/news/detail-833207.html
到了这里,关于03-k8s的pod资源01-数据持久化、env环境变量、网络暴露的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!