Pod(上)

参考文章:

pod内部网络实现 - 金色旭光 - 博客园

pod 特性

pod 是 k8s 的最小工作单元。

每个 pod 可以运行一个或多个容器。

k8s 管理的是 pod 而不是直接管理容器,pod 中的容器会作为一个整体被 Master 调度到一个 node 上运行。

pod 的设计理念是支持多个容器在一个 pod 中共享网络地址和文件系统,通过进程间通信和文件共享这种简单高效的方式组合完成服务。

之前看过一篇文章,可以这么理解 docker、pod 和 k8s 的关系:(如果有说错,望指正!)

docker 是进程,pod 是应用,k8s 是操作系统。  操作系统只管理应用的生命周期,并不关心进程的情况。同一个应用间的进程可以共享某些资源。

多个容器被放到同一个 pod 中的主要原因是:大多数应用都是由一个主进程和一个或多个辅助进程组成,它们之前需要共享资源。

pod 中的所有容器,共享同一个 Network Namespce,且可以声明共享同一个 Volume。

基础

创建 pod

在之前聊到过 k8s 是声明式 API,所以,pod 和其他 k8s 资源一样,大多情况下是通常YAML描述文件来创建的。

k8s 会将 yaml 文件转译成内部的 REST API,因此我们其实也可以通过 带 JSON 数据的 k8s REST API 来创建。

pod 中最基础的 yaml 描述文件:

apiversion: v1 <----表示描述文件遵循 v1 版本
kind: Pod     <----表示类型是 pod
metadata:
  name: kubia-manual     <--- pod 的名称
spec:
  containers:
  - image: luksa/kubia    <---创建容器所用的镜像
    name: kubia    <---容器的名称
    ports:
    - containerPort:8080 <--应用监听的端口
      protocal: TCP
  • apiversion: 指的是该 yaml 需要遵循的版本号, 在一些特殊情况下,不同的版本号,其 yaml 的字段是不通用的。
  • kind: 指的是 api 对象的类型(上一节聊的常见的几种 api 对象,就是填在这个位置)。
  • matedata: (上上节也说过),它是用来标识 API 对象的,每个对象都至少有 3 个元数据:namespace、name 和 uid。namespace 如果不填,默认为 default, uid 是系统生成的。
  • spec 里是该 pod 的核心内容;
    • containers: 存放的是容器的关于容器的信息。

注:

在上面 yaml 描述文件中 port.containerPort 属性,这个指定端口纯粹是展示性的,对于客户端是否可以通过端口连接到 pod 没有任何的作用。

同时如果容器将端口绑定到 0.0.0.0 的端口来接收连接,那么即使端口没有在这里 spec 中明确列出来,其他 pod 也能够连接到该端口。

在 spec 中 port.containerPort 明确端口暴露的意义:

  1. 在端口定义下,每个使用集群的人都可以快速的查看每个 pod 对外暴露的端口。
  2. 明确定义端口还可以允许用户为每个端口指定一个名称,方便用户使用。

写好 yaml 文件后,执行以下命令就可以创建 pod :

kubectl create -f xxx.yaml 

常用命令总结:

最基础的命令如下:

kubectl create -f xxx.yaml // 创建 pod
kubectl get pod xxx -o yaml  // 查看 k8s 的 pod 信息,并以 yaml 形式显示
kubectl get pod xxx -o json  // 查看 k8s 的 pod 信息,并以 json 形式显示
kubectl logs xxx // 查看 pod 日志
kubectl logs pod_name -c container_name // 如果 pod 中有多个容器,使用 -c 命令,可以查看pod_name 中某个 container_name 容器的日志

以上命令均为 查看 namespace 为 default 的 pod 信息。 如果想要查询其他 namespace 下 pod 的信息,需要加 -n 参数,例如查看 namespace 为 component 下所属的 pod :

kubectl get pod -n component

其他命令也是类似的操作。

至于 namespace 的含义,在之前也介绍过:

k8s 中的 namespace 就类似于 windows 中的多个桌面,或者 linux 中的多个终端;namespace 之间的 api 对象是不可见的。只有在同一个 namespace 中的 api 对象,才能互相可见。 (pod 间调用是另一回事。)

 稍微进阶点的命令如下:

// 进入某一 pod 中,该 pod 的 status 必须为 running 才行
kubectl -n component exec -it xxx sh
// 查看 pod 详细信息
kubectl describe pod xxx
// 查看镜像
kubectl describe pod xxx |grep Image

当我们对 pod 的 yaml 文件做了修改,想要更新 pod 或者想要删除 pod 的命令:

// 删除掉 pod
kubectl delete -f xxx.yml
// 更新或者添加 pod
kubectl apply -f  xxx.yml

apply 和 create 区别:

简单通俗一句话就是 apply 命令 包含 create 命令。

apply 命令更能体现 k8s 是声明式 api 的含义。 apply 就是说,我期望达到的一个最终状态是 xxx.yaml,如果 k8s 里没有,那就新建一个 pod,如果 k8s 里有 pod,那就把它更新到我所期望的最终状态。 apply 并不关系中间发生了什么,只关心最后的结果。

所以,推荐无脑使用 apply 命令。

进阶 

未完待续...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值