kubeconfig 配置文件

kubeconfig 文件中 X.509 密钥说明

在 Kubernetes 的 kubeconfig 文件中,各种证书和密钥用于配置 kubectl 客户端以安全地连接到 Kubernetes 集群。这些证书和密钥通常是 X.509 格式的。以下是 kubeconfig 文件中常见的证书和密钥及其对应的 X.509 文件:

1. Certificate Authority (CA) 证书

  • kubeconfig 字段:certificate-authority

  • X.509 文件:CA 证书文件,通常是 .crt 或 .pem 后缀。

  • 用途:用于验证集群 API 服务器的证书。客户端使用 CA 证书来确保与集群的连接是可信的。

clusters:
- cluster:
    certificate-authority: /path/to/ca.crt
    server: https://kubernetes-api-server:6443
  name: cluster-name

2. 客户端证书 (Client Certificate)

  • kubeconfig 字段:client-certificate

  • X.509 文件:客户端证书文件,通常是 .crt 或 .pem 后缀。

  • 用途:用于客户端身份验证。客户端证书包含客户端的公钥和身份信息,由 CA 签署,证明客户端的身份。

users:
- name: user-name
  user:
    client-certificate: /path/to/client.crt
    client-key: /path/to/client.key

3. 客户端私钥 (Client Key)

  • kubeconfig 字段:client-key

  • X.509 文件:客户端私钥文件,通常是 .key 或 .pem 后缀。

  • 用途:用于客户端的身份验证和加密操作。私钥与客户端证书配对使用,用于解密信息和生成数字签名。

users:
- name: user-name
  user:
    client-certificate: /path/to/client.crt
    client-key: /path/to/client.key

4. 证书和密钥在 kubeconfig 文件中的示例

以下是一个完整的 kubeconfig 文件示例,展示了如何引用上述证书和密钥:

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

生成和使用这些文件的示例

1. 生成 CA 证书

# 生成 CA 私钥
openssl genrsa -out ca.key 2048

# 生成 CA 证书
openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj "/C=US/ST=California/L=San Francisco/O=My CA/CN=myca.com"

2. 生成客户端私钥和 CSR

# 生成客户端私钥
openssl genrsa -out client.key 2048

# 生成 CSR
openssl req -new -key client.key -out client.csr -subj "/C=US/ST=California/L=San Francisco/O=My Company/CN=myuser"

3. 使用 CA 签署客户端证书

# 使用 CA 签署客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
# 生成用户(客户端)私钥
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 签署:

openssl verify -CAfile ca.crt client.crt

配置 kubeconfig 文件

创建一个 kubeconfig 文件,配置 kubectl 使用生成的客户端证书进行身份认证,使用户可以使用 kubectl 连接到集群:

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

创建 Role 和 RoleBinding

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

role.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

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 应用这些配置:

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

验证

使用 kubeconfig 文件连接 Kubernetes 集群

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

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

总结

在 kubeconfig 文件中,CA 证书、客户端证书和客户端私钥都是 X.509 格式的文件。CA 证书用于验证集群的身份,客户端证书和私钥用于客户端的身份验证。了解这些文件的用途和生成方法,可以帮助安全地配置和管理 Kubernetes 集群的访问权限。

Last updated