Kubernetes 证书介绍


一、证书机制说明

Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介,也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的,Kubernetes 使用了认证(Authentication)、鉴权(Authorization)、准入控制(AdmissionControl)三步来保证API Server的安全 。

二、证书认证(Authentication)

HTTP Token 认证:

通过一个 Token 来识别合法用户,HTTP Token 的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串 - Token 来表达客户的一种方式。Token 是一个很长的很复杂的字符串,每一个 Token 对应一个用户名存储在 API Server 能访问的文件中,当客户端发起 API 调用请求时,需要在 HTTP Header 里放入 Token。

HTTP Base 认证:

通过用户名+密码的方式进行认证,用户名+密码用 BASE64 算法进行编码后的字符串放在 HTTP Request 中的 Heather Authorization 域里发送给服务端,服务端收到后进行编码,获取用户名及密码。

HTTPS 证书认证:

HTTPS 证书认证是最严格的认证,基于 CA 根证书签名的客户端身份认证方式。

三、证书授权与鉴权(Authorization)

AlwaysDeny:表示拒绝所有的请求,一般用于测试

AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略

Webbook:通过调用外部 REST 服务对用户进行授权

RBAC(Role-Based Access Control):基于角色的访问控制,现行默认规则

ABAC(Attribute-Based Access Control): 基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制

四、证书准入控制

准入控制是API Server的插件集合,通过添加不同的插件,实现额外的准入控制规则。甚至于API Server的一些主要的功能都需要通过 Admission Controllers 实现,这里我们列举几个插件的功能:

NamespaceLifecycle:防止在不存在的 namespace 上创建对象,防止删除系统预置 namespace,删除namespace 时,连带删除它的所有资源对象

LimitRanger:确保请求的资源不会超过资源所在 Namespace 的 LimitRange 的限制。

ResourceQuota:确保请求的资源不会超过资源的 ResourceQuota 限制。

ServiceAccount:为Pod中的进程和外部用户提供身份信息。

证书自动续签

在 Kubernetes 集群中,证书过期是一个常见的问题,尤其是在使用自签名证书的情况下。为了确保集群的正常运行,证书过期后需要及时续签。Kubernetes 提供了一些工具和机制来自动续签证书,以下是一些常见的解决方案和步骤:

1. 使用 kubeadm 自动续签证书

如果你使用 kubeadm 来部署 Kubernetes 集群,kubeadm 提供了自动续签证书的功能。

1.1 检查证书过期时间

首先,你可以使用以下命令检查证书的过期时间:

kubeadm certs check-expiration

该命令会列出所有证书的过期时间。

1.2 自动续签证书

如果证书即将过期,你可以使用以下命令来自动续签证书:

sudo kubeadm certs renew all

该命令会续签所有过期的证书。

1.3 重启控制平面组件

续签证书后,你需要重启控制平面组件(如 kube-apiserverkube-controller-managerkube-scheduler 等)以使新证书生效。你可以通过重启 kubelet 服务来实现:

sudo systemctl restart kubelet

2. 使用 cert-manager 管理证书

cert-manager 是一个 Kubernetes 的附加组件,用于自动化管理证书的生命周期。它可以与 Let's Encrypt 等证书颁发机构集成,自动颁发和续签证书。

2.1 安装 cert-manager

首先,你需要安装 cert-manager

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml

2.2 配置 IssuerClusterIssuer

接下来,你需要配置一个 IssuerClusterIssuer,用于颁发证书。例如,配置一个 Let's Encrypt 的 ClusterIssuer

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your-email@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx

2.3 创建 Certificate 资源

然后,你可以创建一个 Certificate 资源,指定需要续签的证书:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com
  namespace: default
spec:
  secretName: example-com-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: example.com
  dnsNames:
  - example.com
  - www.example.com

cert-manager 会自动管理证书的颁发和续签。

3. 手动续签证书

如果你不想使用自动化的工具,也可以手动续签证书。以下是手动续签证书的步骤:

3.1 生成新的证书

你可以使用 openssl 或其他工具生成新的证书。例如,生成一个新的自签名证书:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

3.2 替换旧证书

将新生成的证书替换到 Kubernetes 集群中。你需要替换 kube-apiserverkube-controller-managerkube-scheduler 等组件的证书。

3.3 重启控制平面组件

最后,重启控制平面组件以使新证书生效。

4. 定期检查和续签

为了防止证书过期,建议定期检查证书的过期时间,并设置自动续签机制。你可以使用 cron 或其他定时任务工具来定期执行续签操作。

总结

Kubernetes 证书过期后,可以通过 kubeadm 自动续签、使用 cert-manager 管理证书,或者手动续签证书来解决问题。建议使用自动化的工具来管理证书,以减少人工干预和避免证书过期导致的服务中断。