先来试试匿名访问。

$ 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。

coredns upstream

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
    }

results matching ""

    No results matching ""