前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云原生|什么是Kubernetes最小单元POD?(1)

云原生|什么是Kubernetes最小单元POD?(1)

作者头像
琉璃康康
发布2023-11-23 15:23:10
1930
发布2023-11-23 15:23:10
举报
文章被收录于专栏:七禾页话

@七禾页话

学习永无止境,记录相伴相随! —— 琉璃康康

前一篇云原生|关于K8s中Ingress和Egress流量的那些事儿是一个方案,针对Ingress流量响应的方案,里边涉及到了Linux的知识点和Kubernetes的知识点。

所以打算没事儿也聊聊自己对Kubernetes一些概念的了解,正好就当自己的笔记了。

一切都有从一个豆荚开始说起,豆角(豆荚)是藤蔓上成熟的果实,如果它破裂了,豆子就洒满一地,没有了跟滕蔓衔接的桥梁了,所以豆荚是藤蔓上最小的果实单元。

POD的中文含义就是豆荚,非常形象,如同豆角之于藤蔓一样,POD也是Kubernetes这个藤蔓上的最小单元,而将POD剥开看到的是一个个Container(容器)就如同剥开豆荚看到的一颗颗豆子。

要了解POD,那就需要先了解下容器。容器是一个独立的环境,其中打包了应用程序以及其依赖环境。每个容器都有一个IP地址,它可以申请外部存储并且调用CPU和Memory系统资源等。

Kubernetes是一个通过自己的运行方式部署、扩展和管理容器化应用的编排系统,这个运行方式就是POD,所以POD是Kubernetes中的最小单元,一个POD可以包含一个或者多个容器,所以可以将POD看做是一个容纳了一个或者多个容器的盒子,但是这个盒子里至少有一个容器,不能为空。

POD的概念是抽象的,它将一个或者多个容器作为一个单元进行管理,POD所提供的功能完全看它里边的容器,所以可以说POD是一个小家庭,家庭里的各个成员是容器,各自来完成预定义的工作,然后通过家庭这个概念来融入社会这个集群。

一个POD可以从集群中获取唯一的IP,当然这个IP是动态的,当POD存在的时候,它在一个集群内部拥有唯一的IP,一旦POD消失,它所拥有的IP就被集群回收再利用了,之前说容器之间沟通也是依赖于IP,所以在Kubernetes中一个POD内部的容器使用localhost+不同端口来互相沟通,如果POD1中的容器想跟POD2中的容器通信,理论上就是两个POD之间的通信,直接使用POD的IP地址。

因此,一个POD内的容器是共享如下内容的:

  • Network Namepace(网络命名空间): 所有容器共享localhost。
  • IPC namespace(进程间通信命名空间): 所有容器共享IPC。
  • UTS Namespace(主机名和域名命名空间): 所有的容器共享一个hostname。

但是一个POD内的容器也必然要互相区分的:

  • 默认情况下,PID 命名空间 不共享,但 kubernetes 提供了选项,可使用 在 Pod 内的容器之间启用进程共享shareProcessNamespace 选项。
  • 存储不共享,每一个容器都拥有他们自己的文件系统和目录,但是是通过POD统一申请一或多个Volume。

简而言之地概括一下:

  • Pod 是 Kubernetes 中最小的可部署单元。
  • Pod 本质上是短暂的;它们可以被创建、删除和更新。
  • 一个 Pod 可以有多个容器;一个 Pod 内可以运行的容器数量没有限制。
  • 每个 Pod 都有唯一的 IP 地址。
  • Pod 使用 IP 地址相互通信。
  • Pod 内的容器使用localhost+不同的端口进行连接。
  • Pod 内运行的容器应具有不同的端口号,以避免端口冲突。
  • 可以为 Pod 内运行的每个容器设置 CPU 和内存资源。
  • Pod 内的容器共享相同的卷挂载。
  • Pod 内的所有容器都必须在同一个节点上;它不能跨越多个节点。
  • 如果有多个容器,则在 Pod 启动期间,所有主容器都会并行启动。而 pod 内的 init 容器按顺序运行。

简单了解了POD之后,那么如何定义和部署一个POD呢?

POD是Kubernetes原生的概念,需要通过yaml对其声明,然后可以直接使用kubectl来创建。

以下是创建NginxWeb服务器Pod的PodYAML的简单示例:

代码语言:javascript
复制
##左右滑动
apiVersion: v1
kind: Pod
metadata:
  name: web-server-pod
  labels:
    app: web-server
    environment: production
  annotations:
    description: This pod runs the web server
spec:
  containers:
  - name: web-server
    image: nginx:latest
    ports:
    - containerPort: 80

参数

含义

apiVersion

定义POD的api版本,不同k8s版本导致api版本不一 ,可以通过kubectl api-resources查看

kind

类型,K8s的资源类型,可以通过kubectl api-resources查看

metadata

metadata用于唯一标识和描述POD,包括POD的名字、所属的namespace、注释(annotations)以及Label(标签)等

spec

在spec下定义POD所需要状态内容,比如对Container的描述,包括了容器的名字,镜像,对外开放的端口,容器的资源等等内容

这是非常小的一个例子,一个POD的yaml下有很多可以定义的参数,对于开发者来说需要查看官方资料来定义自己产品需要的参数。

那么如何创建Pod呢?当使用yaml的时候非常简单,直接使用kubectl apply/create -f <POD的yaml文件名>即可。

当然也可以将yaml的内容放到kubectl里来创建Pod:

代码语言:javascript
复制
@@左右滑动
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod
No resources found in default namespace.
ubuntu@VM-16-3-ubuntu:~$ sudo docker image list
REPOSITORY                           TAG       IMAGE ID       CREATED        SIZE
nginx                                1.25.0    7d3c40f240e1   5 months ago   143MB
ubuntu@VM-16-3-ubuntu:~$ kubectl run web-server-pod \
  --image=nginx:1.25.0 \
  --restart=Never \
  --port=80 \
  --labels=app=web-server,environment=production \
  --annotations description="This pod runs the web server"
pod/web-server-pod created
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod
NAME             READY   STATUS              RESTARTS   AGE
web-server-pod   0/1     ContainerCreating   0          3s
ubuntu@VM-16-3-ubuntu:~$ 
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod web-server-pod -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
web-server-pod   1/1     Running   0          52s   10.42.0.111   vm-16-3-ubuntu   <none>           <none>
ubuntu@VM-16-3-ubuntu:~$ 

如果想了解已经创建的POD的详细信息,可以使用kubectl describe pod <pod name> -n <pod所在的namespace>来查看:

下图是一张由describe命令显示POD重要信息的关系图:

@七禾页话

如何删除POD呢?

如果是使用kubectl run的命令创建的POD,需要用kubectl delete pod <pod name> -n <namespace>来删除:

代码语言:javascript
复制
@@左右滑动
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
web-server-pod   1/1     Running   0          11m
ubuntu@VM-16-3-ubuntu:~$ kubectl delete pod web-server-pod
pod "web-server-pod" deleted
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod
No resources found in default namespace.
ubuntu@VM-16-3-ubuntu:~$ 

如果是使用kubectl apply/create -f <POD的yaml文件名>创建的POD,可以使用kubectl delete pod <pod name> -n <namespace>或者kubectl delete -f <POD的yaml文件名>删除。

在使用yaml创建POD的时候很难记住所有的参数,查阅官网很多时候也是大海捞针,那么怎么办呢?Kubernetes已经想到并给出了解决方案,就是使用–dry-run参数来创建yaml:

代码语言:javascript
复制
@@左右滑动
ubuntu@VM-16-3-ubuntu:~$ kubectl run nginx-pod --image=nginx:1.25.0 --dry-run=client -o yaml > nginx-pod.yaml
ubuntu@VM-16-3-ubuntu:~$ ls -l nginx-pod.yaml 
-rw-rw-r-- 1 ubuntu ubuntu 251 Nov 19 21:06 nginx-pod.yaml
ubuntu@VM-16-3-ubuntu:~$ cat nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx-pod
  name: nginx-pod
spec:
  containers:
  - image: nginx:1.25.0
    name: nginx-pod
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

以上,有想法欢迎留言来聊!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七禾页话 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档