管理名称空间资源

名称空间(namespace)是K8S集群级别的资源,用于将集群分隔为多个隔离的逻辑分区以配置给不同的用户,租户,环境和项目使用,例如,可以为deveploment、qa和production应用环境分别创建各自的名称空间 K8S的绝大多数资源都隶属于名称空间级别(另一个是全局级别或集群级别),名称空间资源为这类的资源名称提供了隔离的作用域,同一名称空间内的同一类型资源名必须是唯一的,但跨名称空间时并无此限制。不过,K8S还是有一些资源隶属于集群级别的,如node、namespace、和persistenVolume,他们不属于任何名称空间,因此资源对象的名称必须全局唯一 注意:k8s的名称空间资源不同于Linux系统的名称空间,它们是各自独立的概念。另外,K8S名称空间并不能够Pod的通信隔离,它仅用于限制资源对象名称的作用域

查看名称空间及其资源对象

k8s集群默认提供了几个名称空间用于特定目的,例如,kube-system主要用于运行系统级资源,而default则为那些未指定名称空间的资源操作提供一个默认值,前面我们创建的deployment和Pod类型的资源对象都属于default名称空间,因为我们在创建时并未明确指定该资源对象属于哪一个名称空间,所以默认都会被分到default名称空间

  1. [root@k8s-master01 nginx]# kubectl get namespace
  2. NAME STATUS AGE
  3. default Active 7d2h
  4. dev Active 175m
  5. kube-node-lease Active 7d2h
  6. kube-public Active 7d2h
  7. kube-system Active 7d2h
  8. [root@k8s-master01 nginx]#

也可以使用describe查看特定名称空间的详细信息

  1. [root@k8s-master01 nginx]# kubectl describe ns default
  2. Name: default
  3. Labels: <none>
  4. Annotations: <none>
  5. Status: Active
  6. No resource quota.
  7. No resource limits.
  8. [root@k8s-master01 nginx]#

kubectl的资源查看命令在多数情况下应该针对特定的名称来进行,为其使用”-n”或者”—namespace”选项即可,例如,查看kube-system的所有Pod资源

  1. [root@k8s-master01 nginx]# kubectl get pods -n kube-system
  2. NAME READY STATUS RESTARTS AGE
  3. coredns-59c6ddbf5d-xj95n 1/1 Running 1 6d16h
  4. [root@k8s-master01 nginx]# kubectl get pods
  5. NAME READY STATUS RESTARTS AGE
  6. busybox 1/1 Running 4 6d16h
  7. my-nginx-854bbd7557-44wpn 1/1 Running 1 6d16h
  8. my-nginx-854bbd7557-7xnxz 1/1 Running 1 6d16h
  9. my-nginx-854bbd7557-cmtzp 1/1 Running 1 6d16h
  10. my-nginx-854bbd7557-fcpmp 1/1 Running 0 87m
  11. my-nginx-854bbd7557-gz8tr 1/1 Running 0 87m
  12. my-nginx-854bbd7557-jhmkd 1/1 Running 1 6d16h
  13. my-nginx-854bbd7557-l9rgd 1/1 Running 1 6d16h
  14. my-nginx-854bbd7557-lv87f 1/1 Running 0 88m
  15. my-nginx-854bbd7557-m67c6 1/1 Running 0 87m
  16. my-nginx-854bbd7557-whrfc 1/1 Running 0 87m
  17. [root@k8s-master01 nginx]#

命令结果显示出kube-system于default名称空间的Pod资源对象并不相同,这正是namespace资源的名称隔离功能。如果不加”-n”选项则默认显示的是default名称空间的Pod资源了。有了namespace对象,用户再也不必精心安排资源名称,也不用担心误操作了其他用户的资源

管理naspace资源

namespace是K8S api的标准资源类型之一,它的配置主要有apiVersion、kind、metadata和spec等一级字段组成,之前我们有创建过一个名称dev的名称空间,使用陈述式对象配置命令create或者声明式对象配置命令apply便能配置完成

  1. [root@k8s-master01 nginx]# kubectl apply -f dev.yaml
  2. namespace/dev created
  3. [root@k8s-master01 nginx]# kubectl get ns
  4. NAME STATUS AGE
  5. default Active 7d2h
  6. dev Active 7s
  7. kube-node-lease Active 7d2h
  8. kube-public Active 7d2h
  9. kube-system Active 7d2h
  10. [root@k8s-master01 nginx]#

名称空间资源属性最少(通常只需要指定名称即可),简单起见,kubectl为其提供了一个封装的专用陈述式命令kubectl create namespace。namespace资源的名称仅能由字母、数字、连接线等字符组成。例如,使用create命令创建一个名称为qa的名称空间

  1. [root@k8s-master01 nginx]# kubectl create namespace qa
  2. namespace/qa created
  3. [root@k8s-master01 nginx]# kubectl get ns
  4. NAME STATUS AGE
  5. default Active 7d2h
  6. dev Active 2m26s
  7. kube-node-lease Active 7d2h
  8. kube-public Active 7d2h
  9. kube-system Active 7d2h
  10. qa Active 5s
  11. [root@k8s-master01 nginx]#

实践中,不建议混用不同类别的管理方式。考到声明式对象配置管理机制的强大功能,强烈推荐用户使用apply和patch等命令进行资源创建及修改一类的管理操作 使用kubectl管理资源时,如果一并提供了名称空间选项,就表示此管理操作仅针对指定名称空间进行,而删除namespace资源会级联删除其包含的所有其他资源对象

  • 结合名称空间使用的删除命令
  • kubectl delete TYPE RESOURCE -n namespace:删除指定名称空间的指定资源
  • kubectl delete TYPE —all -n namespace: 删除指定名称空间内的指定类型的所有资源
  • kubectl delete TYPE -n namespace:删除指定名称空间内的所有资源
  • kubectl delete all —all: 删除所有名称空间中的所有资源
    需要再次指出的是,namespace对象仅用于资源对象名称的隔离,它自身并不能隔绝跨名称空间的Pod通信,那是网络策略的资源的功能