使用Kubernetes对象3---名称空间(Namespaces)
Kubernetes支持由同一物理集群支持的多个虚拟集群。这些虚拟机群被称作名称空间(Namespaces)。
何时使用多个名称空间
名称空间为拥有多个团队或多个项目的用户的环境所准备。对于只有数十个用户的集群,你不需要创建和考虑名称空间。在需要名称空间的功能时才使用它。
名称空间提供名称的作用域。资源的名称在一个名称空间里必须是唯一的,但在多个名称空间之间不用。
名称空间是在众多用户中分配资源的一种方法(通过资源指标resource quota)。
在未来的Kubernetes版本中,同一名称空间内的对象将会默认拥有相同的访问控制策略。
仅仅区分由微小不同的资源的话没有必要使用多个名称空间,比如相同软件的多个版本:使用labels来区分在同一个名称空间内的资源。
使用名称空间
名称空间的创建和删除在 名称空间管理指导文档(Admin Guide documentation for namespaces)中介绍。
查看名称空间
你可以在集群中通过下面的方式列举当前的名称空间:
ubectl get namespaces
NAME STATUS AGE
default Active 1d
kube-system Active 1d
kube-public Active 1d
Kubernetes启动时自带三个最初的名称空间:
- default 为没有其他名称空间的对象默认分配的名称空间
- kube-system 针对由Kubernetes系统创建的对象的名称空间
- kube-public 此名称空间自动创建并且对所有用户可读(包括未登陆的用户)。此名称空间通常为集群使用而保留,以防某些资源需要在整个集群对于所有用户都是可见可读的。此名称空间的公开性只是一个约定而不是必须的。
为请求设置名称空间
临时为请求设置名称空间,使用--namespace标记。
例如:
kubectl --namespace=<insert-namespace-name-here> run nginx --image=nginx
kubectl --namespace=<insert-namespace-name-here> get pods
设置名称空间偏好
你可以永久保存名称空间,以适用于当前环境下的所有后续kubectl命令。
kubectl config set-context $(kubectl config current-context) --namespace=<insert-namespace-name-here>
# Validate it
kubectl config view | grep namespace:
名称空间和DNS
当你创建一个服务(Service),会创建一个对应的DNS实体(DNS entry)。该实体的格式是<service-name>.<namespace-name>.svc.cluster.local, 这意味着如果容器仅仅适用<service-name>, 它会指向本地名称空间的服务。这对使用多个名称空间中的相同配置(如Development, Staging和Production)是有帮助的。如果你想要跨名称空间访问,你需要使用完整合格的域名(FQDN)。
不是所有对象都存在名称空间中
大部分Kubernetes资源(如 pods, services, replication controllers等等)都存在于名称空间中。但名称空间资源本身并不存在于名称空间中。并且低层次的资源,如nodes和persistentVolumes不在任何名称空间中。
可以用下面的方式查看哪些Kubernetes资源不在名称空间中:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false