# Kubernetes(K8s)是一种用于自动部署、扩展和管理容器化应用程序的开源系统。在K8s中,Pod是最小的部署单元,通常在同一命名空间中的Pod之间可以相互访问。但有时候我们需要在不同命名空间的Pod之间进行跨命名空间访问。本文将教你如何实现K8s跨命名空间访问。

## 实现K8s跨命名空间访问流程

| 步骤 | 操作 |
| ---- | ---- |
| 1 | 创建 ServiceAccount 和 ClusterRoleBinding |
| 2 | 授权 ServiceAccount 访问其他命名空间的权限 |
| 3 | 在 Pod 中使用 ServiceAccount 访问其他命名空间的资源 |

## 实现步骤和代码示例

### 步骤一:创建 ServiceAccount 和 ClusterRoleBinding

首先,我们需要在目标命名空间中创建一个 ServiceAccount,并通过 ClusterRoleBinding 授予其访问其他命名空间的权限。

```yaml
# 创建 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: cross-ns-sa
namespace: target-namespace

# 创建 ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cross-ns-role-binding
subjects:
- kind: ServiceAccount
name: cross-ns-sa
namespace: target-namespace
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
```

### 步骤二:授权 ServiceAccount 访问其他命名空间的权限

在步骤一中,我们创建了一个名为 cross-ns-sa 的 ServiceAccount,并通过 ClusterRoleBinding 授予其 view 权限。接下来,我们需要授权该 ServiceAccount 访问其他命名空间。

```yaml
# 授权 ServiceAccount 访问其他命名空间
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cross-ns-role-binding
namespace: target-namespace
subjects:
- kind: ServiceAccount
name: cross-ns-sa
namespace: target-namespace
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
```

### 步骤三:在 Pod 中使用 ServiceAccount 访问其他命名空间的资源

最后,在需要访问其他命名空间资源的 Pod 中,我们需要指定该 Pod 使用我们创建的 ServiceAccount。

```yaml
apiVersion: v1
kind: Pod
metadata:
name: cross-ns-pod
spec:
serviceAccountName: cross-ns-sa
containers:
- name: busybox
image: busybox
command: ['sleep', '3600']
```

在上面的示例中,我们创建了一个名为 cross-ns-pod 的 Pod,并通过指定 serviceAccountName 为 cross-ns-sa,让该 Pod 使用我们之前创建的 ServiceAccount。

通过以上步骤,我们成功实现了在K8s中跨命名空间访问的功能。现在,我们可以在不同命名空间的 Pod 中互相访问资源。

希望本文能帮助你理解和实现K8s跨命名空间访问的功能!如果有任何疑问,欢迎随时向我提问。祝学习愉快!