和用于相互隔离进程的 Linux 命名空间不一样,Kubernetes命名空间简单地为资源名称提供了一个作用域。此时我们并不会将所有资源都放在个命名空间中,而是将它们组织到多个命名空间中,这样可以允许我们多次使用相同的资源名称(跨不同的命名空间)。
3.7.1 了解对命名空间的需求
作用:对资源进行分组,限制用户访问特定资源,限制单个用户可用的计算资源数量。
资源名称只需在同一命名空间内保持唯一即可,因此两个不同的命名空间可以包含同名的资源。虽然大多数类型的资源都与命名空间相关,但仍有一些与它无关,其中之一便是全局且未被约束于单一命名空间的Node资源。
3.7.2 发现其他命名空间及其 pod
Usage:
列出集群中的所有namespace:
kubectl get ns
当执行kubectl 命令不指定命名空间时,默认使用的是 default 命名空间。
使用kubectl 时指定kube-system命名空间:
Usage:
为kubectl 命令指定命名空间:(通用option)
-n, —namespace=’’: If present, the namespace scope for this CLI request.
3.7.3 创建一个命名空间
命名空间是一种和其他资源一样的 Kubernetes 资源,因此可以通过将 YAML 文件提交到 Kubernetes API Server来创建该资源。
从YAML 文件创建命名空间
cat >custom-namespace.yaml <<'EOF'
apiVersion: v1
kind: Namespace
metadata:
name: custom-namespace
EOF
kubectl create -f custom-namespace.yaml
使用 kubectl create namespace 命令创建命名空间(推荐)
注意:尽管大多数对象的名称必须符合 RFC 1035 (域名)中规定的命名规范,这意味着它们可能只包含字母、数字、横杠(-)和点号,但命名空间(和另外几个)不允许包含点号。只包含 字母、数字、-号
Usage:
创建命名空间:
kubectl create namespace NAME
删除命名空间:
kubectl delete namespace NAME
3.7.4 管理其他命名空间中的对象
在新创建的命名空间custom-namespace中创建资源:
方法一:在YAML中指定命名空间
cat >kubia-manual-2.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual
namespace: custom-namespace
spec:
containers:
- image: 10.0.0.10:5000/luksa/kubia
name: kubia
ports:
- containerPort: 8080
protocol: TCP
EOF
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。