Kubernetes 不同工作组共享集群案例

在一个组织内部,不同的工作组可以在同一个 Kubernetes 集群中工作,Kubernetes 通过命名空间和 Context 的设置来实现对不同工作组进行区分,使得它们既可以共享同一个 Kubernetes 集群的服务,也能够互不干扰。

假设在我们的组织中有两个工作组:开发组和生产运维组。开发组在 Kubernetes 集群中需要不断创建、修改、删除各种 Pod、RC、Service 等资源对象,以便实现敏捷开发的过程。而生产运维组则需要使用严格的权限设置来确保生产系统中的 Pod、RC、Service 处于正常运行状态且不会被误操作。

创建 namespace

为了在 Kubernetes 集群中实现这两个分组,首先需要创建两个命名空间。

namespace-development.yaml

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: development

namespace-production.yaml

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: production

使用 kubectl create 命令完成命名空间的创建:

1
2
$ kubectl create -f namespace-development.yaml
$ kubectl create -f namespace-production.yaml

查看系统中的命名空间:

1
$ kubectl get namespaces

定义 Context(运行环境)

接下来,需要为这两个工作组分别定义一个 Context,即运行环境。这个运行环境将属于某个特定的命名空间。

通过 kubectl config set-context 命令定义 Context,并将 Context 置于之前创建的命名空间中:

1
2
3
$ kubectl config set-cluster kubernetes-cluster --server=https://192.168.1.128:8080
$ kubectl config set-context ctx-dev --namespace=development --cluster=kubernetes-cluster --user=dev
$ kubectl config set-context ctx-prod --namespace=production --cluster=kubernetes-cluster --user=prod

使用 kubectl config view 命令查看已定义的 Context:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ kubectl config view
apiVersion: v1
kind: Config
clusters:
- cluster:
server: http://192.168.1.128:8080
name: kubernetes-cluster
contexts:
- context:
cluster: kubernetes-cluster
namespace: development
name: ctx-dev
- context:
cluster: kubernetes-cluster
namespace: production
name: ctx-prod
current-context: ctx-dev
preferences: {}
users: []

注意,通过 kubectl config 命令在 ${HOME}/.kube 目录下生成了一个名为 config 的文件,文件内容即 kubectl config view 命令看到的内容。所以,也可以通过手工编辑该文件的方式来设置 Context。

设置工作组在特定 Context 环境中工作

使用 kubectl config use-context 命令来设置当前的运行环境。

下面的命令把当前运行环境设置为 ”ctx-dev“:

1
$ kubectl config use-context ctx-dev

通过这个命令,当前的运行环境即被设置为开发组所需的环境。之后的所有操作都将在名为 “development” 的命名空间中完成。

各工作组之间的工作将不会相互干扰,并且它们都能够在同一个 Kubernetes 集群中同时工作。