这篇文章结合curl命令介绍一下使用token方式访问Restful API的方式。
快速环境搭建建议使用单机版Kubernetes的安装脚本,一键安装,详情可参看:
环境信息如下所示
[root@host132 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
192.168.163.132 Ready 32m v1.15.0 192.168.163.132 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.9.7
[root@host132 ~]#
可以通过确认/api来确认api是否可以访问,使用token方式可以使用如下示例方式进行,curl的选项设定说明如下:
设定项 | 设定说明 |
---|---|
insecure | 制定-k或者--insecure可以不用指定证书的方式来访问https的资源 |
header | 在Header中设定格式为Authorization: bearer token信息的内容,在kubernetes中使用token的方式访问api |
[root@host132 ~]# curl --insecure https://192.168.163.132:6443/api --header "Authorization: bearer 00fdeedfa65384fe4dca538a54a0e8a1"
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "192.168.163.132:6443"
}
]
}[root@host132 ~]#
使用-k或者--secure在curl命令中可以避免指定CA证书来进行访问,但是也可以通过指定证书的方式进行访问,具体示例方式如下所示
设定项 | 设定说明 |
---|---|
cacert | 指定CA证书 |
key | 指定客户端所用到的私钥(此处为admin权限) |
cert | 指定客户端所用到的证书(此处为admin权限) |
[root@host132 ~]# curl https://192.168.163.132:6443/api/v1/namespaces --cacert /etc/ssl/ca/ca.pem --key /etc/ssl/k8s/kubeadmin-key.pem --cert /etc/ssl/k8s/kubeadmin.pem
{
"kind": "NamespaceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces",
"resourceVersion": "4360"
},
"items": [
{
"metadata": {
"name": "default",
"selfLink": "/api/v1/namespaces/default",
"uid": "615afada-d48c-4e54-a638-8dbb6e1aa139",
"resourceVersion": "154",
"creationTimestamp": "2019-08-30T19:02:35Z"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
},
{
"metadata": {
"name": "kube-node-lease",
"selfLink": "/api/v1/namespaces/kube-node-lease",
"uid": "c37cd5ec-ef7b-4e8e-9c04-ab31283b4c3b",
"resourceVersion": "11",
"creationTimestamp": "2019-08-30T19:02:32Z"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
},
{
"metadata": {
"name": "kube-public",
"selfLink": "/api/v1/namespaces/kube-public",
"uid": "5f2beede-2635-4a5a-a762-1b0670ba2b55",
"resourceVersion": "5",
"creationTimestamp": "2019-08-30T19:02:32Z"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
},
{
"metadata": {
"name": "kube-system",
"selfLink": "/api/v1/namespaces/kube-system",
"uid": "8f67dacb-5f51-4eb6-a7d5-bf1f72bc3134",
"resourceVersion": "4",
"creationTimestamp": "2019-08-30T19:02:32Z"
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
}
]
}[root@host132 ~]#
在curl中通过指定-k或者--insecure方式可以可以不使用证书的方式进行访问,结合token其实只需要指定ca证书即可。curl的选项设定说明如下:
设定项 | 设定说明 |
---|---|
header | 在Header中设定格式为Authorization: bearer token信息的内容,在kubernetes中使用token的方式访问api |
cacert | 指定CA证书 |
使用示例如下所示
[root@host132 ~]# curl https://192.168.163.132:6443/api/v1/namespaces --header "Authorization: bearer 00fdeedfa65384fe4dca538a54a0e8a1" --cacert /etc/ssl/ca/ca.pem 2>/dev/null |grep name
"selfLink": "/api/v1/namespaces",
"name": "default",
"selfLink": "/api/v1/namespaces/default",
"name": "kube-node-lease",
"selfLink": "/api/v1/namespaces/kube-node-lease",
"name": "kube-public",
"selfLink": "/api/v1/namespaces/kube-public",
"name": "kube-system",
"selfLink": "/api/v1/namespaces/kube-system",
[root@host132 ~]#
原因:往往是权限设定不正确,比如使用token的情况下,token不正确,或者Header中设定的信息不正确
对应方法:在header中token信息即可
示例如下所示:
[root@host132 ~]# curl --insecure https://192.168.163.132:6443/api/v1/namespaces
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "Unauthorized",
"reason": "Unauthorized",
"code": 401
}[root@host132 ~]#
原因:最为常见的是在RBAC的情况执行,未正确设定相关用户的RBAC权限。
对应方法:指定正确的证书或者给予token中使用的用户有足够的权限
示例如下所示:
[root@host132 ~]# curl --insecure https://192.168.163.132:6443/api/v1/namespaces --header "Authorization: bearer 00fdeedfa65384fe4dca538a54a0e8a1"
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "namespaces is forbidden: User \"kubelet-bootstrap\" cannot list resource \"namespaces\" in API group \"\" at the cluster scope",
"reason": "Forbidden",
"details": {
"kind": "namespaces"
},
"code": 403
}[root@host132 ~]#
另外一种比较粗暴的对应方式,可以直接将K8S建议的RBAC关闭,并允许匿名登陆,使用本文提到的Ansible脚本中也会设定为RABC以及匿名访问静止,觉得学习API时不方便可以直接关闭,对应的方式为将apiserver的服务中的如下两项删除即可。
--authorization-mode=RBAC,Node
--anonymous-auth=false