kubemark模擬k8s計算節點,測試k8s組件性能

需求

物理計算節點有限,難以測試網絡組件的性能滿不知足5000節點集羣需求,在開發測試階段知道網絡插件的性能相當重要。所以使用kubemark來模擬計算節點,都知道使用kubemark須要一個真實的k8s集羣和一個kubemark集羣。真實的k8s集羣已搭建完畢,下面須要搭建kubemark虛擬集羣。並在虛擬集羣中替換本身客製化的組件。node

安裝kubemark集羣

參考k8s官方文檔(連接1):
https://github.com/kubernetes/community/blob/452f681d92d98d6d62dfb24fbc9c8da10935632c/contributors/devel/sig-scalability/kubemark-setup-guide.md
若是以上連接打不開能夠先到https://github.com/kubernetes/community/頁面,在搜索欄裏輸入kubemark進行搜索,應該能找到。

git

構建kubemark鏡像

你能夠下載已經編譯好的鏡像,也能夠本身編譯代碼
docker pull staging-k8s.gcr.io/kubemark:latest
若是你下載不了,那麼感謝偉大的網友ss104301,能夠在https://hub.docker.com/網站找到kubemark鏡像,用命令docker pull ss104301/kubemark 下載鏡像便可。可是若是你須要定製化kubemark那麼就須要本身編譯kubemark鏡像。編譯本身的kubemark鏡像不像想象中那麼複雜,按照連接1給出的三個步驟便可順利的編譯,這三個步驟在此重複一下:

github

  • i. 下載kurbernetes源碼
    下載和external-cluster一致的kubernetes release版本,我下載的是kubernetes-release-1.14.zip這個文件。裏面已經包含了vendor目錄,無需本身再下載第三方庫
  • ii. 編譯kubemark二進制文件
    設置好GOPATH環境變量,而後執行命令
    ./hack/build-go.sh cmd/kubemark/
    cp $GOPATH/src/k8s.io/kubernetes/_output/bin/kubemark $GOPATH/src/k8s.io/kubernetes/cluster/images/kubemark/

  • iii. 構建kubemark鏡像
    cd $GOPATH/src/k8s.io/kubernetes/cluster/images/kubemark/
    make build
    這裏Dockerfile中寫明該鏡像From debian:jessie, 我從debian官網中看到debian:jessie就是debian8,而後到https://hub.docker.com/中找到匹配的版本鏡像下載到本地並用命令docker tag打上標籤debian:jessie, 而後運行上面的命令就能編譯出staging-k8s.gcr.io/kubemark:latest本地鏡像。注意,編譯的環境要求能連外網。
  • iv. 推送kubemark鏡像
    docker tag staging-k8s.gcr.io/kubemark:latest {{kubemark_image_registry}}/kubemark:{{kubemark_image_tag}}
    docker push {{kubemark_image_registry}}/kubemark:{{kubemark_image_tag}}

建立hollow節點

  • 建立namespace, configmap 和 secret
    文章開頭提到kubemark方案須要一個真實的k8s集羣,這裏kubemark使用該集羣的config.注意--from-file後面最好放決對路徑,不然會在命令執行的當前找配置文件。或者到文件所在的目錄下執行命令。
kubectl create ns kubemark
kubectl create configmap node-configmap -n kubemark --from-literal=content.type="test-cluster"
kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=path/to/kubeletcfg --from-file=kubeproxy.kubeconfig=path/to/kubeproxycfg

個人環境用的配置文件路徑分別是/etc/kubernetes/kubelet.kubeconfig和/etc/kubernetes/kube-proxy.kubeconfig,這裏要仔細覈對,不要填錯了。docker

kubectl create -f hollow-node_simplified_template.yaml

hollow節點排錯

查看hollow-node pods,看出並不正常

describe其中一個pod,發現報錯"NetworkPlugin cni failed to set up pod "hollow-node-pvp57_kubemark" network: Voyage:Error making request to create endpoint". 這是由於,咱們的真實節點使用的是自定義的網絡插件voyage,而下載的鏡像是沒有這個組件的。怎麼辦呢?一步一步來。

網絡

清除網絡插件配置,使hollow-node pods能運行起來

由於目前external-cluster使用的是CNI網絡模式,而kubemark集羣中並無該網絡插件,所以,我先把網絡調試調整成hostonly模式,修改/etc/kurbenetes/kubelet文件中的KUBELET_ARGS配置,使--network-plugin值爲空重啓kubelet,從新建立kubemark集羣。但集羣仍是起不來,查看各個相關pod的logide

[root@k8s-master kubernetes]# kubectl log -n kubemark hollow-node-48wb8 hollow-proxy

能夠看出,找不到kubelet配置文件中的ssl認證文件,這時須要修改hollow-node_simplified_template.yaml添加volume共享配置函數

volumes:      
      - name: sslconfig-volume
        hostPath:
          path: /etc/kubernetes/ssl/
      ...
      volumeMounts:        
      - name: sslconfig-volume
        mountPath: /etc/kubernetes/ssl/

而後從新建立,hollow-node pod終於Running起來了,可是查看節點信息,並無多出來節點。再次查看hollow-node pod的log, 報錯以下:性能

I0331 08:37:56.990844       7 kubelet_node_status.go:72] Attempting to register node hollow-node-c229t
E0331 08:37:56.991809       7 kubelet_node_status.go:94] Unable to register node "hollow-node-c229t" with API server: nodes "hollow-node-c229t" is forbidden: node "k8s-master" is not allowed to modify node "hollow-node-c229t"
E0331 08:37:56.997823       7 kubelet.go:2246] node "hollow-node-c229t" not found
E0331 08:37:57.298099       7 kubelet.go:2246] node "hollow-node-c229t" not found

經查看,是證書的問題,由於咱們的external-cluster開啓了驗證,所以要給每一個follow-node指定一個證書。RC改變爲使用statefulset,由於這樣pod的名稱是有必定的規律的,方便證書的生產。後面會附上修改的hollow-node.yaml文件。測試

編譯e2e

仍是到編譯kubemark的目錄,設置好GOPATH環境變量。而後輸入命令 make WHAT="test/e2e/e2e.test" ,就在_output/bin目錄中生成了e2e.test二進制文件。網站

測試性能

這裏須要先安裝ginkgo和gomega,生成kubeconfig文件:kubectl config view -o yaml >> /root/.kube/config . 而後引用上面編譯好的e2e二進制文件

_output/bin/e2e.test --kube-master=10.27.244.161 --host=http://10.27.244.161:8080 --ginkgo.focus=":Performance]" --provider=local --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --num-nodes=2 --v=3 > performance.log

而後查看 "pods creation" 關鍵字來看建立花費的時間。

修改kubemark網絡插件

kubemark使用的網絡組件是默認的fake cri networking,叫作kubernetes.io/no-op.所以通常狀況下不須要部署網絡插件,虛擬節點上的容器也會獲得一個IP. 可是若是你須要測試本身的網絡插件的性能,那麼就須要修改kubemark源代碼,在hollow_kubelet.go文件中的GetHollowKubeletConfig函數中添加f.ContainerRuntimeOptions.NetworkPluginName = "cni"便可。注意編譯的時候須要先把_output文件夾刪除,不然不生效。可是注意,當使用本身的網絡插件時,可能須要修改kubelet/dockershim/docker_sandbox.go中的getIPFromPlugin函數。根據插件的不一樣獲取插件指定的IP,不然kubectl查看到的Pod的IP是hollow-node的IP。
網絡插件的進程也須要有hollow-node pod在啓動時帶起來,讓網絡插件守護進程跑在虛擬節點pod裏,監聽kubelet的調用。其實虛擬節點上的kubelet進程也是被hollow-node pod啓動時帶起來的。

修改虛擬節點的資源配置

kubemark建立的hollow-node使用的是cadvisor_fake.go中的默認資源值例如FakeNumCores(CPU核數),FakeMemoryCapacity(內存大小)等等。若是須要修改就修改這裏或者引用這些數值的地方,而後從新編譯。

屏蔽PreStop處理代碼

由於kubemark建立的pod是不真實調用docker-cri接口的,也就是說並無真實的pod被建立出來。當pod銷燬時有PreStop事件須要處理的話,那麼會crash,因此須要屏蔽kubelet/kuberuntime/kuberuntime_container.go中的函數executePreStopHook處理PreStop的代碼。

相關文章
相關標籤/搜索