Kubernetes基于namespace实现环境隔离
1 实现步骤
1.1 说明
-
namespace:关于 namespace 的说明以及使用细节请见 namespace的官网文档
-
context:用户使用 kubectl 命令行工具操作 k8s 集群中的资源时,会涉及到上下文(即 context),为了实现不现环境的资源隔离,需要创建不同环境所对应的上下文,这样切换不同的上下文时,即可切换不同的环境。
-
实现说明:本文要在k8s集群中创建两个名称分别为 dev 和 test 的 namespace,以及创建两个名称分别为 dev 和 test 的 context,且名称为 dev 的 context 使用名称为 dev 的 namespace,名称为 test 的 context 使用名称为 test 的 namespace,这样切换到名称为 dev 的 context 时,默认使用的是名称为 dev 的 namespace,切换到名称为 test 的 context时,默认使用的是名称为 test 的 namespace,从而实现 dev 环境和 test 环境之间的资源隔离。为了验证创建的两个 context 之间是否真正的实现资源隔离,本文还会在名称为 dev 的 context 中创建一个 Deployment,然后在名称分别为 dev 和 test 的 context 中查看是否存在创建的那个 Deployment。
-
操作说明:请在 k8s 集群的 master 节点中依次执行 1.2 小节至 1.9 小节中的命令。
1.2 查看namespace
-
执行命令:在创建 namespace 之前,先执行以下命令以查看 k8s 集群中当前已有哪些 namespace。
# 查看当前所有的 namespace kubectl get namespace
-
执行结果:从执行结果来看,k8s 集群中当前没有名称为 dev 和 test 的这两个 namespace。
1.3 创建namespace
-
执行命令:分别执行以下命令,以创建两个名称分别为 dev 和 test 的 namespace,创建完成之后,再查看创建结果。
# 创建一个名称为 dev 的 namespace kubectl create namespace dev # 创建一个名称为 test 的 namespace kubectl create namespace test # # 查看当前所有的 namespace kubectl get namespace
-
执行结果:从执行结果来看,k8s 集群中当前已经有了两个名称分别为 dev 和 test 的 namespace。
1.4 查看context
-
执行命令:在创建 context 之前,先执行以下命令以查看 k8s 集群中当前已有哪些 context,并查看当前处理哪个 context。
# 查看当前所有的 context kubectl config get-contexts # 查看当前的 context kubectl config current-context
-
执行结果:从执行结果来看,k8s 集群中当前只有一个名称为 kubernetes-admin@Kubernetes 的 context,并且正处于该 context。
1.5 查看config
- 执行命令:在创建 context之前,先执行以下命令以查看 k8s 集群中当前的 config 配置,以获取创建 context 时所需要的 cluster 信息和 user 信息。
# 查看当前配置 kubectl config view
- 执行结果:从执行结果来看,k8s 集群中当前配置的 cluster 为 kubernetes,当前配置的 user 为 kubernetes-admin。
1.6 创建context
-
执行命令:分别执行以下命令,以创建两个名称分别为 dev 和 test 的 context,创建完成之后,再查看创建结果。注意:请把下面命令中的 cluster_name 和 user_name 换成使用 1.5 节中命令获取到的值。
# 创建一个名称为 dev 的 context,该 context 使用名称为 dev 的 namespace kubectl config set-context dev --namespace=dev --cluster=cluster_name --user=user_name # 创建一个名称为 test 的 context,该 context 使用名称为 test 的 namespace kubectl config set-context test --namespace=test --cluster=cluster_name --user=user_name # 查看当前所有的 context kubectl config get-contexts
-
执行结果:从执行结果来看,k8s 集群中当前已经有了两个名称分别为 dev 和 test 的 context。
1.7 切换context
-
执行命令:在创建 deployment 之前,先执行以下命令以切换到名称为 dev 的 context(即默认使用名称为 dev 的 namespace)。
# 查看当前的 context kubectl config current-context # 切换到名称为 dev 的 context kubectl config use-context dev # 查看当前的 context kubectl config current-context
-
执行结果:从执行结果来看,切换 context 之前是处于名称为 kubernetes-admin@kubernetes 的 context,并成功切换到了名称为 dev 的 context。
1.8 创建deployment
-
配置文件:在 k8s 主机的 master 节点的当前路径下创建一个名称为 nginx-deployment.yaml 的配置文件,该文件中定义了使用 nginx:1.7.9 镜像创建名称为 nginx-deployment 的 Deployment,内容如下所示:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9
-
执行命令:分别执行以下命令,以查看在创建 Deployment 之前 k8s 集群中所有的 pod,然后再创建 Deployment,并查看创建结果。
# 查看当前 context 下的所有的 pod kubectl get pods # 在当前的 context 下创建一个 nginx 的 deployment kubectl apply -f nginx-deployment.yaml # 查看当前 context 下的所有的 pod kubectl get pods
-
执行结果:从执行结果来看,在创建 Deployment 之前,k8s 集群中没有任何 pod,而创建成功之后,成功创建了两个 pod。
1.9 检验
-
执行命令:分别执行以下命令,以查看当前所处于哪个 context,并查看当前 context 下有哪些 pod,然后再切换到名称为 test 的 context,并查看名称为 test 的 context 下有哪些 pod。
# 查看当前所处的 context kubectl config current-context # 查看当前的 context 下的所有的 pod kubectl get pods # 切换到名称为 test 的 context kubectl config use-context test # 查看当前的 context 下的所有的 pod kubectl get pods
-
执行结果:从执行结果来看,当前正处理名称为 dev 的 context,而且该 context 下有两个 pod,而名称为 test 的 context 中则没有 pod。
-
结果说明:根据以上执行结果可以说明,在名称为 dev 的 context 中创建的 k8s 资源对名称为 test 的 context 是不可见的,从而实现了资源隔离。