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
相关推荐
老司机张师傅14 分钟前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
登云时刻1 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
运维&陈同学1 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
吴半杯2 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
Code_Artist4 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
Eternal-Student4 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
码农小丘5 小时前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
灼烧的疯狂6 小时前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
wenyue11217 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
梅见十柒9 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生