一、nameSpace介绍
namespace的中文名称是命名空间。 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 可以为你提供组织,安全甚至性能方面的帮助!
namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。
大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是4个:
1,default:你的资源默认被创建于default命名空间---Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。
2,kube-system:kubernetes系统组件使用----该名字空间用于 Kubernetes 系统创建的对象。
3,kube-node-lease: kubernetes集群节点租约状态,v1.13加入----该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。
4,kube-public:公共资源使用,但实际上现在并不常用-----所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。
这个默认(default)的namespace并没什么特别,但你不能删除它。这很适合刚刚开始使用kubernetes和一些小的产品系统。但不建议应用于大型生产系统。因为,这种复杂系统中,团队会非常容易意外地或者无意识地重写或者中断其他服务service。相反,请创建多个命名空间来把你的service(服务)分割成更容易管理的块。
作用:多租户情况下,实现资源隔离:属于逻辑隔离;属于管理边界;不属于网络边界;可以针对每个namespace做资源配额。
命名空间的作用
命名空间主要有两个方面的作用:  k8s命名空间主要用于隔离集群资源、隔离容器等,为集群提供了一种虚拟隔离的策略;
资源隔离:可为不同的团队/用户(或项目)提供虚拟的集群空间,共享同一个Kubernetes集群的资源。比如可以为团队A创建一个Namespace ns-a,团队A的项目都部署运行在 ns-a 中,团队B创建另一个Namespace ns-b,其项目都部署运行在 ns-b 中,或者为开发、测试、生产环境创建不同的Namespace,以做到彼此之间相互隔离,互不影响。我们可以使用 ResourceQuota 与 Resource LimitRange 来指定与限制 各个namesapce的资源分配与使用
权限控制:可以指定某个namespace哪些用户可以访问,哪些用户不能访问
在 Kubernetes 中,“名字空间(Namespace)”提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字空间的对象,例如 Deployment、Service 等,对于类似持久化存储的对象如StorageClass、Node、PersistentVolume 等则不适用名字空间
名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名称空间提供的功能时,请开始使用它们。
不必使用多个名字空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: 应该使用标签 来区分同一名字空间中的不同资源。
命名空间命名规则:
当你创建一个服务 时, Kubernetes 会创建一个相应的 DNS 条目。
该条目的形式是 <服务名称>.<名字空间名称>.svc.cluster.local,
为了能正确解析dns,因此,名字空间的命名必须符合规定,具体如下:
* 最多 63 个字符
* 只能包含小写字母、数字,以及 ‘-’
* 须以字母数字开头
* 须以字母数字结尾

1.1 查看命名空间

#查看命名空间全拼
[root@k8s-master ~]# kubectl get namespaces
#查看命名空间简写
[root@k8s-master ~]# kubectl get ns
查看命名空间下面的pod:
[root@k8s-master ~]# kubectl get pod --all-namespaces
[root@k8s-master ~]# kubectl get pod -A
默认的命名空间有如下:
default 用户创建的pod默认在此命名空间
kube-public 所有用户均可以访问,包括未认证用户
kube-node-lease kubernetes集群节点租约状态,v1.13加入
kube-system kubernetes集群在使用

查看命名空间详情:

[root@k8s-master ~]# kubectl describe namespace kube-system
Name:         kube-system
Labels:       <none>
Annotations:  <none>
Status:       Active
No resource quota.
No LimitRange resource.

1.2 创建命名空间

[root@k8s-master ~]# kubectl create namespace dream21th-one
namespace/dream21th-one created
[root@k8s-master ~]# kubectl create ns dream21th-two
namespace/dream21th-two created
[root@k8s-master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   118d
dream21th-one     Active   49s
dream21th-two     Active   30s
kube-node-lease   Active   118d
kube-public       Active   118d
kube-system       Active   118d

1.3 删除命名空间

[root@k8s-master ~]# kubectl delete namespace dream21th-one
namespace "dream21th-one" deleted
[root@k8s-master ~]# kubectl delete ns dream21th-two
namespace "dream21th-two" deleted
[root@k8s-master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   118d
kube-node-lease   Active   118d
kube-public       Active   118d
kube-system       Active   118d
1.4 查看某个命名空间下的pod
[root@k8s-master ~]# kubectl get ns
NAME                          STATUS   AGE
cattle-fleet-system           Active   16d
cattle-impersonation-system   Active   16d
cattle-system                 Active   17d
default                       Active   17d
kube-node-lease               Active   17d
kube-public                   Active   17d
kube-system                   Active   17d
local                         Active   16d
[root@k8s-master ~]# kubectl get nodes  -n default
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   17d   v1.23.1
k8s-node1    Ready    <none>                 17d   v1.23.1
k8s-node2    Ready    <none>                 17d   v1.23.1
k8s-node3    Ready    <none>                 17d   v1.23.1
1.5跨namespace通信
命名空间彼此是透明的。但它们并不是绝对相互隔绝。一个namespace中service可以和另一个namespace中的service通信。这非常有用,比如你团队的一个service要和另外一个团队的service通信,而你们的service都在各自的namespace中。 我们通常会把mysql,redis,rabbitmq,mongodb这些公用组件放在一个namespace里,或者每个公用组件都有自己的namespace,而你的业务组件会统一放在自己的namespace里,这时就涉及到了跨namespace的数据通讯问题。 当你的应用app要访问Kubernetes的service,你可以使用内置的DNS服务发现并把你的app指到Service的名称。然而,你可以在多个namespace中创建同名的service。解决这个问题,就用到 DNS地址的扩展形式。 在Kubernetes中,Service通过一个DNS模式来暴露endpoint。这个模式类似:  <Service Name>.<Namespace Name>.svc.cluster.local 一般情况下,你只需要service的名称,DNS会自动解析到它的全地址。然而,如果你要访问其他namespace中的service,那么你就需要同时使用service名称和namespace名称。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐