目录
一、Pod介绍
二、指令创建和管理Pod
三、资源清单创建pod
1.挂载hostPath存储卷
2.NFS存储卷
所有节点安装nfs
k8s3编辑NFS配置文件
k8s1,k8s2节点开机挂载
编辑pod资源清单,挂载nfs
四、pod网络暴露
1.hostNetwork使用宿主机的网络
2.宿主机端口映射
五、pod中容器的环境变量env
一、Pod介绍
Pod 是包含一个或多个容器的容器组,是 Kubernetes 中创建和管理的最小对象。
Pod 有以下特点:
- Pod是kubernetes中最小的调度单位(原子单元),Kubernetes直接管理Pod而不是容器。
- 其他所有资源都是围绕着为pod资源提供服务的,给pod提供服务的。
- 同一个Pod中的容器总是会被自动安排到集群中的同一节点(物理机或虚拟机)上,并且一起调度。
- Pod可以理解为运行特定应用的“逻辑主机”,这些容器共享存储、网络和配置声明(如资源限制)。
- 每个 Pod 有唯一的 IP 地址。 IP地址分配给Pod,在同一个 Pod 内,所有容器共享一个 IP 地址和端口空间,Pod 内的容器可以使用
localhost
互相通信。
例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 "边车 (sidercar)" 容器负责从远端更新这些文件,如下图所示:
二、指令创建和管理Pod
# 创建pod
[root@k8s1 pod]# kubectl run mynginx --image=nginx:1.16.1-alpine
# 查看pod的IP和运行节点信息
[root@k8s1 pod]# kubectl get pod --watch -owide
# 描述,可以用来排查问题
[root@k8s1 pod]# kubectl get pod --watch -owide
# 查看pod的运行日志
[root@k8s1 pod]# kubectl logs mynginx
# 使用Pod的ip+pod里面运行容器的端口
[root@k8s1 pod]# curl 10.100.1.4# 在容器中执行命令
[root@k8s1 pod]# kubectl exec mynginx -it -- /bin/sh
# -it 交互模式
# --rm 退出后删除容器,多用于执行一次性任务或使用客户端[root@k8s1 pod]# kubectl run mynginx --image=nginx:1.16.1-alpine -it --rm -- /bin/sh
# 删除
[root@k8s1 pod]# kubectl delete pod mynginx
# 强制删除[root@k8s1 pod]# kubectl delete pod mynginx --force
三、资源清单创建pod
1.挂载hostPath存储卷
- 将物理机节点中的目录挂载到pod中,pod意外宕机,或者被删除,数据不丢失;
- 同一个pod中不同的容器之间数据共享;
- 同一个worker节点,不同的pod之间的数据共享;
- 在不同worker节点的pod无法数据共享;
# 编写资源清单
[root@k8s1 pod]# vi pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:#指定pod创建在哪个worker节点中;nodeName: k8s1volumes:- name: hp-01#声明存储卷类型是hostPath;物理机节点目录挂载hostPath: #指定hostPath的路径(物理机挂载路径)path: /data/pod-volumescontainers:- name: c1image: nginx:1.16.1-alpinevolumeMounts:- name: hp-01mountPath: /usr/share/nginx/html/
# 创建pod资源
[root@k8s1 pod]# kubectl apply -f pod-hostpath.yaml[root@k8s2 pod-volumes]# mkdir -p /data/pod-volumes
[root@k8s2 pod-volumes]# echo oslee > /data/pod-volumes/index.html# 访问nginx
[root@k8s1 pod]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mypod 1/1 Running 0 33s 10.100.0.2 k8s1 <none> <none>
[root@k8s1 pod]# curl 10.100.0.2
oslee
2.NFS存储卷
所有节点安装nfs
# 安装nfs
yum -y install nfs-utils
# 创建共享目录mkdir -p /data/nfs_data
k8s3编辑NFS配置文件
# 配置nfs
[root@k8s3 data]# vim /etc/exports
/data/nfs_data/ 10.128.0.0/16(rw,no_root_squash,no_all_squash,sync)# 启动并开机自启
[root@k8s3 data]# systemctl enable --now nfs# 命令使配置立即生效
[root@k8s3 data]# exportfs -r
# 查看nfs共享目录是否存在
[root@k8s3 data]# exportfs
/data/nfs_data 10.128.0.0/16
[root@k8s3 data]#
k8s1,k8s2节点开机挂载
# 挂载共享目录
mount -t nfs 10.128.175.196:/data/nfs_data/ /data/nfs_data/ -o nolock,nfsvers=3,vers=3
# 开机自动挂载
vim /etc/rc.d/rc.local
mount -t nfs 10.128.175.196:/data/nfs_data/ /data/nfs_data/ -o nolock,nfsvers=3,vers=3
编辑pod资源清单,挂载nfs
[root@k8s1 pod]# vi pod-nfs.yaml
apiVersion: v1
kind: Pod
metadata:name: volumes-nfs01
spec:nodeName: k8s1volumes:- name: nfs-data# 指定存储卷的类型是nfsnfs:#指定nfs在哪个节点server: k8s3# 指定nfs挂在路径path: /data/nfs_data/nginxcontainers:- name: c1image: nginx:1.16.1-alpinevolumeMounts:- name: nfs-datamountPath: /usr/share/nginx/html---apiVersion: v1
kind: Pod
metadata:name: volumes-nfs02
spec:nodeName: k8s2volumes:- name: nfs-data# 指定存储卷的类型是nfsnfs:#指定nfs在哪个节点server: k8s3# 指定nfs挂在路径path: /data/nfs_data/nginxcontainers:- name: c1image: nginx:1.16.1-alpinevolumeMounts:- name: nfs-datamountPath: /usr/share/nginx/html
# 创建pod资源
[root@k8s1 pod]# kubectl apply -f pod-nfs.yaml
pod/volumes-nfs created# 访问nginx
[root@k8s1 pod]# echo oslee > /data/nfs_data/nginx/index.html
[root@k8s1 pod]# curl 10.100.1.8
oslee
[root@k8s1 pod]#
四、pod网络暴露
1.hostNetwork使用宿主机的网络
# 编辑pod资源清单
[root@k8s1 pod]# vi pod-hnw.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-hnw
spec:#声明使用宿主机的网络;hostNetwork: truecontainers:- name: c1image: nginx:1.16.1-alpine
# 查看pod
[root@k8s1 pod]# kubectl get pods -o wide
# 此时可以外部浏览器访问
2.宿主机端口映射
# 编辑pod清单
[root@k8s1 pod]# vi pod-hostport.yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod-hpm
spec:nodeName: k8s2containers:- name: c1image: nginx:1.16.1-alpine#声明容器与宿主机端口映射;ports:- name: c1-port#容器端口containerPort: 80#宿主机端口hostPort: 99#指定访问协议(默认不写是TCP协议,其实不用写)# protocol: TCP
# 创建pod资源
[root@k8s1 pod]# kubectl apply -f pod-hostport.yaml
pod/my-pod-hpm created
# 外部浏览器访问 http://{ip}:99
五、pod中容器的环境变量env
pod中的环境变量跟linux一致,key=value
[root@k8s1 ~]# name=oslee
[root@k8s1 ~]# echo $name
oslee
也就是说,我们通过pod资源清单的编写,可以为容器中声明env环境变量;
# 编辑pod资源清单
[root@k8s1 ~]# vi pod-env.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-env
spec:containers:- name: c1image: nginx:1.16.1-alpine#声明环境变量env:#name就是key- name: oslee#value就是value值value: hello- name: k8svalue: 1.23.17
# 创建pod资源
[root@k8s1 ~]# kubectl apply -f pod-env.yaml
pod/pod-env created# 测试变量
[root@k8s1 ~]# kubectl exec -it pod-env -- /bin/sh
/ # echo $oslee
hello
/ # echo $k8s
1.23.17