当使用kubectl,client libraries或发起REST请求,进而访问REST API时,都需要经过API的认证、授权、权限控制
在经典的Kubernetes集群中,API Server在443端口提供服务,它需要自签名的证书,而这就是$USER/.kube/config
该证书通常是在创建集群时自动创建的,如果集群拥有多个用户,则需要将此根证书与其他用户共享。
直接访问API
kubectl会处理apiserver的定位和认证,而如果使用http客户端,比如curl或wget或浏览器,直接访问REST API,则需要其他方法定位和认证apiserver
使用kubectl代理
kubectl proxy --port=8080 &
运行命令,则kubectl充当反向代理,完成apiserver的定位和认证
通过curl访问API
$ curl http://localhost:8080/api/
{
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
不使用kubectl代理
如果不使用kubectl代理,需要直接传递一个认证Token给apiserver
$ APISERVER=$(kubectl config view | grep server | cut -f 2- -d ":" | tr -d " ")
$ TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t')
$ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
在上面使用参数--insecure,会使集群很容易受到中间人攻击。
当kubectl访问集群时,它会使用一个已经保存的根证书和客户端证书(证书安装在~/.kube目录)。
由于集群的证书一般是自行签发的,因此需要特殊的配置使http客户端使用根证书。