Kubernetes基于namespace实现环境隔离

  • 1 实现步骤
  • 1.1 说明
  • 1.2 查看namespace
  • 1.3 创建namespace
  • 1.4 查看context
  • 1.5 查看config
  • 1.6 创建context
  • 1.7 切换context
  • 1.8 创建deployment
  • 1.9 检验


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。
  • k8s namespace资源隔离 k8s namespace 隔离_K8S

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。
  • k8s namespace资源隔离 k8s namespace 隔离_Kubernetes_02

1.4 查看context

  • 执行命令:在创建 context 之前,先执行以下命令以查看 k8s 集群中当前已有哪些 context,并查看当前处理哪个 context。
# 查看当前所有的 context
kubectl config get-contexts

# 查看当前的 context
kubectl config current-context
  • 执行结果:从执行结果来看,k8s 集群中当前只有一个名称为 kubernetes-admin@Kubernetes 的 context,并且正处于该 context。
  • k8s namespace资源隔离 k8s namespace 隔离_namespace_03

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。
  • k8s namespace资源隔离 k8s namespace 隔离_资源隔离_04

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。
  • k8s namespace资源隔离 k8s namespace 隔离_k8s namespace资源隔离_05

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。
  • k8s namespace资源隔离 k8s namespace 隔离_namespace_06

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。
  • k8s namespace资源隔离 k8s namespace 隔离_namespace_07

  • 结果说明:根据以上执行结果可以说明,在名称为 dev 的 context 中创建的 k8s 资源对名称为 test 的 context 是不可见的,从而实现了资源隔离。