zoukankan      html  css  js  c++  java
  • kubernetes之使用http rest api访问集群

    系列目录

    在Kubernetes集群中,API Server是集群管理API的入口,由运行在Master节点上的一个名为kube-apiserver的进程提供的服务。 用户进入API可以通过kubectl、客户端库或者http rest,User 或者 Service Account可以被授权进入API。当一个请求到达API时, 往往要经过几个阶段的安全控制,在一个典型的应用集群中,API Server通常会使用自签名的证书提供HTTPS服务,同时开启认证与授权等安全机制。

    通常,在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, 但是不推荐。

    创建ServiceAccount

    前面我们讲到过ServiceAccount,它类似于传统登陆里的用户.创建一个ServiceAccount以后,会自动为它创建一个关联的secret(密钥)

    我们创建一个名为apiviewer的ServiceAccount

    [centos@k8s-master ~]$ kubectl create sa apiviewer
    serviceaccount/apiviewer created
    

    我们可以查看这个sa对应的secret的名字

    [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的值

    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
    
    

    我们熟练了可以使用一条命令

    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、RoleBinding

    我们可以从头创建一个ClusterRole,但是k8s集群里默认也是有若干个ClusterRole的,我们可以通过kubectl get clusterrole来查看都有哪些clusterrole,这里我们使用一个名为cluster-admin,把刚创建的ServiceAccount与它绑定

    创建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工具本章节前面部分也有介绍.想详细了解的童鞋可以参考一下.

  • 相关阅读:
    underscore相关记录
    背包问题
    数学图形(2.26) 3D曲线结
    数学图形(1.41)super spiral超级螺线
    数学图形(2.25)三维悬链线与悬链面
    数学图形(2.24) 帖在圆柱面上的曲线
    数学图形(2.23)Cylindric sine wave柱面正弦曲线
    数学图形(2.22) 帖在圆锥面上的曲线
    数学图形(2.21) 帖在抛物面上的曲线
    数学图形(2.20)3D曲线
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/11094872.html
Copyright © 2011-2022 走看看