一、证书机制说明
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-apiserver
、kube-controller-manager
、kube-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 配置 Issuer
或 ClusterIssuer
接下来,你需要配置一个 Issuer
或 ClusterIssuer
,用于颁发证书。例如,配置一个 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-apiserver
、kube-controller-manager
、kube-scheduler
等组件的证书。
3.3 重启控制平面组件
最后,重启控制平面组件以使新证书生效。
4. 定期检查和续签
为了防止证书过期,建议定期检查证书的过期时间,并设置自动续签机制。你可以使用 cron
或其他定时任务工具来定期执行续签操作。
总结
Kubernetes 证书过期后,可以通过 kubeadm
自动续签、使用 cert-manager
管理证书,或者手动续签证书来解决问题。建议使用自动化的工具来管理证书,以减少人工干预和避免证书过期导致的服务中断。