Kubernets命名空间
什么是命名空间
命名空间(Namespace)是一种用于组织和隔离 Kubernetes 资源的机制。
在 Kubernetes 集群中,命名空间将物理集群划分为多个逻辑部分,每个部分都拥有自己的一组资源(如 Pod、Service、ConfigMap 等),彼此之间互不干扰,实现资源的隔离管理。
不仅 Kubernetes 具备命名空间的概念,在 Docker 等容器技术中,也通过命名空间(Namespace)和 cgroups(控制组)来实现资源的分配和隔离。例如,容器可通过挂载宿主机的 cgroups 来监控自身资源的使用情况,cAdvisor 便是通过容器的 cgroups 获取相关数据。
使用 kubectl api-resources
命令可以查看 Kubernetes 资源是否支持命名空间划分。如果 NAMESPACED
列的值为 false,则该资源不受命名空间的约束。对于支持命名空间的资源,可以使用 -n <命名空间名称>
进行操作。
为什么需要命名空间
-
资源隔离
不同命名空间中的资源可以重名,但同一命名空间内资源名必须唯一,避免冲突。 -
资源分配
不同命名空间可以设定 CPU、内存、存储等资源配额,防止某个应用独占集群资源。 -
访问控制
隔离访问控制,将用户和进程限制在某些命名空间中 -
服务发现
同一命名空间内的 Service 可以直接通过名称互相访问,而跨命名空间的 Service 需要使用 <服务名>.<命名空间>.svc.cluster.local 形式进行访问。
k8s中初始命名空间
运行 kubectl get namespaces
可查看当前集群中的命名空间。Kubernetes 默认提供以下几个命名空间:
-
default
默认命名空间,未指定命名空间时,资源将自动归属于此命名空间。 -
kube-node-lease
存储节点的租约(Lease),用于 Kubernetes 监测节点的健康状态。 -
kube-public
预留给集群中的公共资源,所有用户(包括未认证用户)均可访问。 -
kube-system
由 Kubernetes 系统创建并管理的核心组件(如 kube-apiserver、kube-scheduler、etcd 等)所在的命名空间,不建议在此创建自定义资源。
创建命名空间
使用 kubectl create namespace
命令可以创建新的命名空间,例如:
kubectl create namespace dev-ns
要查看命名空间的详细信息,可以使用:
kubectl describe namespace dev-ns
创建资源时,可以指定命名空间,例如:
kubectl create deployment my-nginx --image=nginx:latest -n dev-ns
此外,还可以使用 YAML 文件创建命名空间,例如namespace.yaml
:
apiVersion: v1
kind: Namespace
metadata:name: dev-ns
然后应用该配置:
kubectl apply -f namespace.yaml
删除命名空间
如果需要删除一个命名空间,可以使用以下命令:
kubectl delete namespace dev-ns
删除命名空间后,该命名空间下的所有资源都会被一并删除,因此操作前需要谨慎。