先来试试匿名访问。
$ curl https://10.96.0.1:443/api/v1/node -k -i
HTTP/1.1 403 Forbidden
Content-Type: application/json
X-Content-Type-Options: nosniff
Date: Wed, 05 Sep 2018 15:21:32 GMT
Content-Length: 271
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "node is forbidden: User \"system:anonymous\" cannot list node at the cluster scope",
"reason": "Forbidden",
"details": {
"kind": "node"
},
"code": 403
}
显然,匿名用户是不能看到我们有哪些nodes的。k8s可以用Dex作为自己的第三方认证,配置如下:
kube-apiserver的编排文件
--oidc-issuer-url=https://dex.example.com:32000
--oidc-client-id=example-app
--oidc-ca-file=/etc/kubernetes/ssl/openid-ca.pem
--oidc-username-claim=email
--oidc-groups-claim=groups
带着token再来访问一下 api(就是第二节dex里的example-app一长串流程获得的token)
export token="xxx"
curl https://10.96.0.1:443/api/v1/nodes -k -i -H "Authorization: Bearer $token"
你将看到,k8s识别出来你是谁了,但会提示你没有权限。
没关系,我们加一个大管家角色绑定就行了。
kubectl create clusterrolebinding me-cluster-admin --clusterrole=cluster-admin --user=me@ieevee.com
再重复访问一下,就妥了。
btw,如果你用的是ubuntu,那么很有可能你在example-app跳转到Dex再跳转到GitHub再回来Dex验证grant token的时候会出错,因为此时Dex容器需要和GitHub做一次exchange,但Dex容器解析不了GitHub的域名。
原因是ubuntu的/etc/resolv.conf文件的nameserver是127.0.0.1(因为ubuntu内置了dnsmasq),而coredns默认会proxy到/etc/resolv.conf,所以proxy其实是没用的,解析会失败。简单的解决办法是proxy到9.9.9.9。或者也可以upstream到内置的dnsmasq。
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . 9.9.9.9
cache 30
reload
}