使用抓包软件(WireShark、Charles)查看kubectl访问apiserver的请求信息
在进行运维 paas 平台开发时,我们会经常接触到需要调 Kuberenetes api 的情况。因为云厂商只封装了部分的 Kuberenetes api 提供接口访问,部分 API 如获取 event ,云厂商还是建议使用原生的 Kuberenetes api 去做请求,这就要求我们对 k8s api 有相当的熟悉度,这可能需要详细阅读官方的 API 文档。本文提供一种方式,通过探查 kubec
目录
应用背景
在进行运维 paas 平台开发时,我们会经常接触到需要调 Kuberenetes api 的情况。因为云厂商只封装了部分的 Kuberenetes api 提供接口访问,部分 API 如获取 event ,云厂商还是建议使用原生的 Kuberenetes api 去做请求,这就要求我们对 k8s api 有相当的熟悉度,这可能需要详细阅读官方的 API 文档。本文提供一种方式,通过探查 kubectl 请求时与 apiserver 的交互数据,来熟悉这些相关接口。
Kuberenetes 客户端和服务端交互的接口,是基于http协议的。所以只需要能够捕捉并解析 https 流量,我们就能看到kubernetes的API流量。
但是由于 kubenetes 使用了客户端私钥来实现对客户端的认证,所以抓包配置要复杂一点。具体是如下的结构:
更多的证书参考资料请见这篇文章:
从kubeconfig中提取出客户端证书和私钥
kubeconfig中包含了客户端的证书和私钥,我们首先要把它们提取出来:
# 提取出客户端证书
grep client-certificate-data ~/.kube/config | \
awk '{ print $2 }' | \
base64 --decode > client-cert.pem
# 提取出客户端私钥
grep client-key-data ~/.kube/config | \
awk '{ print $2 }' | \
base64 --decode > client-key.pem
配置Charles代理软件
从第一张图可以看出,代理软件的作用有两个:一是接收https流量并转发,二是转发到kubernetes apiserver的时候,使用指定的客户端私钥。
首先配置Charles,让他拦截所有的https流量:
然后配置客户端私钥,即对于发送到apiserver的请求,统一使用指定的客户端私钥进行认证:
配置kubectl
首先需要配置匿名用户的RBAC访问权限,因为是测试环境,所以我们直接为匿名用户配置了admin系统管理员权限,如果要进行严格的权限管理,可以在用户名上收口或者配置clusterrole的只读权限
#为匿名用户配置cluster-admin的clusterrole,其中包含有管理员所具备的权限
kevinzhang@KevindeMacBook-Pro ~ % kubectl create clusterrolebinding cluster-system-anonymons --clusterrole=cluster-admin --user=system:anonymous
抓包kubectl的流量,需要两个条件:1. kubectl使用Charles作为代理,2. kubectl需要信任Charles的证书。
# Charles的代理端口是8888,设置https_proxy环境变量,让kubectl使用Charles代理
kevinzhang@KevindeMacBook-Pro ~ % export https_proxy=http://127.0.0.1:8888/
# insecure-skip-tls-verify表示不校验服务端证书
kevinzhang@KevindeMacBook-Pro ~ % kubectl --insecure-skip-tls-verify get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-4c6pn 1/1 Running 4 (7d22h ago) 39d
nginx-6799fc88d8-fgwgl 1/1 Running 3 (7d22h ago) 30d
nginx-6799fc88d8-pnsjg 1/1 Running 4 (7d22h ago) 39d
我们就可以看到get pod
的网络请求了:
基于此,我们就可以分析一个Kubernetes到底干了什么,也是我们分析Kubernetes实现的入口。
参考链接:
更多推荐
所有评论(0)