k8s学习八:pod

简介: k8s学习八:pod

pod

在k8s中,最小单元就是pod了,程序运行部署在容器中,而容器必须存在于pod中

pod可以认为是容器的封装,一个pod可以存放一个或者多个容器:

root@master:/home/tioncico# kubectl get pods
NAME                             READY   STATUS    RESTARTS      AGE
go-deployment-86f769995d-frw28   1/1     Running   0             38s
nginx-7cbb8cd5d8-w9tn2           1/1     Running   4 (12d ago)   18d

查看pod详细信息

root@master:/home/tioncico# kubectl describe pod go-deployment
Name:         go-deployment-86f769995d-frw28
Namespace:    default
Priority:     0
Node:         node-1/192.168.192.10
Start Time:   Mon, 26 Sep 2022 05:56:03 +0000
Labels:       app=go
              pod-template-hash=86f769995d
Annotations:  <none>
Status:       Running
IP:           10.244.1.10
IPs:
  IP:           10.244.1.10
Controlled By:  ReplicaSet/go-deployment-86f769995d
Containers:
  go:
    Container ID:  docker://fa6cfef2511074866a6b626295314cb4b9dc275894ec7d137616d800e1a84bae
    Image:         tioncico/go:v1.0.1
    Image ID:      docker-pullable://tioncico/go@sha256:08271bc1b9ac9317c577bf2888f36c0897996f5bae1085e941dcee62a21a8776
    Port:          8080/TCP
    Host Port:     0/TCP
    Command:
      ./main
      -v
      v1.0.1
    State:          Running
      Started:      Mon, 26 Sep 2022 05:56:11 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7fcwk (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-7fcwk:
    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  8m4s   default-scheduler  Successfully assigned default/go-deployment-86f769995d-frw28 to node-1
  Normal  Pulling    8m1s   kubelet            Pulling image "tioncico/go:v1.0.1"
  Normal  Pulled     7m57s  kubelet            Successfully pulled image "tioncico/go:v1.0.1" in 4.542296147s
  Normal  Created    7m57s  kubelet            Created container go
  Normal  Started    7m56s  kubelet            Started container go
root@master:/home/tioncico#

可以看到pod有着以下几个关键信息

pod-label

pod-label的作用就是在pod中添加标识,用来对资源进行区分和选择,例如上面的 app=go

同样可以添加版本,环境,架构等等标签  version:"1.0.1"  environment:"dev"

通过label,可以对资源进行筛选,区分

root@master:/home/tioncico# kubectl get pod -l app=go
NAME                             READY   STATUS    RESTARTS   AGE
go-deployment-86f769995d-frw28   1/1     Running   0          13m
root@master:/home/tioncico#

pod-namespace

Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。

默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。

可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

查看列表

root@master:/home/tioncico# kubectl get namespace
NAME                   STATUS   AGE
default                Active   18d //默认的命名空间,没有声明的都会在默认
kube-flannel           Active   18d //k8s flannel插件
kube-node-lease        Active   18d //集群节点心跳维护
kube-public            Active   18d //k8s公共资源你,可以被所有人访问
kube-system            Active   18d //k8s系统创建的资源
kubernetes-dashboard   Active   18d //k8s dashboard 
root@master:/home/tioncico#

查看详情

root@master:/home/tioncico# kubectl  describe  ns default
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active
No resource quota.
No LimitRange resource.

创建


root@master:/home/tioncico#  kubectl create ns dev-test
namespace/dev-test created

删除

root@master:/home/tioncico# kubectl delete ns dev-test
namespace "dev-test" deleted

yaml配置

可通过  kubectl get ns default -o yaml 输出yaml格式的配置项

root@master:/home/tioncico# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2022-09-07T08:11:59Z"
  labels:
    kubernetes.io/metadata.name: default
  name: default
  resourceVersion: "205"
  uid: d1f23d3c-ed99-41e8-83b3-366e203d2384
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
root@master:/home/tioncico#

pod-controller

Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:

  • 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
  • 控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建

什么是Pod控制器

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:

  • ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
  • ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
  • Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
  • DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
  • StatefulSet:管理有状态应用

在我之前的文章中,基本是deployment控制器,然后控制replicaSet来控制pod的,其他控制器可以自行了解试试

image.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
178 25
|
6月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
201 12
|
10月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
10月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
160 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
10月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
165 1
|
10月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
132 1
|
10月前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
154 1
|
运维 Kubernetes Cloud Native
如何轻松学习 Kubernetes?
《深入浅出 Kubernetes》一书共汇集 12 篇技术文章,帮助你一次搞懂 6 个核心原理,吃透基础理论,一次学会 6 个典型问题的华丽操作!
如何轻松学习 Kubernetes?
|
运维 Kubernetes 负载均衡
如何轻松学习 Kubernetes?
本文分享阿里技术专家关于 Kubernetes 的一些观点和看法,并给出学习 Kubernetes 的方法建议 ,最后分享 Kubernetes 集群上的问题排查经验。
11536 0
如何轻松学习 Kubernetes?
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
131 9

推荐镜像

更多