系列目录html
在Kubernetes集群中,API Server是集群管理API的入口,由运行在Master节点上的一个名为kube-apiserver的进程提供的服务。 用户进入API能够经过kubectl、客户端库或者http rest,User 或者 Service Account能够被受权进入API。当一个请求到达API时, 每每要通过几个阶段的安全控制,在一个典型的应用集群中,API Server一般会使用自签名的证书提供HTTPS服务,同时开启认证与受权等安全机制。json
一般,在Kubernetes集群搭建以后,除了使用官方的kubectl工具与API Server进行交互,咱们还可使用Postman或者curl了,有些时候直接使用curl功能更强大, 与API Server交互一般须要首先建立一个有正确权限的ServiceAccount,这个ServiceAccount经过ClusterRole/Role、ClusterRoleBinding/RoleBinding等给其赋予相关资源的操做权限, 而Service Account对应的Token则用于API Server进行基本的认证。与API Server的交互是基于TLS,因此请求的时候还须要自签名的证书,固然也能够非安全方式链接API Server, 可是不推荐。centos
前面咱们讲到过ServiceAccount,它相似于传统登录里的用户.建立一个ServiceAccount之后,会自动为它建立一个关联的secret(密钥)api
咱们建立一个名为apiviewer
的ServiceAccount安全
[centos@k8s-master ~]$ kubectl create sa apiviewer serviceaccount/apiviewer created
咱们能够查看这个sa对应的secret的名字bash
[centos@k8s-master ~]$ kubectl get sa apiviewer -ojson { "apiVersion": "v1", "kind": "ServiceAccount", "metadata": { "creationTimestamp": "2019-05-27T08:09:56Z", "name": "apiviewer", "namespace": "default", "resourceVersion": "16750207", "selfLink": "/api/v1/namespaces/default/serviceaccounts/apiviewer", "uid": "d078f034-8056-11e9-99bc-0050568417a2" }, "secrets": [ { "name": "apiviewer-token-z5bpq" } ] }
咱们可使用secretes
里的name
去查看这个secretes的值iview
apiviewer-token-z5bpq[centos@k8s-master ~]$ kubectl describe secret apiviewer-token-z5bpq Name: apiviewer-token-z5bpq Namespace: default Labels: <none> Annotations: kubernetes.io/service-account.name: apiviewer kubernetes.io/service-account.uid: d078f034-8056-11e9-99bc-0050568417a2 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 7 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXZpZXdlci10b2tlbi16NWJwcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcGl2aWV3ZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMDc4ZjAzNC04MDU2LTExZTktOTliYy0wMDUwNTY4NDE3YTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDphcGl2aWV3ZXIifQ.GUd7uCwTntMXhwXEGFvo62tJBTVdI_SNATDIbuxINmbmBI2bjHuQ-whRE5183AXqWiifoM0HjOGoams11f_R2Dtak3fRxPLNRGGFTMyUN1uHmwedPmsAK0GTW0xPgInyIy4SF-uI7lghrpsRzBQ4AmA2AuctwCGdXUC3YuqrZPEnla3HeF6Tz72KpddlgiA3N1T5yvoOHPL4AgQRDPGKJ6L-nEdXumg3BlTWR0ENBNgzAz2eh6RZLRSsKlG0zQ8vhApkMGru7k5a_PKkU3Z3b0ZhKBKmE_LsMJ7bAunr9J9bbG--Id4rnuPpcj1DoJ0ZlJ3G1IP3xTUVncxO_gV4VQ
咱们熟练了可使用一条命令curl
apiviewer-token-z5bpq[centos@k8s-master ~]$ kubectl describe secret `kubectl get sa apiviewer -ojsonpath='{.secrets[0].name}'` Name: apiviewer-token-z5bpq Namespace: default Labels: <none> Annotations: kubernetes.io/service-account.name: apiviewer kubernetes.io/service-account.uid: d078f034-8056-11e9-99bc-0050568417a2 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 7 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXZpZXdlci10b2tlbi16NWJwcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcGl2aWV3ZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMDc4ZjAzNC04MDU2LTExZTktOTliYy0wMDUwNTY4NDE3YTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDphcGl2aWV3ZXIifQ.GUd7uCwTntMXhwXEGFvo62tJBTVdI_SNATDIbuxINmbmBI2bjHuQ-whRE5183AXqWiifoM0HjOGoams11f_R2Dtak3fRxPLNRGGFTMyUN1uHmwedPmsAK0GTW0xPgInyIy4SF-uI7lghrpsRzBQ4AmA2AuctwCGdXUC3YuqrZPEnla3HeF6Tz72KpddlgiA3N1T5yvoOHPL4AgQRDPGKJ6L-nEdXumg3BlTWR0ENBNgzAz2eh6RZLRSsKlG0zQ8vhApkMGru7k5a_PKkU3Z3b0ZhKBKmE_LsMJ7bAunr9J9bbG--Id4rnuPpcj1DoJ0ZlJ3G1IP3xTUVncxO_gV4VQ
固然,也可使用jq工具工具
[centos@k8s-master ~]$ kubectl describe secret `kubectl get sa apiviewer -ojson|jq -r .secrets[].name` Name: apiviewer-token-z5bpq Namespace: default Labels: <none> Annotations: kubernetes.io/service-account.name: apiviewer kubernetes.io/service-account.uid: d078f034-8056-11e9-99bc-0050568417a2 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 7 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXZpZXdlci10b2tlbi16NWJwcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcGl2aWV3ZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMDc4ZjAzNC04MDU2LTExZTktOTliYy0wMDUwNTY4NDE3YTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDphcGl2aWV3ZXIifQ.GUd7uCwTntMXhwXEGFvo62tJBTVdI_SNATDIbuxINmbmBI2bjHuQ-whRE5183AXqWiifoM0HjOGoams11f_R2Dtak3fRxPLNRGGFTMyUN1uHmwedPmsAK0GTW0xPgInyIy4SF-uI7lghrpsRzBQ4AmA2AuctwCGdXUC3YuqrZPEnla3HeF6Tz72KpddlgiA3N1T5yvoOHPL4AgQRDPGKJ6L-nEdXumg3BlTWR0ENBNgzAz2eh6RZLRSsKlG0zQ8vhApkMGru7k5a_PKkU3Z3b0ZhKBKmE_LsMJ7bAunr9J9bbG--Id4rnuPpcj1DoJ0ZlJ3G1IP3xTUVncxO_gV4VQ
咱们能够从头建立一个ClusterRole,可是k8s集群里默认也是有若干个ClusterRole的,咱们能够经过kubectl get clusterrole
来查看都有哪些clusterrole,这里咱们使用一个名为cluster-admin
,把刚建立的ServiceAccount与它绑定jsonp
建立RoleBinding的命令以下
[centos@k8s-master ~]$ kubectl create rolebinding apiadmin --clusterrole cluster-admin --serviceaccount default:apiviewer rolebinding.rbac.authorization.k8s.io/apiadmin created
获取Bearer Token、Certificate、API Server URL
[centos@k8s-master ~]$ SECRET=$(kubectl get serviceaccount ${SERVICE_ACCOUNT} -ojsonpath='{.secrets[0].name}')
这条命令用于获取SECRET的名称,上面咱们已经讲到过.
而后咱们就能够用secret的名称来获取token了,前面也是讲到过的
TOKEN=$(kubectl get secret ${SECRET} -ojsonpath='{.data.token}'|base64 -d)
使用jsonpath时,咱们须要预先知道json的结构,比较笨可是每每很是有效的办法是先把整个json所有输出出来,而后再根据结构截取.
因为token是通过base64编码过的,所以须要base64解码
下面从secret里把证书提取出来
kubectl get secret ${SECRET} -o jsonpath="{.data['ca\.crt']}" | base64 -d > /tmp/ca.crt
获取API Server URL,若是API Server部署在多台Master上,只需访问其中一台便可。
APISERVER=https://$(kubectl -n default get endpoints kubernetes --no-headers | awk '{ print $2 }' | cut -d "," -f 1)
经过jq -r提取全部的Pod名字
curl -s $APISERVER/api/v1/namespaces/default/pods/ --header "Authorization: Bearer $TOKEN" \ > --cacert /tmp/ca.crt | jq -r '.items[].metadata.name'
因为这里不是kubectl命令,没法再直接经过jsonpath过滤结果,这里咱们使用jq工具来过滤.关于jq工具本章节前面部分也有介绍.想详细了解的童鞋能够参考一下.