K8S Namespace

Namespace 介绍

  K8S 中的 Namespace(命名空间)的作用是资源隔离。我们可以想象为在 K8S 集群内的虚拟机,用来讲不空命名空间的资源进行彼此隔离。当企业内部存在多个项目组时,可以通过 Namespace 来对项目组范围资源进行隔离,也可通过 Namespace 对应用相关环境如开发、测试、生产等进行隔离。

   虽然 Namespace 可以隔离资源,但是不同的 Namespace 之间的服务是可以互相访问的。这样设计的目的是,让一个 Namespace 命名空间下的团队的服务可以调用另一个 Namespace 命名空间下的服务。

   使用 Namespace 还可以提升 K8S 的可控性、安全性和灵活性。

Namespace 类型

  K8S 中的 Namespce 默认提供三个命名空间,分别为:

  • default

    当我们创建资源时,未显示的使用命名空间时默认的命名空间

  • kube-system

    k8s 集群默认资源使用的命名空间,不建议改动该命名空间相关资源

  • kube-public

    很少用的命名空间

  • custom

    泛指我们自定的命名空间

Namespace 创建

  Namespace 创建的方式有两种,分别如下:

  1. 命令行

    $ kubectl create namespace test
  2. 声明式

    # test.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
      labels:
        name: test
    $ kubectl apply -f test.yaml

Namespace 查询

  Namespace 查询的方式有两种,分别如下:

  1. 查询全部

    $ kubectl get namespace
  2. 查询个别

    $ kubectl get namespace test
  3. 查询制定资源

    $ kubectl get pod --namespace=test
    $ kubectl get svc --namespace=test
    $ kubectl get deploy --namespace=test

Namespace 使用

   我们可以在创建资源时指定资源所属 Namespace,这里有两种方式,分别如下:

  1. 命令行

    $ kubectl apply -f pod.yaml --namespace=test
  2. 声明式

    apiVersion: v1
    kind: Pod
    metadata:
      name: app
      namespace: test
      labels:
        name: app
    spac:
      containers:
      - name: nginx
        image: nginx

    注意 :建议使用声明式,因为无论资源如何改动,使用的命名空间时不会变化的。

Namespace 激活

  K8S 默认激活 default 命名空间,当我们创建资源时,未指定命名空间默认都会在 default 空间下进行资源创建。当然我们可以使用 –namespace 或 -n 进行指定命名空间的相关查询、更新等操作,但是这样还是比较麻烦的,每次执行命令都需要指定对应的命名空间。幸运的是,又一个叫做 kubens 的工具,可以简化这个工作。

  kubens 使用非常简单,只需要在终端执行 kebens 然后就会在下面列出当前系统中全部的 namespace,如果需要切换直接选择对应的 namespace 安回车即可激活选中的 namespace 为默认激活命名空间。之后的全部操作,默认都会在该 namespace 下进行。

  • 运行 kubens 查看命名空间

    # 运行 kubens 查看命名空间
    $ kubens
    default ✅
    kube-public
    kube-system
    test
  • 运行 kubens test 切换命名空间

    # 运行 kubens test 切换命名空间
    $ kubens test
    $ kubens
    default
    kube-public
    kube-system
    test ✅

Namespace 多服务

   在 K8S 中我们想要访问一个服务,只需要使用每桌的 DNS 服务发现,将应用指向服务名即可,但是当一个集群内有多个同名不通作用的服务器时,这是不行的。通过 Namespace 隔离方式 K8S 允许在不同的 Namespace 中存在相同的服务,通过使用扩展形式的 DNS 地址可以轻松解决此问题。

  K8S DNS 解析:

  • DNS 完整版:<ServiceName>.<NamespaceName>.svc.cluster.local

  • DNS 精简版:<ServiceName> 可以解析到当前命名空间下的服务。自动解析成完成版 DNS

  • DNS 命名空间版:<ServiceName>.<NamespaceName> 可以解析到指定命名空间下的服务。自动解析成完成版 DNS

    例如:访问 test 命名空间下的数据库服务 < 图 1>,访问 prod 命名空间下的数据库 < 图 2>

    图一
    图二

Namespace 选择

   无需使用 Namespace 进行隔离

  • 小团队 5-10 人

    可以使用 Namespace 进行隔离

  • 多团队

    多团队
  • 多服务

    多团队
  • 多环境

    多团队
  • 多集群

    多团队


Kubernetes     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!