# K8s 用户案例1：为开发人员配置访问权限

### 1. 创建用户证书

首先，为开发人员创建一个用户证书，以便他们能够通过 kubectl 访问 Kubernetes 集群。

```bash
# 生成用户（客户端）私钥
openssl genrsa -out developer.key 2048

# 生成证书签名请求（CSR）
openssl req -new -key developer.key -out developer.csr -subj "/CN=developer/O=dev-team"

# 通过 Kubernetes CA 签署证书
openssl x509 -req -in developer.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out developer.crt -days 365
```

#### 验证证书

验证客户端证书是否由 CA 签署：

```bash
openssl verify -CAfile ca.crt client.crt
```

#### 使用 kubeconfig 文件连接 Kubernetes 集群

将上述生成的证书和密钥路径填入 kubeconfig 文件后，可以使用 kubectl 命令连接到 Kubernetes 集群：

```bash
kubectl get nodes --kubeconfig=/path/to/kubeconfig
```

### 2. 配置 kubeconfig 文件

为开发人员配置 kubeconfig 文件，使他们可以使用 kubectl 连接到集群。

```yaml
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority: /path/to/ca.crt
    server: https://kubernetes-api-server:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: developer
  name: developer-context
current-context: developer-context
users:
- name: developer
  user:
    client-certificate: /path/to/developer.crt
    client-key: /path/to/developer.key
```

### 3. 创建 Role 和 RoleBinding

为开发人员创建一个 Role，赋予在特定命名空间中管理 Pods 的权限，并通过 RoleBinding 将这个 Role 绑定到开发人员的身份上。

#### role.yaml

```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev-namespace
  name: pod-manager
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "create", "update", "delete"]
```

#### rolebinding.yaml

```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-rolebinding
  namespace: dev-namespace
subjects:
- kind: User
  name: developer
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-manager
  apiGroup: rbac.authorization.k8s.io
```

#### 通过 kubectl 应用这些配置：

```bash
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
```

### 4. 验证

#### 使用 kubeconfig 文件连接 Kubernetes 集群

```bash
kubectl get pods --kubeconfig=/path/to/kubeconfig
```
