K8s中文官网文档:
K8S Pod官网文档:
Pod是k8s中最小的调度单元,Pod里面可以定义一个或多个容器,如果在一个Pod中存在多个容器,以便它们可以共享网络和存储资源,并且可以协同工作来完成一个任务。可以抽象的吧Pod理解成豌豆荚,里面的豌豆理解成容器,如下图:
Pod相当于一个逻辑主机,比方说我们部署一个Nginx服务,如果使用传统部署方式,我们可能会部署到,物理服务器、云服务器上,那么K8s出现后,我们可以定义一个Pod资源,在这个Pod资源中定义Nginx容器,所以Pod重当逻辑主机的角色。
K8s集群中Pod网络指在集群中,Pod之间和Pod与外部网络之间进行通信的网络,每一个Pod都有唯一的IP地址,Pod中的容器共享该IP地址。
查看Pod的IP地址:
kubectl get pod -n kube-system -o wide
Pod网络实现方式有很多种,包括如下:
总之,Kubernetes中的Pod网络是一个非常重要的概念,它为Kubernetes集群中的应用程序提供了高效、可靠的通信方式。
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 是固定的。)
在创建Pod时可以指定挂载存储卷,Pod中所有容器共享访问此存储卷,允许这个容器共享数据,Pod挂载存储卷后,Pod重启之后数据不会丢失,数据依旧存在。如下图所示:
总结,scheduler负责将pod调度到合适的节点,kubelet会使用容器运行时来创建容器,最后将pod状态写入etcd中。
YAML缩进通常为两个空格,我们可以设置一下在linux中tab为两个空格,这样方便我们后续编写YAML清单
cat >> ~/.vimrc << EOF
set tabstop=2
set shiftwidth=2
set expandtab
EOF
其中,tabstop
表示tab键的宽度,shiftwidth
表示自动缩进的宽度,expandtab
表示将tab键自动转换为空格。
在编写pod资源清单时,忘记pod中存在那些字段参数或不明白参数含义等,可以使用一下帮助命令进行查看参数详细解释。
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers
cat 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
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