在Kubernetes (K8S) 中,namespace 是用来对集群内资源进行逻辑隔离的重要概念。有时候我们可能需要在不同的 namespace 之间共享资源或者进行跨 namespace 的操作,本文将介绍如何在 K8S 中实现跨 namespace 操作。

整体流程如下表所示:

| 步骤 | 操作 |
| ---- | ---------------------- |
| 1 | 创建 Service Account |
| 2 | 授权 Service Account |
| 3 | 创建 Role 和 RoleBinding |
| 4 | 在不同的 namespace 使用 Service Account |

### 步骤一:创建 Service Account

在源 namespace 中创建一个 Service Account,用于在目标 namespace 中访问资源。

```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: cross-namespace-sa
namespace: source-namespace
```

### 步骤二:授权 Service Account

为 Service Account 授予需要的权限,通常是通过 ClusterRoleBinding 或 RoleBinding 进行授权。

```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cross-namespace-crb
subjects:
- kind: ServiceAccount
name: cross-namespace-sa
namespace: source-namespace
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
```

### 步骤三:创建 Role 和 RoleBinding

在目标 namespace 创建一个 Role 和 RoleBinding,用于定义目标 namespace 中的权限。

Role:

```yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: target-namespace
name: cross-namespace-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
```

RoleBinding:

```yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cross-namespace-rb
namespace: target-namespace
subjects:
- kind: ServiceAccount
name: cross-namespace-sa
namespace: source-namespace
roleRef:
kind: Role
name: cross-namespace-role
apiGroup: rbac.authorization.k8s.io
```

### 步骤四:在不同的 namespace 使用 Service Account

最后,我们可以在目标 namespace 中创建 Pod,并在该 Pod 中使用之前创建的 Service Account。

```yaml
apiVersion: v1
kind: Pod
metadata:
name: cross-namespace-pod
namespace: target-namespace
spec:
serviceAccountName: cross-namespace-sa
containers:
- name: busybox
image: busybox:latest
command:
- sleep
- "3600"
```

通过以上步骤,我们成功实现了在不同 namespace 中实现跨 namespace 操作。在实际项目中,可以根据实际情况调整权限和资源类型,确保安全性和可用性。希望本文对您有所帮助!