K8S之Pod的介绍和使用

Pod的理论和实操

pod理论说明

Pod介绍

Pod是Kubernetes中的最小调度单元,k8s通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。

一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。

如果把pod看作虚拟机,每个容器相当于运行在虚拟机里的进程。

Pod运行与管理

Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。

Pod管理多个容器

Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当容器之间需要紧密配合协作的时候才考虑用这种模式。

一些Pod有init容器和应用容器。 在应用程序容器启动之前,运行初始化容器。

目前最流行的容器有Docker、Containerd、Podman,Pod可以作为1或者多个容器的载体。

Pod网络

Pod是有IP地址的,由网络插件(calico、flannel、weave)划分的IP,每个pod都被分配唯一的IP地址

在k8s中,启动Pod时,会先启动⼀个pause 的容器,然后将后续的所有容器都 link 到这个pause 的容器,以实现网络共享。

Pod存储

创建Pod的时候可以指定挂载的存储卷。 Pod中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod只要挂载持久化数据卷,Pod重启之后数据还是会存在的。

Pod工作方式

在K8s中,所有的资源都可以使用yaml文件来创建,因此创建Pod也可以使用yaml配置文件(常用方式) 。也有使用kubectl run在命令行创建Pod (不常用)

自主式Pod

所谓的自主式Pod,就是直接定义一个Pod资源
如果Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的。

例如:

创建一个pod资源文件

bash 复制代码
vim pod-tomcat.yaml
yaml 复制代码
apiVersion: v1
kind: Pod # 直接定义为Pod资源
metadata:
  name: tomcat-test
  namespace: default
  labels:
    app: tomcat
    use: test
spec:
  containers:
  - name:  tomcat-java
    ports:
    - containerPort: 8080
    image: tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent

创建资源

bash 复制代码
kubectl apply -f pod-tomcat.yaml

查看pod是否创建成功

(ps. -o wide 表示看完整信息,-l app=tomcat 表示查询有app:tomcat 标签的pod)

bash 复制代码
kubectl get pods -o wide -l app=tomcat

删除pod

bash 复制代码
kubectl delete pods tomcat-test

结果是空,说明pod已经被删除了

控制器管理的Pod(常用)

常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。

控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。

例如:通过Deployment管理Pod

创建一个Deployment资源文件

bash 复制代码
vim nginx-deploy.yaml
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

创建资源

bash 复制代码
kubectl apply -f nginx-deploy.yaml

查看Deployment

bash 复制代码
kubectl get deploy -l app=nginx-deploy

READY为2/2 表示有2个pod已创建并运行

查看pod

bash 复制代码
kubectl get pods -o wide -l app=nginx

删除上面图中 nginx-test-5b76549fbd-g5779 这个pod

bash 复制代码
kubectl delete pods nginx-test-5b76549fbd-g5779 

再看pod的情况

bash 复制代码
kubectl get pods -o wide -l app=nginx

发现重新创建一个新的pod是:nginx-test-5b76549fbd-xzv6p

通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量

创建pod的流程

第一步:

通过 kubectl 命令向 apiServer 提交创建pod的请求,apiServer 接收到pod创建请求后,会将pod的属性信息(metadata)写入etcd(数据库)。

第二步:

apiServer 触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给apiServer ,apiServer 将绑定的node信息写入etcd

第三步:

apiServer 又通过watch机制,调用kubelet,指定pod信息,kubelet调用容器运行时创建并启动pod内的容器。

第四步:

pod创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiServer ,apiServer 再将pod的状态信息写入etcd。

pod实操

通过资源清单文件创建自主式pod

开始编写yaml时,可查看帮助命令:

bash 复制代码
kubectl explain pod

执行帮助命令后,会返回yaml里需要编写的字段名,格式和含义

yaml 复制代码
# apiVersion、kind填帮助命令里返回的value

apiVersion: v1 #api版本
kind: Pod  #创建的资源
metadata:
  name: tomcat-test  #Pod的名字
  namespace: default  #Pod所在的名称空间
  labels:
    app:  tomcat  #Pod具有的标签,key为app,value为tomcat  
spec:
  containers:
  - name:  tomcat-java  #Pod里容器的名字
image: xianchao/tomcat-8.5-jre8:v1  #容器使用的镜像
  imagePullPolicy: IfNotPresent   #镜像拉取策略
    ports:
    - containerPort: 8080  #容器暴露的端口

其中,imagePullPolicy是镜像拉取策略,可以根据这个字段设置镜像拉取策略,支持如下三种:

  • Always:不管本地是否存在镜像,都要重新拉取镜像
  • Never: 从不拉取镜像
  • IfNotPresent:如果本地存在,使用本地的镜像,本地不存在,从官方拉取镜像

查看命名空间

bash 复制代码
kubectl get ns

更新资源清单文件

bash 复制代码
kubectl apply -f pod-tomcat.yaml

查看pod是否创建成功

(ps. -l app=tomcat 表示查询标签)

bash 复制代码
kubectl get pods -l app=tomcat

查看指定命名空间下的pods

bash 复制代码
kubectl get pods -n default

查看pod的IP和调度节点

bash 复制代码
kubectl get pods -owide

查看pod日志

bash 复制代码
kubectl logs tomcat-test

进入到刚才创建的pod,刚才创建的pod名字是tomcat-test

bash 复制代码
kubectl exec -it tomcat-test  -- /bin/bash

假如pod里有多个容器,进入到pod里的指定容器,加 -c 容器的名字

bash 复制代码
kubectl exec -it tomcat-test -c tomcat-java -- /bin/bash

查看pod详细信息

bash 复制代码
kubectl describe pods tomcat-test

查看pod具有哪些标签

bash 复制代码
kubectl get pods --show-labels

删除pod

bash 复制代码
kubectl delete pods tomcat-test

或者

bash 复制代码
kubectl delete -f pod-tomcat.yaml

通过kubectl run创建Pod(不常用)

bash 复制代码
kubectl run tomcat --image=tomcat-8.5-jre8:v1 --image-pull-policy='IfNotPresent'  --port=8080
相关推荐
chuanauc6 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉6 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信6 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记6 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花6 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay6 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu6 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记10 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样15 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家15 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook