跳转至

K8s集群:命名空间(Namespace)

一、k8s - namespace 介绍

命名空间

namespace 用于资源隔离,不同环境下的资源可以放置到同一个集群下不同的 namespace 下,如 dev、rc、demo 环境分别使用不同的 namespace。也可用不同的 namespace 区分客户。

命名空间用途

  • 名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名称空间提供的功能时,请开始使用它们。

  • 名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 名字空间不能相互嵌套,每个 Kubernetes 资源只能在一个名字空间中。

  • 名字空间是在多个用户之间划分集群资源的一种方法。

  • namespace 还可以对 namespace 进行资源限制,如最多允许使用 cpu内存、创建多少个 pod 等。

  • 不必使用多个名字空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: 应该使用标签来区分同一名字空间中的不同资源。

大多数的 K8s 集群中,默认会有几个 默认的 namespace。

root@jenkins:~# kubectl get ns
NAME              STATUS   AGE
default           Active   7d22h
kube-node-lease   Active   7d22h
kube-public       Active   7d22h
kube-system       Active   7d22h
  • default:你的service和app默认被创建于此。

  • kube-system:kubernetes系统组件使用。

  • kube-public:公共资源使用。但实际上现在并不常用。

  • kube-node-lease:此命名空间用于与各个节点相关的租期(Lease)对象;此对象的设计使得集群规模很大时节点心跳检测性能得到提升。

二、 namespace 管理

创建 namespace

注意:创建命名空间时,应避免使用 kube-作为前缀。因为它是为 Kubernetes 系统名字空间保留的。
  • 命令式

kubectl create namespace datarc

  • yaml 式
# cat my-datarc.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: datarc

kubectl apply -f my-datarc.yaml

查看 namespace

kubectl get ns

kubectl describe ns datarc # 查看详细信息

kubectl get pods -n datarc # 查看某个 namespace 下的资源

输出 namespace 为 json yaml 文件

kubectl get ns datarc -o <格式参数>

删除 namespace

删除namespace,其下的所有资源将全部被删除

kubectl delete namespaces datarc

三、在 namespace 创建资源

命令指定 namespace

# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx

kubectl apply -f pod.yaml --namespace=datarc

yaml 文件 指定资源的 namespace

# cat pod-datarc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: datarc
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx

kubectl apply -f pod-datarc.yaml

目前 使用命令 kubectl get pods 查看您的 pod ,您会得到:资源未找到的错误。 这是因为命令是在当前(default)命名空间中,如果要查看其他 namespace 资源,你需要指定 namespace,如下所示:

kubectl get pods --namespace=datarc

四、 管理当前已经创建的 namespace

快捷使用 namespace

默认创建的命名空间是 default 。因此,当您在其他 namespace 创建了资源,那么每次使用 kubectl 命令都要带上 namespace 将会很麻烦。正好 kubens 可以解决这个麻烦。

安装 kubens

curl -L https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubens -o /bin/kubens && chmod +x /bin/kubens

使用 kubens

  • 当您运行 kubens 命令时,会自动高亮当前的 namespace
  • 如果要切换 datarc 空间时,运行

kubens datarc

  • 这时后续执行的所有命令都会在 datarc 这个 namespace 下执行。

五、跨 namespace 通信

namespace 通信

命名空间彼此之间是互不通信的。但它们并不是绝对的相互隔绝。一个 namespaceservice 可以和另一个 namespace 中的 service 通信。这在项目共享中非常有用,比如你项目的一个 service 要和另外一个项目的 service 通信,而你们的 service 都在各自的 namespace 中。

当你的节点要访问 Kubernetesservice ,你可以使用内置的 DNS 服务发现并把你的 节点 指到 Service 的名称。你可以在多个 namespace 中创建同名的 service 。解决这个问题,就用到 DNS 地址的扩展形式。 在 Kubernetes 中,Service 通过一个 DNS 模式来暴露 endpoint 。这个模式类似:

 <Service Name>.<Namespace Name>.svc.cluster.local

一般情况下,你只需要service的名称,DNS会自动解析到它的全地址。然而,如果你要访问其他namespace中的service,那么你就需要同时使用service名称和namespace名称。例如,你想访问test中的“database”服务,你可以使用下面的地址:

database.test

六、建议约束

  • 在同一个命名空间中,资源名称须保持唯一。但在不同命名空间中,可以存在相同名称的资源。
  • 每一个资源只能隶属于一个命名空间。
  • 但命名空间本身不能属于另一个命名空间。