Pod概述
- 一.Pod的概念
- 1.Pod是什么
- 2.Pod网络共享实现方式
- 3.Pod存储共享方式
- 4.创建Pod的流程
- 二.使用YAML文件定义Pod资源
- 1.Pod资源清单YAML文件书写技巧
- 1.YAML语法格式:
- 2.配置Linux tab缩进两个空格
- 3.使用kubectl explain帮助命令
- 2.创建Pod及Pod常用命令
- 1.创建Pod资源
- 2.Pod常用命令
一.Pod的概念
K8s官方文档:https://kubernetes.io/
K8s中文官方文档: https://kubernetes.io/zh/
K8s Github地址:https://github.com/kubernetes/kubernetes
1.Pod是什么
官方文档:https://kubernetes.io/docs/concepts/workloads/pods/
Pod是Kubernetes中的最小调度单元
,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器)
,Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。
Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器
实现的。
可以把pod看成是一个**“豌豆荚”,里面有很多“豆子”**(容器)。一个豌豆荚里可以有很多豆子(容器)
pod相当于一个逻辑主机–比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机、虚拟机或者云主机上,那么出现k8s之后,我们就可以定义一个pod资源,在pod里定义一个把tomcat容器,所以pod充当的是一个逻辑主机的角色。
2.Pod网络共享实现方式
K8s集群中Pod网络指在集群中,Pod之间和Pod与外部网络之间进行通信的网络,每一个Pod都有唯一的IP地址,Pod中的容器共享该IP地址。
查看Pod得到IP地址
kubectl get pod -n kube-system -o wide
Pod网络实现方式有很多种,包括如下:
- 容器网络接口(CNI):CNI是Kubernetes中最常用的Pod网络实现方式之一。它允许不同的网络插件来管理Pod网络,如Flannel、Calico、Weave Net等。
- Kubernetes Service:Kubernetes Service是一种抽象的概念,它允许Pod之间通过Service名称进行通信,而不需要知道具体的Pod IP地址。Service可以通过ClusterIP、NodePort、LoadBalancer等方式进行暴露。
- Ingress:Ingress是Kubernetes中的一种资源对象,它允许将外部流量路由到集群内的Service。Ingress可以通过多种方式进行配置,如Nginx Ingress Controller、Traefik等。
Pod中容器共享网络方式:
在K8S中,启动Pod是,首先会启动一个pause的容器,然后将后续的所有容器都link到这个pause容器,以实现网络共享。如下图所示:
Pod与Pod共享网络方式:
-
在同节点不同Pod之间通信:通过linux虚拟以太网设备或者是用两个虚拟接口组成的以太网接口对不同的网络命名空间连接起来通信。
-
不同节点的不同 pod 主机间通信:当跨 pod 通信时,本节点内无法找到目的 pod 的 mac 地址,则会查找三层路由表转发,这需要依靠不同节点间的网路配置来实现。
-
外部网络和 pod 之间通信:pod 之间通过他们自己的 ip 地址进行通信.(但是 pod 的 ip 地址不是持久的,当集群中 pod 的规模缩减或者 pod 故障或者 node 故障重启后,新的 pod 的 ip 就可能与之前的不一样的,service 的虚拟 IP 可以解决这个问题,因为虚拟 ip 是固定的。)
3.Pod存储共享方式
在创建Pod时可以指定挂载存储卷,Pod中所有容器共享访问此存储卷,允许这个容器共享数据,Pod挂载存储卷后,Pod重启之后数据不会丢失,数据依旧存在。如下图所示:
4.创建Pod的流程
- 第一步:通过kubectl命令向apiserver提交创建pod请求,apiservice接收到创建pod请求后,会将pod的属性信息(metadata)写入到etcd数据库中。
- 第二步:apiserver触发watch机制准备创建pod资源,信息转发给scheduler调度器,scheduler调度器负责该pod调度到合适的节点,并将调度信息给apiserver,apiserver在写入到etcd数据库中。
- 第三步:apiserver又通过watch机制,调用kubelet,指定pod信息,调用容器运行时创建并启动pod内容器。
- 第四步:创建完成后反馈给kubelet,kubelet又将pod状态信息给apiserver,apiserver又将pod的状态信息写入到etcd数据库中。
总结,scheduler负责将pod调度到合适的节点,kubelet会使用容器运行时来创建容器,最后将pod状态写入etcd中。
二.使用YAML文件定义Pod资源
1.Pod资源清单YAML文件书写技巧
1.YAML语法格式:
大小写敏感
;使用缩进表示层级关系
;缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
;字符后缩进一个空格,如冒号,逗号,短横杆(-) 等
"—"表示一个文件的开始 “…” 表示一个文件的结束
"#"表示注释
2.配置Linux tab缩进两个空格
YAML缩进通常为两个空格,我们可以设置一下在linux中tab为两个空格,这样方便我们后续编写YAML清单
cat >> ~/.vimrc << EOF
set tabstop=2
set shiftwidth=2
set expandtab
EOF
3.使用kubectl explain帮助命令
在编写pod资源清单时,忘记pod中存在那些字段参数或不明白参数含义等,可以使用一下帮助命令进行查看参数详细解释。
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers
2.创建Pod及Pod常用命令
1.创建Pod资源
vim pod.yaml
---
apiVersion: v1 # api版本
kind: Pod # 定义类型
metadata: # 元数据
labels:
app: nginx # 标签
name: web-nginx # Pod名称
namespace: default # Pod名称空间
spec:
containers:
- name: web-nginx # 容器名称
image: nginx # 容器使用镜像
imagePullPolicy: IfNotPresent # 镜像下载策略
ports:
- containerPort: 80 # 容器内暴露端口
定义完成pod清单后 使用以下命令进行创建
kubectl apply -f pod.yaml
也可以使用命令行进行创建Pod,不常用,一般测试时使用
kubectl run nginx-1 --image=nginx --port=80
2.Pod常用命令
1、查看Pod调度节点及IP地址
kubectl get pod -o wide
2、进入Pod容器内:
kubectl exec -it web-nginx -- /bin/bash
如果Pod中存在多个容器 可以使用 -c 来指定进入的容器
kubectl exec -it web-nginx -c web-nginx -- /bin/bash
3、查看pod日志:
kubectl logs web-nginx
当然可以添加 -f 参数来实时查看日志
kubectl logs -f web-nginx
4、通过Pod标签来查看Pod:
kubectl get pod -l app
5、查看Pod具有哪些标签
kubectl get pod --show-labels
6、查看Pod详细信息
kubectl describe pod web-nginx
7.删除Pod
kubectl delete pod web-nginx
当然也可以指定yaml文件来删除文件中定义的资源
kubectl delete -f pod.yaml