Kubernetes 控制平面组件:API Server

深入理解Kube-APIServer

? 认证 authentication
? 鉴权 authorization
? 准入 access
Mutating突变
Validating验证
Admission准入
? 限流
? APIServer对象的实现

API Serverkube-apiserver是Kubernetes最重要的核心组件之一,主要提供以下的功能??
提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等
提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd

访问控制概览Kubernetes API的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证、授权以及准入控制(Admission Control)

 访问控制细节

1. 认证

认证开启TLS时,所有的请求都需要首先认证。Kubernetes支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可)。如果认证成功,则用户的username会传入授权模块做进一步授权验证;而对于认证失败的请求则返回HTTP 401

 认证插件?

X509证书?  使用X509客户端证书只需要API Server启动时配置--client-ca-file=SOMEFILE。在证书认证时,其CN域用作用户名,而组织机构域则用作group名。? 静态Token文件?? 
使用静态Token文件认证只需要API Server启动时配置--token-auth-file=SOMEFILE。 该文件为csv格式,每行至少包括三列token,username,user id,token,user,uid,"group1,group2,group3” ? 引导Token????为了支持平滑地启动引导新的集群,Kubernetes 包含了一种动态管理的持有者令牌类型, 称作 启动引导令牌(BootstrapToken)。 
这些令牌以 Secret 的形式保存在 kube-system 名字空间中,可以被动态管理和创建
控制器管理器包含的 TokenCleaner 控制器能够在启动引导令牌过期时将其删除。
在使用kubeadm部署Kubernetes时,可通过kubeadm token list命令查询。

认证插件?

静态密码文件?  需要API Server启动时配置--basic-auth-file=SOMEFILE,文件格式为csv,每行至少三列password, user, uid,后面是可选的group名password,user,uid,"group1,group2,group3” ? ServiceAccount ?  ServiceAccount是Kubernetes自动生成的,并会自动挂载到容器的/run/secrets/kubernetes.io/serviceaccount目录中。? OpenID?  OAuth 2.0的认证机制?  Webhook 令牌身份认证??
--authentication-token-webhook-config-file 指向一个配置文件,其中描述 如何访问远程的 Webhook 服务。
--authentication-token-webhook-cache-ttl 用来设定身份认证决定的缓存时间。 默认时长为 2 分钟。? 匿名请求?  如果使用AlwaysAllow以外的认证模式,则匿名请求默认开启,但可用--anonymous-auth=false禁止匿名请求

基于webhook的认证服务
 https://github.com/appscode/guard

需要依照Kubernetes规范,构建认证服务,用来认证tokenreview request构建认证服务?  

认证服务需要满足如下Kubernetes的规范?  

URL: https://authn.example.com/authenticate??Method: POSTInput:? Output:

 开发认证服务

解码认证请求

decoder := json.NewDecoder(r.Body)
var tr authentication.TokenReview
err := decoder.Decode(tr)
if err != nil {

    log.Println("[Error]", err.Error())
    w.WriterHeader(http.StatusBadRequest)
    json.NewEncoder(w).Encode(Map[string] interface{}{
        "apiVersion": "authentication.k8s.io/v1beta1",
        "kind":  "TokenReview",
        "status": authentication.TokenReviewStatus{
            Authenticated: false,
        },
    })
    return
}

开发认证服务

// check user
ts := oauth2.StatusTokenSource(
    &oauth2.Token{"AccessToken": tr.Spec.Token},
)

tc := oauth2.NewClient(oauth2.NoContext, ts)
client := github.NewClient(tc)
user, _, err := clent.Users.Get(context.Background(), "")
if err != nil {
    log.Println("[err]", err.Error())
    w.WriterHeader(http.StatusUnauthrization)
    json.NewEncoder(w).Encode(Map[string] interface{}{
        "apiVersion": "authentication.k8s.io/v1beta1",
        "kind":  "TokenReview",
        "status": authentication.TokenReviewStatus{
            Authenticated: false,
        },
    })
    return    
}

开发认证服务

认证结果返回给APIServer

w.WriterHeader(http.StatusOK)
trs := authentication.TokenReviewStatus{
    Authenticated: true,
    User: authentication.UserInfo{
        Username: *user.LoGin,
        UID: *user.LoGin,
    },
}
json.NewEncoder(w).Encode(Map[string] interface{}{
    "apiVersion": "authentication.k8s.io/v1beta1",
    "kind":  "TokenReview",
    "status": trs,
})

配置认证服务 

 配置apiserver可以是任何认证系统?  但在用户认证完成后,生成代表用户身份的token?  该token通常是有失效时间的?  用户获取该token以后以后,将token配置进kubeconfig修改apiserver设置,开启认证服务,apiserver保证将所有收到的请求中的token信息,发给认证服务进行验证?  --authentication-token-webhook-config-file,该文件描述如何访问认证服务?  --authentication-token-webhook-cache-ttl,默认2分钟配置文件需要mount进Pod配置文件中的服务器地址需要指向authService

 生产系统中遇到的陷阱

基于Keystone的认证插件导致Keystone故障且无法恢复Keystone是企业关键服务Kubernetes以Keystone作为认证插件Keystone在出现故障后会抛出401错误Kubernetes发现401错误后会尝试重新认证大多数controller都有指数级back off,重试间隔越来越慢但gophercloud针对过期token会一直retry大量的request积压在Keystone导致服务无法恢复Kubernetes成为压死企业认证服务的最后一根稻草解决方案???Circuit breakRate limit

2. 鉴权

授权

授权主要是用于对集群资源的访问控制,通过检查请求包含的相关属性值,与相对应的访问策略相比较,API请求必须满足某些策略才能被处理。跟认证类似,Kubernetes也支持多种授权机制,并支持同时开启多个授权插件(只要有一个验证通过即可)。如果授权成功,则用户的请求会发送到准入控制模块做进一步的请求验证;对于授权失败的请求则返回HTTP 403。Kubernetes授权仅处理以下的请求属性:?????
user, group, extra
API、请求方法(如get、post、update、patch和delete)和请求路径(如/api)
请求资源和子资源NamespaceAPI Group目前,Kubernetes支持以下授权插件:????

ABAC

RBAC

Webhook

Node

RBAC vs ABAC

ABAC(Attribute Based Access Control)本来是不错的概念,但是在 Kubernetes 中的实现比较难于管理和理解,而且需要对 Master

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值