K8s集群:命名空间(Namespace)
一、k8s - namespace 介绍
命名空间
namespace
用于资源隔离,不同环境下的资源可以放置到同一个集群下不同的 namespace
下,如 dev、rc、demo
环境分别使用不同的 namespace
。也可用不同的 namespace
区分客户。
命名空间用途
名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名称空间提供的功能时,请开始使用它们。
名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 名字空间不能相互嵌套,每个
Kubernetes
资源只能在一个名字空间中。名字空间是在多个用户之间划分集群资源的一种方法。
namespace
还可以对namespace
进行资源限制,如最多允许使用cpu
、内存
、创建多少个pod
等。不必使用多个名字空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: 应该使用
标签
来区分同一名字空间中的不同资源。
大多数的 K8s 集群中,默认会有几个 默认的 namespace。
1 | root@jenkins:~# kubectl get ns |
default:你的service和app默认被创建于此。
kube-system:kubernetes系统组件使用。
kube-public:公共资源使用。但实际上现在并不常用。
kube-node-lease:此命名空间用于与各个节点相关的租期(Lease)对象;此对象的设计使得集群规模很大时节点心跳检测性能得到提升。
二、 namespace 管理
创建 namespace
注意:创建命名空间时,应避免使用 kube-作为前缀。因为它是为 Kubernetes 系统名字空间保留的。
- 命令式
kubectl create namespace datarc
- yaml 式
1 | # cat my-datarc.yaml |
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
1 | # cat pod.yaml |
kubectl apply -f pod.yaml –namespace=datarc
yaml 文件 指定资源的 namespace
1 | # cat pod-datarc.yaml |
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 通信
命名空间彼此之间是互不通信的。但它们并不是绝对的相互隔绝。一个 namespace
中 service
可以和另一个 namespace
中的 service
通信。这在项目共享中非常有用,比如你项目的一个 service
要和另外一个项目的 service
通信,而你们的 service
都在各自的 namespace
中。
当你的节点要访问 Kubernetes
的 service
,你可以使用内置的 DNS
服务发现并把你的 节点
指到 Service
的名称。你可以在多个 namespace
中创建同名的 service
。解决这个问题,就用到 DNS
地址的扩展形式。
在 Kubernetes
中,Service
通过一个 DNS
模式来暴露 endpoint
。这个模式类似:
1 | <Service Name>.<Namespace Name>.svc.cluster.local |
一般情况下,你只需要service的名称,DNS会自动解析到它的全地址。然而,如果你要访问其他namespace中的service,那么你就需要同时使用service名称和namespace名称。例如,你想访问test中的“database”服务,你可以使用下面的地址:
database.test
六、建议约束
- 在同一个命名空间中,资源名称须保持唯一。但在不同命名空间中,可以存在相同名称的资源。
- 每一个资源只能隶属于一个命名空间。
- 但命名空间本身不能属于另一个命名空间。