如何使用 Kubernetes Namespace(8)
本文是Kubernetes权威指南系列的一部分,你可以点击Kubernetes权威指南查看所有教程
Kubernetes 命名空间介绍
当不同的团队、项目或客户共享同一个 Kubernetes 集群时,这时就可以使用Kubernetes Namespace 。
这通过提供:
- Namespace为名称提供了一个范围
- 一种将授权和策略附加到集群子部分的方法。
在 Kubernetes 中,当您创建服务时,会创建一个相应的 DNS 条目,其形式如下:
“<service_name>.<namespace_name>.svc.cluster.local”
如果容器只使用 <service_name>,那么它将被解析为当前命名空间的本地服务。
如果您需要访问其他命名空间中的服务,则需要使用 FQDN(完全限定域名),如“<service_name>.
<namespace_name>.svc-1.cluster-1.local”
我们需要注意的是,并非 Kubernetes 中的所有对象都需要在命名空间中,例如节点和持久卷不需要在命名空间中,因为它们是低级资源。
要获取命名空间中和不在命名空间中的资源列表,请使用以下命令:
kubectl api-resources --namespaced=true
kubectl api-resources --namespaced=false
如果您需要 Namespace 提供的任何基本功能,例如在集群中的 Namespace 中拥有资源的唯一性,那么请开始使用 Namespaces。另请注意,一个 Namespace 不能嵌套在另一个 Namespace 中,并且 Kubernetes 资源只能位于一个 Namespace 中。
如何使用 Kubernetes 命名空间?
要使用 Kubernetes 命名空间,您至少必须拥有以下内容。
- Kubernetes 集群
- 配置的 Kubectl 命令行工具
- 对 Kubernetes Pod、容器、服务和部署有基本的了解。
首先,我们看到默认的命名空间。它由 Kubernetes 系统提供给所有没有任何其他命名空间的对象,例如集群使用的默认 Pod、部署和服务集。创建多个命名空间并将它们有效地用于您的服务来管理您的对象集合。
另请注意,Kubernetes 最初至少从三个命名空间开始。根据您的环境,这些可能更多。
- default:对于没有其他命名空间的对象。
- kube-system:对于那些由系统创建的对象。
- kube-public:所有用户都可以使用并自动创建。此命名空间主要保留供集群使用。
命名空间具有以下功能,我们可以使用它们。
- 在同一个 Namespace 内,Pod 到 Pod 通信。
- 命名空间是位于物理集群之上的虚拟集群。
- 命名空间提供了环境之间的逻辑分离。
- 命名空间只是相互隐藏,而不是完全相互隔离。
- 如果目标和源使用全名(包括服务/对象名称后跟命名空间),则命名空间中的一个服务可以与另一个命名空间中的另一个服务通信。
但是,如果我们使用唯一的服务名称并且 DNS 在内部识别它,则在相同的命名空间中解析它。
Kubernetes 命名空间示例
下面给出了示例:
很少有操作可用于控制命名空间。
示例 #1:创建
您可以根据需要创建任意数量的命名空间。因为没有性能损失。但有时当您在命名空间中拥有有限的 API 对象时,实际上会提高您的性能和效率。要创建命名空间,您可以使用如下命令。这里 namespace.yaml 是一个示例文件,其中包含您的 Namespace 规范。
您可以使用以下命令来部署文件。
kubectl create -f namespace.yml
输出:
您可以看到如下详细信息:
kubectl describe namespace test
输出:
命名空间的创建也可以通过一个命令来完成。在这里,您只需提供 Namespace 的名称。
kubectl create namespace test1
输出:
示例 #2 获取
获取当前的命名空间列表。您可以运行以下命令。另请注意,在输出中,您将获得所有用户创建和系统创建的命名空间。
kubectl get namespace
上面的命令将输出如下所示,在这里您可以看到所有可用的命名空间。
kubectl get namespaces
输出:
要列出一个命名空间或一组命名空间,您必须像下面那样指定它们。
kubectl get namespaces test test1
输出:
示例 #3:描述
获取有关命名空间的详细信息。您必须运行以下命令。
kubectl describe namespaces kube-system
你也可以通过如下运行来做同样的事情:
kubectl get namespaces test
输出:
如果您需要更详细的输出。运行如下:
kubectl get namespaces test -o yaml
输出:
示例 #4:删除
删除命名空间。这里命名空间的例子是“test”
kubectl delete namespaces test
输出:
如果要删除多个 Namespace,则指定如下:
kubectl delete namespaces test1 test3
输出:
示例 #5:在命名空间下创建和查看资源
创建对象时,不指定命名空间,它将在当前命名空间中创建,如果不手动更改为自定义命名空间,则为默认命名空间。
您可以通过在对象的规范 YAML 文件中使用命名空间字段或在命令行中使用命名空间标志,以两种方式为对象指定命名空间。在下面的示例中,您可以看到该场景。
使用一个简单的规范来做一个示例任务,比如创建一个 pod,如下所示:
cat pod-create.yaml
输出:
像下面这样部署这个文件:
kubectl apply -f pod-create.yaml
输出:
现在当你查看这个 pod 的描述时,你会发现这个 pod 是在默认命名空间中创建的。
kubectl describe pod mypod | grep Namespace
输出:
现在,如果通过在 YAML 文件中指定命名空间来创建另一个对象,如下所示:
cat pod-create-1.yaml
输出:
但请注意,您应该存在指定的命名空间,否则命令将失败。
检查如下:
kubectl get namespaces test
输出:
现在应用该文件。
kubectl apply -f pod-create-1.yaml
输出:
现在当你像下面这样检查时,你会看到你在指定的命名空间中创建了你的 pod。
kubectl get pod mypod-1 –namespace=test
输出:
另外,请注意,您可以在不同的命名空间中创建具有相同名称的对象,如下所示,默认情况下存在同名的 pod 以及用户创建的命名空间。
kubectl get pod mypod –namespace=test
输出:
同样,如果您使用规范文件创建像 pod 这样的对象,并且不要在其中提及命名空间字段。但是在部署这个文件时使用命名空间标志,如下所示,您的对象将在该命名空间中创建。
kubectl apply -f pod-create.yaml –namespace=test-2
输出:
再次检查如下。
kubectl get pod mypod –namespace=test-2
输出:
结论
在 Kubernetes 环境中,您拥有大量用户、资源和对象。您可以在物理集群中使用多个命名空间。然后可以将它们视为虚拟集群,因为它们在逻辑上彼此隔离。这种隔离使您的团队更有效率,有助于提高绩效,并以某种方式轻松管理他们。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!