【Kubernetes资源篇】Pod最小调度单元入门实战详解

一、Pod概念

K8s中文官网文档:

K8S Pod官网文档:

1、Pod是什么?

Pod是k8s中最小的调度单元,Pod里面可以定义一个或多个容器,如果在一个Pod中存在多个容器,以便它们可以共享网络和存储资源,并且可以协同工作来完成一个任务。可以抽象的吧Pod理解成豌豆荚,里面的豌豆理解成容器,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KG2khBh8-1683446641109)(D:\MD归档文档\IMG\image-20230505105607164.png)]

Pod相当于一个逻辑主机,比方说我们部署一个Nginx服务,如果使用传统部署方式,我们可能会部署到,物理服务器、云服务器上,那么K8s出现后,我们可以定义一个Pod资源,在这个Pod资源中定义Nginx容器,所以Pod重当逻辑主机的角色。

2、Pod网络共享实现方式

K8s集群中Pod网络指在集群中,Pod之间和Pod与外部网络之间进行通信的网络,每一个Pod都有唯一的IP地址,Pod中的容器共享该IP地址。

查看Pod的IP地址:

kubectl get pod -n kube-system -o wide

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVxnMAfq-1683446641110)(D:\MD归档文档\IMG\image-20230507095918770.png)]

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等。

总之,Kubernetes中的Pod网络是一个非常重要的概念,它为Kubernetes集群中的应用程序提供了高效、可靠的通信方式。

Pod中容器共享网络方式:

在K8s中,启动Pod时,首先会先启动一个pause的容器,然后将后续的所有容器都link到这个pause容器,以实现网络共享,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BnN8nOMA-1683446641111)(D:\MD归档文档\IMG\image-20230505112546484.png)]

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重启之后数据不会丢失,数据依旧存在。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLmXj1i4-1683446641111)(D:\MD归档文档\IMG\image-20230505113202916.png)]

4、创建Pod整体流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLg99uSr-1683446641111)(D:\MD归档文档\IMG\image-20230507105531268.png)]

  • 第一步:通过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

其中,tabstop表示tab键的宽度,shiftwidth表示自动缩进的宽度,expandtab表示将tab键自动转换为空格。

3. 使用kubectl explain帮助命令

在编写pod资源清单时,忘记pod中存在那些字段参数或不明白参数含义等,可以使用一下帮助命令进行查看参数详细解释。

kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers

2、创建Pod及Pod常用命令

1.创建Pod资源

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

2.Pod常用命令

1、查看Pod调度节点及IP地址

kubectl get pod -o wide

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBnyfaPO-1683446641112)(D:\MD归档文档\IMG\image-20230507153053895.png)]

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

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/130543948