K8S初级入门系列之三-Pod的基本概念和操作

这篇具有很好参考价值的文章主要介绍了K8S初级入门系列之三-Pod的基本概念和操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

       Pod的原意是豌豆荚的意思,一个豆荚里面包含了很多豆子。在K8S中,Pod也是类似的意思,只不过这里的豆子就是容器。在K8S初级入门系列之一-概述中,我们对Pod有个初步的了解。

1、Pod是K8S编排和调度的最小基础单元。

        了解容器的同学会知道,容器之间通过隔离技术(namespace+cgroup+chroot),实现了应用间的隔离。那么K8S为何不直接使用容器进行调度,而非得再引入Pod的概念,使得模型更加复杂呢?现在的复杂系统有着成百上千的服务,服务与服务之间的关系,从运行环境看,需要做资源的隔离,但是从业务逻辑看,他们又存在亲和性。

       比如下面的系统中,字数统计是应用服务,实现业务功能,Nginx服务负责应用服务的反向代理以及负载均衡,日志采集服务收集应用服务的日志并进行上报,这三个服务必须部署运行在一起,才能对外提供完整的功能。同时为了系统的可靠性,数据库MySql服务需要和应用服务分开部署。

K8S初级入门系列之三-Pod的基本概念和操作,K8S,K8S,Pod

     这个例子中,如果用容器实现,就需要将应用服务,Ngnix服务,日志采集服务放到一个容器中,才能实现统一部署。这种方式不是说不可以,但是违背了容器的设计理念,即一个进程跑一个容器。可以看到,Pod即有利于进程资源的隔离,又能独立打包部署和维护。

      通过Pod就可以把具备亲和性的服务包裹一起,而互斥性的服务部署在不同Pod中,K8S通过对Pod的调度和编排,解决了上述容器无法实现的问题。

  • Pod是K8S中最核心,最基础的概念

K8S的其他组件和概念,基本上都是直接或者间接围绕Pod发展的。如下图所示:

K8S初级入门系列之三-Pod的基本概念和操作,K8S,K8S,Pod

本章节我们先了解Pod的一些基本概念和操作,关于Pod高级特性我们放到后面章节。 

 二、YAML语言

     在了解Pod前,我们先看下YAML语言。在K8S的世界里,所有的对象都可以采用了YAML语言描述,YAML语言类似于JSON,但是比JSON更加的清晰紧促,首先做个对比:

JSON的描述:

{ 
   "students":
      {
          "boy":20,
          "girl":22      
       }
}

YMAL的描述

Students:
  boy:  20
  girl: 22

可以看到,YAML是通过缩减和空白表示层次间的关系。YAML语言需要注意以下几点:

  • 对象与值之间用":"隔开,冒号后面一定要带上空格。
  • 数组或者列表采用"-"开头,横杠后面一定要带上空格。
  • 在一个文件中可以有多个YAML描述对象,使用"---"分割。
  • 使用"#"描写注释

具体的语法可以参见YAML官网

三、Pod的描述

      K8S采用YAML语言,声明式的描述Pod对象。我们先看下较简单的Pod对象示例。

apiVersion: v1
kind: Pod
metadata:
  name: busybox-pod
  labels: 
     app: bash
spec:
  containers:
  - name: busybox
    image: busybox
    env:
      - name: type
        value: prod
      - name: log
        value: debug
    command:
      - "/bin/sh"
      - "-c"
      - "sleep 3000"
    args:
      - "$(type), $(log)"

     Pod对象有apiVersion,kind,metadata,spec四部分组成。apiVersion描述版本,kind描述类型,对于Pod来说,固定为v1和Pod。

      metadata描述pod的元数据,一般有name,以及labels。name表示该Pod的名称,labels是Pod的标签,可以有多个,表示Pod的"归类",这个属性很重要,后续的Pod的选择都是依赖标签完成。

    spec是对Pod详细定义,本篇我们重点了解containers,顾名思义,里面可以定义多个容器,容器重要的属性如下:

  • name,容器的名称。
  • image,镜像的名称。
  • env,环境变量,可以配置运行时的环境变量列表。
  • command,容器启动时,执行的指令。
  • args,command启动的入参。
  • ports,容器需要暴露的端口号列表。

Pod对象的属性还有很多,在后续的介绍逐步了解。

四、Pod的操作

     kubectl是K8S的命令行工具(CLI),kubectl 提供了大量的命令,方便管理 Kubernetes 集群中的各种功能,下面我们使用kubectl操作Pod。

1、Pod的创建

使用kubectl apply -f <pod file>指令完成上述Pod的创建。

[root@k8s-master yaml]# kubectl apply -f busybox-pod.yaml 
pod/busybox-pod created

      注意:使用kubectl create也可以创建Pod对象,create是命令式的,而apply是声明式的,其创建逻辑是,不存在则创建,存在则比较差异,进行更新,一般推荐apply。

2、Pod的查看

pod创建完成后,可以使用kubectl get pod 指令查看所有pod的运行情况。

[root@k8s-master yaml]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
busybox-pod   1/1     Running   0          31m

 pod的name为我们定义的busybox,状态status为Running。也可以加上"-o wide"看出更多的信息

[root@k8s-master yaml]# kubectl get pod -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
busybox-pod   1/1     Running   0          41m   10.244.36.75   k8s-node1   <none>           <none>

该Pod运行在k8s-node1节点上,其ip为10.244.36.75。

通过 kubectl describe pod <podname>可以查看具体某个pod的详情

[root@k8s-master yaml]# kubectl describe pod busybox-pod
Name:         busybox-pod
Namespace:    default
Priority:     0
Node:         k8s-node1/10.0.0.4
Start Time:   Sun, 13 Nov 2022 21:43:20 +0800
Labels:       app=bash
Annotations:  cni.projectcalico.org/containerID: 30d0f991395befa857f6c2814f625f66e008c308564941285c7cd434a5a3ab18
              cni.projectcalico.org/podIP: 10.244.36.68/32
              cni.projectcalico.org/podIPs: 10.244.36.68/32
Status:       Running
IP:           10.244.36.75
IPs:
  IP:  10.244.36.75
Containers:
  busybox:
    Container ID:  docker://8b28fddf7104e31279f9dc1773630ee5cf4aef2a1d8311abe9dd0224ac2e0567
    Image:         busybox
    Image ID:      docker-pullable://busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      sleep 3000
    Args:
      $(type), $(log)
    State:          Running
      Started:      Sun, 13 Nov 2022 22:33:54 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 13 Nov 2022 21:43:37 +0800
      Finished:     Sun, 13 Nov 2022 22:33:37 +0800
    Ready:          True
    Restart Count:  1
    Environment:
      type:  prod
      log:   debug
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-d5mwc (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-d5mwc:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age                  From               Message
  ----    ------     ----                 ----               -------
  Normal  Scheduled  58m                  default-scheduler  Successfully assigned default/busybox-pod to k8s-node1
  Normal  Pulled     58m                  kubelet            Successfully pulled image "busybox" in 16.819473827s
  Normal  Pulling    8m35s (x2 over 58m)  kubelet            Pulling image "busybox"
  Normal  Created    8m19s (x2 over 58m)  kubelet            Created container busybox
  Normal  Started    8m19s (x2 over 58m)  kubelet            Started container busybox
  Normal  Pulled     8m19s                kubelet            Successfully pulled image "busybox" in 15.486748688s

     详情中包括了pod的信息,container信息,以及events事件信息。特别说明的是,如果pod启动不成功,可以从event事件查看过程。

使用kubectl logs <podname>指令查看Pod的日志

[root@k8s-master yaml]# kubectl logs busybox-pod

3、进入Pod

Pod运行期间,可以通过命令kubectl exec -it <podname> sh进入到Pod内部,执行相关命令。

[root@k8s-master ~]# kubectl exec -it busybox-pod sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr D2:2C:E7:0F:4B:48  
          inet addr:10.244.36.75  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1480  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:446 (446.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

进入pod的环境后,执行ifconfig看下ip信息,该pod的ip与上面详情中显示的一致。

也可以使用kubectl exec -it <podname> -c <containername> sh进入到某个容器内部

[root@k8s-master ~]# kubectl exec -it busybox-pod -c busybox sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr D2:2C:E7:0F:4B:48  
          inet addr:10.244.36.75  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1480  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:446 (446.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

执行ifconfig后看到到容器的ip和pod的ip是一致的。这个也就是我们后续要讲的pod里所有的容器网络是共享的。

4、Pod的删除

使用kubectl delete pod <podname>命令删除一个pod

[root@k8s-master ~]# kubectl delete pod busybox-pod
pod "busybox-pod" deleted
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.

在查询列表为空,表示该pod已经删除

五、总结

        Pod是K8S最核心的概念,引入Pod的目的是为了解决存在亲和性和互斥性复杂关系服务的调度和编排问题。

       Pod采用YAML声明式的对象描述,主要包括apiVersion,kind,metadata,spec四部分,其中spec中申明该Pod容器列表。

  采用kubectl命令行工具,演示了对于Pod的创建,查看,修改,删除等基本操作。

 附:

K8S初级入门系列之一-概述

K8S初级入门系列之二-集群搭建

K8S初级入门系列之三-Pod的基本概念和操作

K8S初级入门系列之四-Namespace/ConfigMap/Secret

K8S初级入门系列之五-Pod的高级特性

K8S初级入门系列之六-控制器(RC/RS/Deployment)

K8S初级入门系列之七-控制器(Job/CronJob/Daemonset)

K8S初级入门系列之八-网络

K8S初级入门系列之九-共享存储

K8S初级入门系列之十-控制器(StatefulSet)

K8S初级入门系列之十一-安全

K8S初级入门系列之十二-计算资源管理文章来源地址https://www.toymoban.com/news/detail-607888.html

到了这里,关于K8S初级入门系列之三-Pod的基本概念和操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S初级入门系列之九-共享存储

         Pod里面的容器都有自己独立的文件系统,来自容器镜像,用于保存容器运行的数据,但容器的文件存储有两个弊端,一个是无法持久化,其生命周期与容器一致,一旦容器销毁,相关的数据也就随之一起销毁;二是无法共享,Pod里多个容器之间无法共享数据,会导致无

    2024年02月03日
    浏览(15)
  • K8S初级入门系列之十一-安全

        安全是K8S重要的特性,在K8S初级入门系列之四-Namespace/ConfigMap/Secret章节,我们已经已经了解了Namespace,Secret与安全相关的知识。本篇将梳理K8S在安全方面的策略。主要包括两个方面,API安全访问策略以及Pod安全策略。 在介绍安全前,我们先了解下用户和用户组的概念。

    2024年02月16日
    浏览(17)
  • K8S初级入门系列之四-Namespace/ConfigMap/Secret

         本章节我们继续学习Namespace、ConfigMap、Secret基础概念,了解他们基本用法和操作。NameSpace为命名空间,在同一集群中试下资源隔离。ConfigMap通过key-value的方式实现明文配置数据的保存,Secret与ConfigMap类似,不过是采用密文方式保存。      K8S集群可以通过Namespace创建多

    2024年02月15日
    浏览(17)
  • K8S基本概念+pod生命周期+容器重启策略+Init容器和边车容器+pod探针+postStart和preStop

    Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。 kube-APIServer:集群的控制中枢,各个模块之间信息交互都需要经过Kube-APIServer,同时它也是集群管理、资

    2024年04月15日
    浏览(16)
  • k8s概念-深入pod

    回到目录  工作负载(workload)是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成,在kubernetes中都可以使用pod来运行它 workloads分为pod与controllers pod通过控制器实现应用的运行,如何伸缩,升级等 controllers 在集群中管理pod pod与控制

    2024年02月14日
    浏览(14)
  • 【K8S】pod 基础概念讲解

    Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和

    2024年02月13日
    浏览(15)
  • 深入掌握k8s核心概念--Pod(一)

    激动人心的时刻到了,终于到核心概念这一步了,前面的知识是有点“干燥了”。不急后面会看见代码,可以多像金山打字一样打一打代码,熟悉一下yaml格式 Pod 在架构中的位置 Pod 位于 Kubernetes 架构的核心中,是构建应用的最小单元。Pod 可以用来运行各种类型的应用,包括

    2024年04月17日
    浏览(14)
  • kubernetes(k8s) pod(资源限制、基础概念)

    目录  一、资源限制 1、概念 1.2、Pod和容器的资源请求和限制 1.3、CPU资源单位 1.4、内存资源单位 1.5、CPU和内存的Requests和Limits的特点 1.6、案例 二、pod 的两种使用方式 三、pod 资源共享 四、底层容器Pause 1、pause 共享资源 1.1、网络 1.2、存储 1.3、小结 2、Pause主要功能 3、Pod

    2024年02月05日
    浏览(28)
  • 【K8S系列】Pod详解

    目录 序言 1 前言 2 为什么需要pod 3 什么是Pod? 3.1 Pod的组成 3.2 Pod的用途 3.3 Pod的生命周期 3.4 Pod的特点 4 Pod的使用 5 结论  任何一件事情,只要坚持六个月以上,你都可以看到质的飞跃。 今天学习一下K8s-Pod相关内容,希望此文,能帮助读者对K8s-pod有一个进一步的了解 文章标

    2024年02月01日
    浏览(14)
  • 【Kubernetes】 从基础认识 k8s核心pod相关概念

    提示:此篇帮助朋友们,养成从0到1不断延伸知识的一种方法 最简单的创建pod入手 访问官方文档,直接使用案例,进行修改即可! 官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/ 删除不需要的部分,根据规则添加需要的参数即可得到需要的,代码如

    2024年01月25日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包