和用于相互隔离进程的 Linux 命名空间不一样,Kubernetes命名空间简单地为资源名称提供了一个作用域。此时我们并不会将所有资源都放在个命名空间中,而是将它们组织到多个命名空间中,这样可以允许我们多次使用相同的资源名称(跨不同的命名空间)。

3.7.1 了解对命名空间的需求

作用:对资源进行分组,限制用户访问特定资源,限制单个用户可用的计算资源数量。
资源名称只需在同一命名空间内保持唯一即可,因此两个不同的命名空间可以包含同名的资源。虽然大多数类型的资源都与命名空间相关,但仍有一些与它无关,其中之一便是全局且未被约束于单一命名空间的Node资源。

3.7.2 发现其他命名空间及其 pod

Usage:

列出集群中的所有namespace:
kubectl get ns
image.png
当执行kubectl 命令不指定命名空间时,默认使用的是 default 命名空间。

使用kubectl 时指定kube-system命名空间:
image.png

Usage:

为kubectl 命令指定命名空间:(通用option)
-n, —namespace=’’: If present, the namespace scope for this CLI request.

3.7.3 创建一个命名空间

命名空间是一种和其他资源一样的 Kubernetes 资源,因此可以通过将 YAML 文件提交到 Kubernetes API Server来创建该资源。

从YAML 文件创建命名空间

image.png

  1. cat >custom-namespace.yaml <<'EOF'
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: custom-namespace
  6. EOF
  7. kubectl create -f custom-namespace.yaml

使用 kubectl create namespace 命令创建命名空间(推荐)

image.png
注意:尽管大多数对象的名称必须符合 RFC 1035 (域名)中规定的命名规范,这意味着它们可能只包含字母、数字、横杠(-)和点号,但命名空间(和另外几个)不允许包含点号。只包含 字母、数字、-号

Usage:

创建命名空间:
kubectl create namespace NAME

删除命名空间:
kubectl delete namespace NAME

3.7.4 管理其他命名空间中的对象

在新创建的命名空间custom-namespace中创建资源:
方法一:在YAML中指定命名空间

  1. cat >kubia-manual-2.yaml <<'EOF'
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: kubia-manual
  6. namespace: custom-namespace
  7. spec:
  8. containers:
  9. - image: 10.0.0.10:5000/luksa/kubia
  10. name: kubia
  11. ports:
  12. - containerPort: 8080
  13. protocol: TCP
  14. EOF
  15. kubectl create -f kubia-manual-2.yaml

方法二:使用命令选项 -n 指定命名空间
kubectl create -f kubia-manual.yaml -n custom-namespace

此时我们就会有两个同名的 pod (kubia-manual)。一个在 default 命名空间中,一个在 custom-namespace 中。在列出、描述、修改或删除其他命名空间中的对象时需要给 kubectl 命令传递—namespace(或-n)选项.如果不指定命名空间,kubectl 将在当前上下文(kubectl context)中配置的默认命名空间中执行操作 。而当前上下文的命名空间和当前上下文本身都可以通过 kubectl config 命令进行更改。

提示:要想快速切换到不同的命名空间可以设置以下别名:

#设置别名:
alias kcd='kubectl config set-context $(kubectl config current-context) --namespace '

#使用别名设置当前上下文的默认命名空间:
kcd some-namespace

3.7.5 命名空间提供的隔离

尽管命名空间将对象分隔到不同的组,只允许你对属于特定命名空间的对象进行操作,但实际上命名空间并不提供对正在运行的对象的任何隔离。

例如,你可能会认为当不同的用户在不同的命名空间中部署 pod 时,这些 pod 应该彼此隔离,并且无法通信,但事实却并非如此。命名空间之间是否提供网络隔离取决于 Kubernetes 所使用的网络解决方案。当该解决方案不提供命名空间之间的网络隔离时 ,如果命名空间 foo 中的某个 pod 知道命名空间 bar 中 pod 的 IP 地址,那它就可以将流量( 例如 HTTP 请求)发送到另一 pod。