当使用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客户端使用根证书。

results matching ""

    No results matching ""