k8s基础(2)—Kubernetes-Namespace

一、Namespace概述

名字空间

在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字空间的对象, (例如 Deployment、Service 等),这种作用域对集群范围的对象 (例如 StorageClass、Node、PersistentVolume 等)不适用。

何时使用多个名字空间

名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名字空间提供的功能时,请开始使用它们。

名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 名字空间不能相互嵌套,每个 Kubernetes 资源只能在一个名字空间中。

名字空间是在多个用户之间划分集群资源的一种方法(通过资源配额)。

不必使用多个名字空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: 应该使用标签来区分同一名字空间中的不同资源。

说明:

对于生产集群,请考虑不要 使用 default 名字空间,而是创建其他名字空间来使用。

初始名字空间

Kubernetes 启动时会创建四个初始名字空间:

default

Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。

kube-node-lease

该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。

kube-public

所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。

kube-system

该名字空间用于 Kubernetes 系统创建的对象。

使用名字空间

名字空间的创建和删除在名字空间的管理指南文档描述。

说明:

避免使用前缀 kube- 创建名字空间,因为它是为 Kubernetes 系统名字空间保留的。

查看名字空间

你可以使用以下命令列出集群中现存的名字空间:

kubectl get namespace

NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d

为请求设置名字空间

要为当前请求设置名字空间,请使用 --namespace 参数。

例如:

kubectl run nginx --image=nginx --namespace=<名字空间名称>
kubectl get pods --namespace=<名字空间名称>

设置名字空间偏好

你可以永久保存名字空间,以用于对应上下文中所有后续 kubectl 命令。

kubectl config set-context --current --namespace=<名字空间名称>
# 验证
kubectl config view --minify | grep namespace:

名字空间和 DNS

当你创建一个服务时, Kubernetes 会创建一个相应的 DNS 条目

该条目的形式是 <服务名称>.<名字空间名称>.svc.cluster.local,这意味着如果容器只使用 <服务名称>,它将被解析到本地名字空间的服务。这对于跨多个名字空间(如开发、测试和生产) 使用相同的配置非常有用。如果你希望跨名字空间访问,则需要使用完全限定域名(FQDN)。

因此,所有的名字空间名称都必须是合法的 RFC 1123 DNS 标签

警告:

通过创建与公共顶级域名同名的名字空间, 这些名字空间中的服务可以拥有与公共 DNS 记录重叠的、较短的 DNS 名称。 所有名字空间中的负载在执行 DNS 查找时, 如果查找的名称没有尾部句点, 就会被重定向到这些服务上,因此呈现出比公共 DNS 更高的优先序。

为了缓解这类问题,需要将创建名字空间的权限授予可信的用户。 如果需要,你可以额外部署第三方的安全控制机制, 例如以准入 Webhook 的形式,阻止用户创建与公共 TLD 同名的名字空间。

并非所有对象都在名字空间中

大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些名字空间中。 但是名字空间资源本身并不在名字空间中。而且底层资源, 例如节点持久化卷不属于任何名字空间。

查看哪些 Kubernetes 资源在名字空间中,哪些不在名字空间中:

# 位于名字空间中的资源
kubectl api-resources --namespaced=true

# 不在名字空间中的资源
kubectl api-resources --namespaced=false

自动打标签

特性状态: Kubernetes 1.22 [stable]

Kubernetes 控制面会为所有名字空间设置一个不可变更的标签 kubernetes.io/metadata.name。 标签的值是名字空间的名称。

二、Namespace的创建和删除

2.1、使用命令行创建

bash 复制代码
#查看名称空间
kubectl get ns 

#查看全部pods信息
kubectl get pods -A

#如果是kubectl get pods 默认是查看default下的资源,可能看不到节点信息

#如果想查看某个命名空间下的的内容通过添加-n参数来实现
 kubectl get pods -n kubernetes-dashboard
 
 #创建命名空间
 kubectl create ns test
 
 #如果想要删除集群的命名空间,可以使用以下命令(只能删除自己创建的空间,其他默认的空间不能删除)
 kubectl detele ns test

2.2、使用yaml文件创建

bash 复制代码
#步骤一:创建文件
vim createNameSpace.yaml
apiVersion: v1
kind: Namespace
metdata:
  name: test
  
步骤二:运行yaml配置
kubectl apply -f createNameSpace.yaml

创建命名空间并在命名空间里创建对应的pod

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
  namespace: test      #将节点创建在命令空间test里
spec:
  containers:
  - image: nginx
    name: mynginx
相关推荐
机器学习之心5 分钟前
路径规划 | 基于极光PLO优化算法的三维路径规划Matlab程序
算法·数学建模·matlab
机器学习小小白8 分钟前
【机器学习实战】kaggle playground最新竞赛,预测贴纸数量--python源码+解析
人工智能·python·算法·机器学习·回归问题·时间变量的特征提取·分类变量特征工程
_周游14 分钟前
【C语言】_const修饰指针变量
c语言·数据结构·算法
KeyPan2 小时前
【数据结构与算法:六、图】
人工智能·算法·机器学习·计算机视觉·线性回归
呆呆的猫4 小时前
【LeetCode】803、打砖块
算法·leetcode·职场和发展
jazz_bin6 小时前
人工智能安全——大语言模型遗忘学习(LLM unlearning)与多目标优化算法
人工智能·算法·语言模型·unlearning·多目标优化·人工智能安全
生信碱移7 小时前
使用大语言模型的生物嵌入,后续应该会有很多类似文章出来!
人工智能·算法·语言模型·自然语言处理·chatgpt·数据分析
高 朗8 小时前
【算法刷题】链表
数据结构·算法·链表
2401_858286119 小时前
L27.【LeetCode笔记】2 的幂(五种解法)
c语言·开发语言·笔记·算法·leetcode
chenziang19 小时前
leetcode hot 100 不同路径
算法·leetcode·职场和发展