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 命令。

进阶 

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值