Kubernetes基础:Token方式使用Restful API

在这里插入图片描述
这篇文章结合curl命令介绍一下使用token方式访问Restful API的方式。

环境准备

快速环境搭建建议使用单机版Kubernetes的安装脚本,一键安装,详情可参看:

  • Kubernetes单机版快速安装(Ansible脚本版)

环境信息如下所示

[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来确认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 ~]#

安全方式使用API

在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 ~]# 

常见错误

  • Unauthorized错误信息提示

原因:往往是权限设定不正确,比如使用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 ~]#
  • Forbidden提示信息

原因:最为常见的是在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

其他基础

  • 再探kubernetes

你可能感兴趣的:(#,深入浅出kubernetes)