Kubernetes API Server 是 Kubernetes 集群的控制中心,提供了 Kubernetes API 的访问入口。为了保证 Kubernetes 集群的安全性,Kubernetes 提供了许多 API Server 访问控制机制,如下所示:

  1. 认证(Authentication):API Server 可以支持多种身份认证方式,如证书、静态令牌、动态令牌(Token)和基本认证等。使用 TLS 证书认证是最安全的身份认证方式。
  2. 授权(Authorization):Kubernetes 集群中所有的资源都有自己的 API 对象,如 Pod、Service、ReplicationController 等,而这些对象都有读写操作权限。因此,API Server 还需要检查请求的用户是否有足够的授权,才会处理请求。
  3. 准入控制(Admission Control):准入控制机制是 Kubernetes API Server 中一个非常强大的功能,它允许对进入 Kubernetes 集群的请求做出控制。API Server 会在对象(如 Pod、Node、Service 等)被保存到 etcd 数据库之前,对该对象进行检查和修改。准入控制可用于实施强制性的数据验证、安全功能、自动化操作等功能。
  4. 访问控制列表(Access Control List, ACL):ACL 可以通过配置文件中的用户和角色绑定来限制用户的访问权限。通过定义 Role 和 ClusterRole,以及 RoleBinding 和 ClusterRoleBinding 对象,可以实现对 Kubernetes 集群中不同用户的访问控制。

kube-apiserver启动配置样例如下:

- kube-apiserver
    - --advertise-address=192.168.1.10
    - --bind-address=0.0.0.0
    - --insecure-bind-address=127.0.0.1
    - --secure-port=6443
    - --insecure-port=0
    - --authorization-mode=Node,RBAC
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --enable-admission-plugins=NodeRestriction,ServiceAccount
    - --service-cluster-ip-range=10.96.0.0/12
    - --service-node-port-range=30000-32767
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://192.168.1.10:2379,https://192.168.1.11:2379,https://192.168.1.12:2379
    - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
    - --v=2
    - --runtime-config=api/all=true

其中访问控制配置:

  • --authorization-mode 参数用于设置 kube-apiserver 使用的授权模式,这里设置了 Node 和 RBAC;
  • --kubelet-preferred-address-types 参数用于设置 kubelet 愿意接收的节点地址类型,默认为 InternalIP,这里还设置了 ExternalIP 和 Hostname;
  • --enable-admission-plugins 参数用于启用或禁用准入控制插件,这里启用了 NodeRestriction 和 ServiceAccount;
  • --tls-cert-file 和 --tls-private-key-file 参数用于设置 kube-apiserver 的证书和私钥文件的路径;
  • --client-ca-file 参数用于设置 kube-apiserver 授权客户端证书的 CA 文件的路径;
  • --etcd-cafile--etcd-certfile 和 --etcd-keyfile 参数用于设置连接 etcd 的证书、私钥和 CA 文件;
  • --tls-cipher-suites 参数用于设置 TLS 协议支持的加密算法;

在Kubernetes中,可以配置多种认证、授权、接入插件,认证和授权只要一个启动的插件鉴权成功及可成功,而接入控制必须通过所有插件检查。

认证方式

在该 kube-apiserver 的主配置文件中,我们可以看到 Kubernetes 包含了这几种身份验证的配置:

  1. 证书认证:--client-ca-file 参数和 --tls-cert-file--tls-private-key-file 参数用于设置证书的位置和 kube-apiserver 的加密方式;
  2. 静态令牌认证:kubeconfig 文件中使用 token 字段指定令牌,并使用 tokenFile 字段指定存储令牌文件的位置;
  3. 动态令牌认证:使用 --authentication-token-webhook-config-file 参数指定使用 webhook 进行动态令牌身份验证,并在 webhook 配置文件中配置认证流程;
  4. 基本认证:使用 --basic-auth-file 参数指定用户列表文件的位置。