Kubernetes API Server 是 Kubernetes 集群的控制中心,提供了 Kubernetes API 的访问入口。为了保证 Kubernetes 集群的安全性,Kubernetes 提供了许多 API Server 访问控制机制,如下所示:
- 认证(Authentication):API Server 可以支持多种身份认证方式,如证书、静态令牌、动态令牌(Token)和基本认证等。使用 TLS 证书认证是最安全的身份认证方式。
- 授权(Authorization):Kubernetes 集群中所有的资源都有自己的 API 对象,如 Pod、Service、ReplicationController 等,而这些对象都有读写操作权限。因此,API Server 还需要检查请求的用户是否有足够的授权,才会处理请求。
- 准入控制(Admission Control):准入控制机制是 Kubernetes API Server 中一个非常强大的功能,它允许对进入 Kubernetes 集群的请求做出控制。API Server 会在对象(如 Pod、Node、Service 等)被保存到 etcd 数据库之前,对该对象进行检查和修改。准入控制可用于实施强制性的数据验证、安全功能、自动化操作等功能。
- 访问控制列表(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 包含了这几种身份验证的配置:
- 证书认证:
--client-ca-file
参数和--tls-cert-file
,--tls-private-key-file
参数用于设置证书的位置和 kube-apiserver 的加密方式; - 静态令牌认证:kubeconfig 文件中使用
token
字段指定令牌,并使用tokenFile
字段指定存储令牌文件的位置; - 动态令牌认证:使用
--authentication-token-webhook-config-file
参数指定使用 webhook 进行动态令牌身份验证,并在 webhook 配置文件中配置认证流程; - 基本认证:使用
--basic-auth-file
参数指定用户列表文件的位置。