Day06-Kubernetes 那些事-Pod 篇

前言

上一篇文章讲完 K8s 的观念後相信大家都稍微了解 K8s 在做什麽事情了吧XD

今天这篇文章要趁胜追击开始正式进入 K8s 的内容介绍了,首先要来介绍的是 Pod

什麽是 Pod?

Pod 其实是 K8s 中可以运行的最小单位,单位只是个名称,重点是这个单位是用来做什麽事情,举例来说:公分,公分是一个单位而他是长度单位,重点在长度这两个字所以我们才知道公分是用来表示长度的,Pod 也是一样的道理,今天我们在 Pod 里面运行一个前端的内容,那我们就知道这个 Pod 是用来代表前端的。

这时候可能会有一个疑惑要如何在 Pod 里面运行应用程序的相关内容呢?这时候就要依赖 Docker 了,所以我说 K8s 是加强版的 Docker Swarm 完全无误?

Pod 基础观念

我们都知道 Docker 是依照使用者写好的 Dockerfile 建构出一个 Docker image 出来,并藉由这个 image 跑出 container,所以真正运行的是 container,接下来就让我们把这个观念带进去 K8s 里面吧!

前面提到 Pod 是 K8s 可以运行的最小单位,所以我们今天想让一个 container 能在 K8s 里面跑起来势必就需要一个 Pod ,当然我前面提到 Pod 只是一个运行单位而已,今天想在里面运行什麽完全是使用者自行定义,所以我也可以在 Pod 里面运行超多个 container 都没有问题,但这样就会有一个问题很难控管里面的内容,一样举个例子:今天讲了公分,结果这个公分既是长度单位也是重量单位,假如我今天说 10 公分就很难知道到底指的是长度还是重量对吧!

官方文件有讲到这句话: Pods that run multiple containers that need to work together. 一般来说应该很少会写出具有依赖性的专案才对,所以笔者还是建议一个 Pod 里面一个 container 就好喽!

Pod 重点观念

讲完了基础观念後接下来讲一些重点观念吧!

  • image 的获取方式

    前面提到 Pod 其实也是基於 Docker image 而跑出可运行的 container ,那这个 image 哪来呢?其实 K8s 预设会从 DockerHub 上抓下来,当然比较暴力的作法就是自己在 DockerHub 上面创一个帐号把写好的 Dockerfile 都丢上去,但这样真的太搞刚所以可以加上 imagePullPolicy: ifNotPresent 的方式,这样就会先从本地端抓取 image 了,至於完整写法的部分等等会提到。

  • port 开放

    通常我们在运行 container 的时候一定会开启 port 好让外部可以顺利连进去,在 K8s 也是一样的道理,所以我们在撰写 Pod 的描述档的时候一定要记得开放 port 让外部可以连进去喔!

  • ClusterIP

    每个 Pod 在被建立的时候都会有一组自己的 ClusterIP ,这组 ClusterIP 只有在该 Cluster 内才能被存取的,外部是无法存取的,假如要存取该 Pod 的内容就必须要依靠一些手段,这些手段待後续的文章会有详细的介绍,这里读者稍微有个印象就好。

Pod 写法

首先 K8s 就像 Docker Compose 一样,必须要用 YAML 的格式进行撰写,在开始介绍各个属性之前我们来看个简单的范例吧!

apiVersion: v1
kind: Pod
metadata:
  name: helloworld
spec:
  containers:
    - name: helloworld
      image: w5151381guy/helloworld
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080
  • apiVersion

    目前 K8s 中该元件的版本号,必须要依照 server 上 K8s 的版本来进行设定,由於现在 K8s 基本上都是安装 1.9 以上,所以 apiVersion 就直接写上 v1 就好。

  • kind

    用来决定此设定档的类型,假如今天要创立一个 Pod ,我们写法就会是 kind: Pod

  • metadata

    用来摆放描述性资料的地方,像是 Pod 名称等等都会摆在这。

  • spec

    用来描述物件被生成的细节,像 Pod 内其实是跑 Docker container ,所以在 Pod 的 spec 内就会描述 container 的细节。

建立 Pod

了解完 Pod 的相关设定後接下来就试着建立刚刚写好的 Pod 描述档吧~

这边就需要利用上一篇文章提到的 kubectl 了,在终端机下 kubectl apply -f fileName.yaml 即可建立 fileName.yaml 内描述的资讯,这边有一个 -f 的参数,其实 -f 代表的就是 file 的意思,所以我们在建立所有的 K8s 物件其实都是从 yaml 档来的喔!

为了确定好 Pod 是不是真的有被建立起来,这时候就可以下 kubectl get pods 查看所有建立好的 Pod。

当然如果想知道这个 Pod 被建立到哪个机器上也可以下 kubectl get pods -o=wide 这样就会秀出这个 Pod 相关建立资讯。

这边读者应该都会觉得资讯好像显示太少了,其实 kubectl 也是有可以显示该 Pod 全部资讯的功能,只要下 kubectl describe pod PodName 即可,describe 这个参数就是描述的意思,所以那句指令的意思就是我要描述一个叫 PodName 的 Pod。

还记得笔者一直提到 Pod 只是个单位,重点是里面执行的 container 吗?为了确保该 Pod 内的 container 是真的有在运行的,这时候就可以利用 exec 这个参数,这时候只要下 kubectl exec -ti PodName -- /bin/sh 即可。

进到 container 下指令看起来都有完美的运行,连 Hello World 都有顺利的显示出来,果然 Hello World 是学习程序基础的好夥伴呢XD

小结

今天介绍了 Pod 的相关观念以及写法,在本次的系列文中,笔者会慢慢从最下层往上推进,这样才能方便读者们更快上手 K8s 的相关操作。

如果对於文章有任何问题都欢迎留言跟我说,下一篇文章会提 Labels,我们就下篇文章见吧~


<<:  【Day10】[资料结构]-杂凑表Hash Table-实作

>>:  【Day 07】 在 AWS 中打造出 Data Lake 以及 Data Warehouse

Day9 自订开机执行的程序码 - 函数宣告与语法糖

前面几天,我探索了 Lua 的变数型别、条件判断、回圈、标准函式库等 在这过程中,我已经多少看过函数...

DAY18 搞样式--CSS Gird 是什麽?

前言 因为这次排班小工具作品需要用到月历呈现方式,经过了小小思考觉得...好像用 CSS Gird ...

DAY18 - 档案处理 - 上传档案前需要知道的FormData

从前端传输档案到後端可以透过两种形式: base64的格式 (ios, android不支援) Fo...

Day 22 : 案例分享(7.1) 库存与制造 - 库存移动(调拨)流程

案例说明及适用场景 库存是odoo中很特别的功能或流程 单纯以功能的思考核心有二个,复式库存及推拉规...

【从零开始的 C 语言笔记】第六篇-变数

不怎麽重要的前言 上一篇我们介绍了资料型态,大家有没有好好记下来呢,今天的内容会结合上次所学喔! 我...