Day22-Kubernetes 那些事 - Namespace

前言

今天要来介绍一个比较抽象的观念,但在 K8s 中很常拿来使用,其实笔者从一开始的文章就开始埋下 Namespace 的坑,很多套件都会用到 Namespace 的观念,像是 Ingress Controller 有一个 ingress-nginx 的 Namespace、Service 的 ExternalName 也是为了 Namespace 而有型态,所以今天的文章就来好好谈谈 Namespace 吧!

什麽是 Namespace?

Namespace 是抽象的 cluster,让我们能根据专案不同,将原本拥有实体资源的单一 cluster,划分成几个不同的 virtual cluster,我们都知道 cluster 是用来管理所有在此 cluster 下的机器,每台机器内运行的内容彼此是不能互相干扰的。

假如今天有一个情景是:有一个产品要分成开发版本跟上线版本,当然最简单的分法就是直接把 Pod 的 Label 用不同的方式贴上去,再分别建立彼此的 Service 跟 Ingress,表现上看起来合理但实际上会发现很难控管,因为全部都混杂在一起。

或许读者可能会这麽想:没有什麽事情是不能用钱解决的,如果有的话那就多加点钱,所以就直接多开几个 cluster 里面再包含其他的机器,这样就可以达到环境切割的效果,的确是可以但这样成本真的就太高了,所以 Namespace 就是为了这种情境而建立的。

有了 Namespace 後就可以把 cluster 内再进行环境切割,每个 Namespace 彼此是独立运行且不能互相干扰的,如果用 cluster 的角度去想就是一个 Namespace 代表一个 cluster,只是这个 cluster 管的不是机器而是一个执行环境。

预设所有建立的 Pod 都会摆放在 default 这个 Namespace。

Namespace 特性

  • 在同一个 cluster 中,每个 Namespace 的命名需要有独特性

    由於 Namespace 是要在 cluster 内切割执行环境,所以每个 Namespace 是不能重复命名的,不然就失去切割的效果了。

  • 当一个 Namespace 被删除时,内部的物件也会跟着被删除

    上面段落提到可以把 Namespace 想像成一个 cluster,所以可想而知当 cluster 消失了内部的物件也会跟着消失。

  • 不同 Namespace 的物件彼此无法直接存取

    由於 Namespace 切割了执行环境,因此不同 Namespace 内的物件其实是无法互相存取的,换句话说我不能用 NamespaceA 的 Service 去存取 NamespaceB 的 Pod,即便我今天 Pod 的 Label 都设定一样也是无法存取,除非用了 ExternalName 型态的 Service。

Namespace 写法

apiVersion: v1
kind: Namespace
metadata:
  name: helloworld

Namespace 的写法非常单纯,只要建立一个 kindNamespace 并把名称命名为自己想取的名称即可,所有的 Namespace 写法都一样。

Namespace 建立

这边一样用 apply 的参数建立 Namespace。

建立完後一样可以用 get 的参数查看建立好的 Namespace。

套用到 Namespace 中

建立完 Namespace 後接下来把之前所有写好的档案通通运行在刚创立好的 Namespace 中吧!由於写法都一样所以这边笔者以 Deployment 作为范例。

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: helloworld
  name: helloworld
spec:
  # 下略

可以看到就在 metadata 这边加上要运行的 Namespace 名称即可,之後再用 apply 的方式在新的 Namespace 中建立新的物件,这边读者可能会有疑惑为什麽不能用 replace 呢?原因很简单因为新的 Namespace 本身并没有这些物件,每个 Namespace 都是独立的所以才会用 apply 而不是 replace

假如像 ConfigMap 跟 Secrets 这种没有先写成一份档案的要怎麽新增呢?这边笔者要介绍一个新的参数 -n-n 代表 Namespace 所以只要在 -n 後面接上 Namespace 名称即可。

之後要查看一样可以用 get 这个参数,不过现在都转移到新的 Namespace 而不是继续使用预设的 default,所以之後的指令都必须要加上 -n 这个参数进去。

小结

今天文章介绍完 Namespace,未来如果要切割 cluster 的内部环境就可以利用 Namespace 的方式,就不用花大钱建立更多的 cluster 了,但这边笔者一个小提醒,虽然用 Namespace 切割好环境但每个 Namespace 使用的资源都是同一台机器,所以每个 Pod 的 Resource Qutoas 必须要定义好,不然就会很容易资源不够用。

如果对於文章有任何问题都欢迎留言给我,那我们就下一篇文章见喽~


<<:  [Day 22]从零开始学习 JS 的连续-30 Days---阵列操作介绍 (下篇)

>>:  Day 23:1974. Minimum Time to Type Word Using Special Typewriter

Day 20 - SwiftUI开发学习4(切换分页)

今天我们运用NavigationView去做切换视窗。 正文 建立新的页面 因为我们之前都是在主页去...

TypeScript 能手养成之旅 Day 12 泛用型别(Generics Types)

前言 今天要来介绍 泛用型别,在我们前面介绍的 型别化名 ,而 泛用型别 就是将 型别化名 参数化,...

Lisp 语言和你 SAY HELLO!!

第二十五天 各位点进来的朋友,你们好阿 小的不才只能做这个系列的文章,但还是希望分享给点进来的朋友,...

Day5 Type

Background 对於变数的Type,能够依据他们的特性分为两种,分别为不可变的Static t...

DAY27 mongo aggregate

今天要教 mongo aggregate 中文叫做聚合 是一种将来自多个document的value...