日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

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

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

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

如何通過(guò)抓包來(lái)查看Kubernetes API流量?

 

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

從kubeconfig中提取出客戶端證書和私鑰

kubeconfig中包含了客戶端的證書和私鑰,我們首先要把它們提取出來(lái):

# 提取出客戶端證書

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 [2]

配置Charles代理軟件

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

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

如何通過(guò)抓包來(lái)查看Kubernetes API流量?

 

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

如何通過(guò)抓包來(lái)查看Kubernetes API流量?

 

配置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)求了:

如何通過(guò)抓包來(lái)查看Kubernetes API流量?

 

可以看到,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

也同樣可以抓到包:

如何通過(guò)抓包來(lái)查看Kubernetes API流量?

 

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

配置kubenetes client

我們先從寫一個(gè)用kubernetes go client來(lái)獲取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: %sn", 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-xtfrz
done!

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

如何通過(guò)抓包來(lái)查看Kubernetes API流量?

 

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

原文鏈接:
https://mp.weixin.qq.com/s?__biz=MzI2ODQ0MDk3Nw==&mid=2247483803&idx=1&sn=034049863298f4f9ae345fdab1e218af&utm_source=tuicool&utm_medium=referral

分享到:
標(biāo)簽:Kubernetes
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定