k8s pod详解使用

什么是pod?

Kubernetes(简称K8s)是一个开源的容器编排平台,广泛用于构建、部署和管理容器化应用程序。在K8s中,Pod是一个核心概念,下面是对Pod的详细解释:

一、Pod的定义

Pod是K8s中最小的可部署单元,也是资源对象模型中由用户创建或部署的最小资源对象模型。它实现了对容器的封装和管理,是一组运行在同一主机(节点)上、共享网络和存储空间的一组容器。Pod内的容器共享同一个网络命名空间和存储卷,可以方便地实现容器间的通信和数据共享。

二、Pod的特点

  1. 共享资源:Pod中的容器共享网络和存储资源。它们可以相互访问,并通过本地主机之间的共享卷交换数据,这有助于减少网络通信开销并简化容器间的依赖关系。
  2. 调度和生命周期管理:K8s会将Pod部署到集群中的节点上,并监控其生命周期。K8s确保Pod一直处于运行状态,如果Pod崩溃或节点故障,K8s会自动在其他节点上重新创建Pod。
  3. 负载均衡:K8s可以根据需要创建多个副本的Pod,并利用负载均衡调度算法将流量分发到这些副本上,确保应用程序的高可用性。
  4. 灵活部署:Pod可以方便地部署和管理多个容器,实现集中式管理和快速部署。这有助于简化应用程序的部署和管理流程。

三、Pod的使用

  1. 创建Pod:在创建Pod之前,需要先搭建一个Kubernetes集群。然后,可以通过定义Pod的配置文件(通常使用YAML格式)来指定Pod的名称、包含的容器、使用的镜像、端口映射等信息。最后,使用kubectl命令行工具应用配置文件并部署Pod到集群中。
  2. 查看Pod状态:使用kubectl命令行工具可以查看Pod的状态信息,包括Pod是否正在运行、是否处于就绪状态等。
  3. 进入Pod内部:有时需要进入Pod的容器内部进行一些操作或调试。可以使用kubectl命令行工具进入Pod的bash终端或执行其他命令。
  4. 删除Pod:当不再需要Pod时,可以使用kubectl命令行工具删除Pod。

四、Pod的作用

Pod在K8s中扮演着至关重要的角色。它是K8s调度和管理的最小单位,也是应用程序部署和管理的基本单元。通过Pod,K8s能够实现对容器化应用程序的自动化部署、扩展和操作。Pod提供了共享资源、简化容器间通信和数据共享的机制,有助于提高应用程序的可用性和可扩展性。

综上所述,Pod是K8s中不可或缺的核心组件之一。它封装和管理容器,提供共享资源和简化通信的机制,为应用程序的部署和管理提供了强有力的支持。

使用pod

1..run/apply -f/create -f运行pod

复制代码
[root@k8s-master pod]# kubectl run mynginx --image=nginx -n myns
pod/mynginx created
[root@k8s-master pod]# kubectl create -f tomcat.yaml 
pod/tomcat created
[root@k8s-master pod]# kubectl apply -f httpd.yaml 
pod/httpd created
​
[root@k8s-master pod]# kubectl get pods -n myns
NAME      READY   STATUS    RESTARTS   AGE
httpd     1/1     Running   0          2m20s
mynginx   1/1     Running   0          4m33s
tomcat    1/1     Running   0          8s

2.get查看pod信息

查看所有pod

复制代码
[root@k8s-master ~]# kubectl get pods -A

查看指定的单个/多个pod

bash 复制代码
[root@k8s-master ~]# kubectl get pod nginx -n myns
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          9s
​
[root@k8s-master ~]# kubectl get pod nginx nginx1 -n myns
NAME     READY   STATUS    RESTARTS   AGE
nginx    1/1     Running   0          97s
nginx1   1/1     Running   0          15s

查看pod同时查看其他类型资源(需要具体指定资源类型和名称)

bash 复制代码
[root@k8s-master ~]# kubectl get pod/nginx -n myns node/k8s-node1
NAME        READY   STATUS    RESTARTS   AGE
pod/nginx   1/1     Running   0          104s
​
NAME             STATUS   ROLES    AGE    VERSION
node/k8s-node1   Ready    <none>   3m6s   v1.28.2

列出在某个节点上运行的pod

bash 复制代码
[root@k8s-master ~]# kubectl get pods --field-selector=spec.nodeName=k8s-node1

-w实时查看pod信息

bash 复制代码
[root@k8s-master ~]# kubectl get  pod -w nginx -n myns 
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          4h16m
[root@k8s-master ~]# 

3.exec操作运行中的pod

进入运行中的pod

bash 复制代码
[root@k8s-master ~]# kubectl exec -it nginx -n myns -- /bin/bash
root@nginx:/# ls
bin   docker-entrypoint.d   home   lib64   mnt   root  srv  usr
boot  docker-entrypoint.sh  lib    libx32  opt   run   sys  var
dev   etc           lib32  media   proc  sbin  tmp
​
#不进入但执行命令
[root@k8s-master ~]# kubectl exec -it nginx -n myns -- ls
bin   docker-entrypoint.d   home   lib64   mnt   root  srv  usr
boot  docker-entrypoint.sh  lib    libx32  opt   run   sys  var
dev   etc           lib32  media   proc  sbin  tmp

进入pod中的容器

bash 复制代码
[root@k8s-master ~]# kubectl exec -it nginx -c xxx -n myns -- /bin/bash
#-c后指定容器名称

4.pod的yaml文件配置定义解析

bash 复制代码
[root@k8s-master ~]# kubectl explain pod.spec
#可以以此形式来一层一层获取可配置项
 
apiVersion: v1 
#必选项,版本号,如V1
kind: Pod 
#必选项,资源类型,pod等
metadata: 
#必选项,元数据部分
  name: xxx 
  #Pod名称
  namespace: xxx 
  #Pod所属的命名空间,默认为"default"
  labels: 
  #自定义标签列表
    - name: xxx   
    #自定义标签内容
spec: 
#必选项,Pod中容器的详细定义
  containers: 
  #必选项,Pod中容器列表
  - name: xxx 
  #必选项,容器名称
    image: xxx 
    #必选项,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ] 
    #获取镜像的策略,tag为latest默认always,tag为具体版本号,默认IfNotPresent。always表示每次都尝试重新拉取镜像;ifNotPresent表示如果本地有那个镜像就使用本地的,不存在时才拉取;Nerver表示仅使用本地有的镜像,绝不拉取,本地没有时报错
    command: [xxx] 
    #容器的启动命令列表,如不指定则使用打包时使用的启动命令
    args: [xxx] 
    #容器的启动命令给定参数列表
    workingDir: xxx 
    #容器的工作目录
    volumeMounts: 
    #挂载到容器内部的存储卷配置
    - name: xxx
    #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: xxx 
      #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: xxx
      #布尔值,是否为只读模式
    ports: 
    #需要暴露的端口库号列表
    - name: xxx
    #端口的名称
      containerPort: xxx 
      #容器需要监听的端口号
      hostPort: xxx
      #容器所在主机需要监听的端口号,默认与Container相同
      protocol: xxx 
      #端口协议,支持TCP和UDP,默认TCP
    env: 
    #容器运行前需设置的环境变量列表
    - name: xxx 
    #环境变量名称
      value: xxx 
      #环境变量的值
    resources: 
    #资源限制和请求的设置
      limits: 
      #资源限制的设置
        cpu: xxx 
        #cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: xxx 
        #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests: 
      #资源请求的设置
        cpu: xxx 
        #cpu请求,容器启动的初始可用数量
        memory: xxx 
        #内存请求,容器启动的初始可用数量
    lifecycle: 
    #生命周期钩子
      postStart: 
      #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
      preStop: 
      #容器终止前执行此钩子,无论结果如何,容器都会终止
  livenessProbe: 
  #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
    exec: 
    #对Pod容器内检查方式设置为exec方式
      command: [xxx] 
      #exec方式需要制定的命令或脚本
    httpGet: 
    #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
      path: xxx
      port: xxx
      host: xxx
      scheme: xxx
      HttpHeaders:
        - name: xxx
          value: xxx
    tcpSocket: 
    #对Pod内个容器健康检查方式设置为tcpSocket方式
      port: number
    initialDelaySeconds: 0 
    #容器启动完成后首次探测的时间,单位为秒
    timeoutSeconds: 0 
    #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
    periodSeconds: 0 
    #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
    successThreshold: 0
    failureThreshold: 0
  securityContext:
    privileged: false
restartPolicy: [Always | Never | OnFailure] 
#Pod的重启策略
nodeName: <xxx> 
#设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: xxx 
#设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets: 
#Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: xxx
hostNetwork: false 
#是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: 
#在该pod上定义共享存储卷列表
  - name: string 
  #共享存储卷名称 (volumes类型有很多种)
    emptyDir: {} 
    #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: xxx 
    #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: xxx 
      #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret: 
    #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
      scretname: xxx
      items:
      - key: xxx
        path: xxx
    configMap: 
    #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: xxx
      items:
      - key: xxx
        path: xxx

5.Pod对容器的封装

对单个容器的封装

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: httpd
  labels:
    run: httpd
  namespace: myns
spec:
  containers:
  - name: httpd
    image: httpd
    ports:
    - containerPort: 80

对多个容器封装并绑定为一个Pod

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: two-containers
  namespace: myns
  labels:
    name: tc
spec:
  containers:
  - name: first-container
    image: nginx
    ports:
    - containerPort: 80
  - name: second-container
    image: busybox
    command: ["/bin/sh", "-c", "while true; do echo 'Hello from the second container' > /shared-data/index.html; sleep 10; done"]
    volumeMounts:
    - name: shared-data
      mountPath: /shared-data
    ports:
    - containerPort: 8080
  volumes:
  - name: shared-data
    emptyDir: {}

6.pod使用配置映射

通过配置映射(ConfigMap),可以将配置文件挂载到Pod中,方便管理和更新。

bash 复制代码
  volumes:
  - name: config-volume
    configMap:
      name: example-config

7.使用存储卷

通过定义存储卷(Volume),可以将持久化存储挂载到Pod中。

bash 复制代码
  volumes:
  - name: vol-data
    persistentVolumeClaim:
      claimName: pvc1

8.使用Replication Controller

通过Replication Controller可以确保指定数量的Pod副本在任何时候都处于运行状态。

bash 复制代码
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: my-deployment
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: my-app
    template:
      metadata:
        labels:
          app: my-app
      spec:
        containers:
        - name: my-container
          image: my-image

9. 使用Deployment

Deployment是Replication Controller的升级版,支持滚动更新和回滚。

bash 复制代码
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: my-deployment
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: my-app
    template:
      metadata:
        labels:
          app: my-app
      spec:
        containers:
        - name: my-container
          image: my-image
          ports:
          - containerPort: 80

10.资源配额和限制

通过设置资源配额(Resource Quotas),可以限制命名空间中所有Pod的资源使用总量。

bash 复制代码
  resources:
    requests:
      memory: "64Mi"
      cpu: "250m"
    limits:
      memory: "128Mi"
      cpu: "500m"

11.节点资源优化

通过设置podsPerCore参数,可以根据节点的CPU核心数来控制每个节点上可以运行的Pod数量。

bash 复制代码
  podsPerCore: 2

12.Pod中的容忍度配置

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "special-user"
    effect: "NoSchedule"
相关推荐
chuanauc2 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉2 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信3 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记3 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花3 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay3 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu3 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记7 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样11 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家12 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook