出于监控的目的,需要获取k8s中pod的CPU以及内存使用率等指标,经过了解发现需要调用kubelet的指标接口去获取相应信息。然而调接口时发现得认证和授权,下面说明一下kubelet接口认证授权的过程。
默认情况下,没有携带身份凭证的匿名请求会被认证为用户system:anonymous以及组system:unauthenticated。如果要拒绝将匿名请求认证为以上的用户与组,配置kubelet的如下启动参数,那么匿名请求就会认证失败

authentication:
  anonymous:
    enabled: false

kubelet的认证方法与apiserver相似,有client证书认证及token认证。
开启client认证和token认证需要做如下配置

authentication:
  webhook:
    enabled: true
  x509: 
    clientCAFile: /xxxx.crt

以上配置表示开启了token认证以及X509证书认证。如果两个都开启,只需要一个验证通过即可。
当采用证书认证的方式时,需要一个ca.crt来验证apiserver的证书,还需要携带一个client.crt来表明自已的身份。在实际中,客户端还需要携带client.key。举例如下,

curl https://localhost:10250/metrics --cacert /etc/kubernetes/pki/ca.crt --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key 

除了认证之外,还需要进行授权。
kubelet的默认授权模式为AlwaysAllow,所有通过认证的请求(包括通过认证的匿名请求)有权限访问kubelet所有的API。这显然是不合理的,所以我们需要像apiserver那样对不同的请求赋予不同的权限。
kubelet通过如下的方法把授权委托给apiserver:
在apiserver中开启authorization.k8s.io/v1beta1这个API组
配置kubelet的启动参数

authorization:
  mode: Webhook

然后kubelet就会通过apiserver的SubjectAccessReviewAPI来决定是否给每一个请求授权。kubelet与apiserver的API不一样,当访问kubelet的API时,kubelet需要把这个API映射到apiserver的API,apiserver才知道该授予怎样的权限。kubelet与apiserver的资源映射如下。比如A用户访问kubelet的Get /healthz,那么会映射为apiserver的Get /api/v1//nodes//proxy,然后kubelet会通过apiserver的SubjectAccessReview判断A用户是否有权限访问apiserver对应的API

kubelet APIresourcesub-resource
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslogs
/spec/*nodesspec
all othersnodesproxy

下面以token认证授权为例。
首选需要创建一个sa

kubectl create sa kubelet-test

创建clusterrole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kubelet-test
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get 

接着绑定权限

Kubectl create clusterrolebinding kubelet-test --clusterrole=kubelet-test --serviceaccount=default:kubelet-test

现在就可以获取认证授权的token了。

kubectl describe secret kubelet-test-xxxx

当客户端使用该认证方式来发起请求的时候,需在Header参数中添加以下字段

Authorization: Bearer <token>

测试如下:

curl https://localhost:10250/metrics "Authorization: Bearer XXXXXX" -k
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐