国产精品chinese,色综合天天综合精品网国产在线,成午夜免费视频在线观看,清纯女学生被强行糟蹋小说

    <td id="ojr13"><tr id="ojr13"><label id="ojr13"></label></tr></td>
        • <source id="ojr13"></source>
            <td id="ojr13"><ins id="ojr13"><label id="ojr13"></label></ins></td>

            Article / 文章中心

            如何通過抓包來查看Kubernetes API流量

            發(fā)布時(shí)間:2021-11-22 點(diǎn)擊數(shù):1001

            當(dāng)我們通過kubectl來查看、修改Kubernetes資源時(shí),有沒有想過后面的接口到底是怎樣的?有沒有辦法探查這些交互數(shù)據(jù)呢?

            Kuberenetes客戶端和服務(wù)端交互的接口,是基于http協(xié)議的。所以只需要能夠捕捉并解析https流量,我們就能看到kubernetes的API流量。

            但是由于kubenetes使用了客戶端私鑰來實(shí)現(xiàn)對(duì)客戶端的認(rèn)證,所以抓包配置要復(fù)雜一點(diǎn)。具體是如下的結(jié)構(gòu):

             

            如果想了解更多Kubernetes證書的知識(shí),可以看下這篇Kubernetes證書解析的文章

            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# 提取出服務(wù)端CA證書

            grep certificate-authority-data ~/.kube/config | \

              awk '{ print $2 }' | \

              base64 --decode > cluster-ca-cert.pem

            參考自Reddit

            配置Charles代理軟件

            從第一張圖可以看出,代理軟件的作用有兩個(gè):一是接收https流量并轉(zhuǎn)發(fā),二是轉(zhuǎn)發(fā)到kubernetes apiserver的時(shí)候,使用指定的客戶端私鑰。

            首先配置Charles,讓他攔截所有的https流量:

             

            然后配置客戶端私鑰,即對(duì)于發(fā)送到apiserver的請(qǐng)求,統(tǒng)一使用指定的客戶端私鑰進(jìn)行認(rèn)證:

             

            配置kubectl

            需要抓包kubectl的流量,需要兩個(gè)條件:1. kubectl使用Charles作為代理,2. kubectl需要信任Charles的證書。

            # Charles的代理端口是8888,設(shè)置https_proxy環(huán)境變量,讓kubectl使用Charles代理

            $ export https_proxy=http://127.0.0.1:8888/# insecure-skip-tls-verify表示不校驗(yàn)服務(wù)端證書

            $ kubectl --insecure-skip-tls-verify get pod

            NAME                    READY   STATUS    RESTARTS   AGE

            sc-b-7f5dfb694b-xtfrz   2/2     Running   0          2d20h

            我們就可以看到get pod的網(wǎng)絡(luò)請(qǐng)求了:

             

            可以看到,get pod的endpoint是GET /api/v1/namespaces/<namespace>/pods

            讓我們?cè)賴L試下創(chuàng)建pod的請(qǐng)求:

            $ cat <<EOF >pod.yaml

            apiVersion: v1

            kind: Pod

            metadata:

              name: nginx-robberphex

            spec:

              containers:

              - name: nginx

                image: nginx:1.14.2

            EOF

            $ kubectl --insecure-skip-tls-verify apply -f pod.yaml

            pod/nginx-robberphex created

            也同樣可以抓到包:

             

            創(chuàng)建pod的endpoint是POST /api/v1/namespaces/<namespace>/pods

            配置kubenetes client

            我們先從寫一個(gè)用kubernetes go client來獲取pod的例子(注意,代碼中已經(jīng)信任所有的證書,所以可以抓到包):

            package main

            /*

            require (

                k8s.io/api v0.18.19

                k8s.io/apimachinery v0.18.19

                k8s.io/client-go v0.18.19

            )

            */import (

                "context"

                "flag"

                "fmt"

                "path/filepath"

             

                apiv1 "k8s.io/api/core/v1"

                metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

                "k8s.io/client-go/kubernetes"

                "k8s.io/client-go/tools/clientcmd"

                "k8s.io/client-go/util/homedir"

            )

            func main() {

                ctx := context.Background()

                var kubeconfig *string

                if home := homedir.HomeDir(); home != "" {

                    kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")

                } else {

                    kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")

                }

                flag.Parse()

             

                config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

                if err != nil {

                    panic(err)

                }

                // 讓clientset信任所有證書

                config.TLSClientConfig.CAData = nil

                config.TLSClientConfig.Insecure = true

                clientset, err := kubernetes.NewForConfig(config)

                if err != nil {

                    panic(err)

                }

                podClient := clientset.CoreV1().Pods(apiv1.NamespaceDefault)

                podList, err := podClient.List(ctx, metav1.ListOptions{})

                if err != nil {

                    panic(err)

                }

             

                for _, pod := range podList.Items {

                    fmt.Printf("podName: %s\n", pod.Name)

                }

             

                fmt.Println("done!")

            }

            然后編譯執(zhí)行:

            $ go build -o kube-client

            $ export https_proxy=http://127.0.0.1:8888/

            $ ./kube-client

            podName: nginx-robberphex

            podName: sc-b-7f5dfb694b-xtfrzdone!

            這時(shí)也可以抓到同樣的結(jié)果:

             

            基于此,我們就可以分析一個(gè)Kubernetes到底干了什么,也是我們分析Kubernetes實(shí)現(xiàn)的入口。

             

             

            版權(quán)聲明:本文內(nèi)容轉(zhuǎn)發(fā)自阿里云社區(qū),由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn)!版權(quán)歸原作者所有本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本中有涉嫌抄襲的內(nèi)容,請(qǐng)聯(lián)系站內(nèi)客服,本將立刻刪除涉嫌侵權(quán)內(nèi)容。