摘要:里面有個(gè)工具,叫,可以比較方便的調(diào)試應(yīng)用。項(xiàng)目的目錄下有個(gè)好用的腳本,它是通過在容器里啟動(dòng)各服務(wù)的。考慮可以在本地進(jìn)程啟動(dòng)服務(wù),這樣便可以當(dāng)作一個(gè)應(yīng)用去調(diào)試了。本文寫作時(shí)分支最新為。
openstack 搞了2年,對(duì)動(dòng)態(tài)語言的 debug 和 pdb念念不忘,總尋思著看 kubernetes代碼能不能和 openstack 一樣 pdb 一步步看下去。golang 里面有個(gè)debug 工具,叫 dlv,可以比較方便的調(diào)試 go 應(yīng)用。
kubernetes 項(xiàng)目的 hack 目錄下有個(gè)好用的 shell 腳本local-up-cluster.sh,它是通過_output/local/bin/linux/amd64/hyperkube在容器里啟動(dòng)k8s各服務(wù)的。考慮可以在本地進(jìn)程啟動(dòng) kubernetes 服務(wù),這樣便可以當(dāng)作一個(gè) go 應(yīng)用去調(diào)試了。本文寫作時(shí)kubernetes master 分支最新 commit id 為9884215f7976e8cc294fdbb62f8c2a6af9bca728。
linux 環(huán)境信息這里不再贅述,我用的是 centos 7.4 虛擬機(jī),配置是4C/16G/100G
$ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)go 環(huán)境安裝
Kubernetes requires go1.10.2 or greater. Please install go1.10.2 or later.
go版本要求大于1.10.2
# 具體參見 https://golang.org/doc/install wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz (具體參見) tar -C /usr/local/ -xzf go1.10.3.linux-amd64.tar.gz # 測(cè)試是否安裝成功 $ go version go version go1.10.3 linux/amd64 # 配置 go 環(huán)境 (建議直接將 export 內(nèi)容寫入到/etc/profile下) mkdir /go export GOPATH=/go export PATH=$PATH:/usr/local/go/bin export PATH=$PATH:/go/bin # 安裝 dlv go get -u github.com/derekparker/delve/cmd/dlv export PATH=$PATH:$GOPATH/bin # 下載 kubernetes 代碼放到 $GOPATH/src/k8s.io目錄下 (代碼較大,如果只要最新一次提交的代碼來加速下載,指定--depth=1) git clone https://github.com/kubernetes/kubernetes # 提供一個(gè)習(xí)慣訪問的 shell 腳本,可以不操作(因?yàn)楹竺鎲?dòng)的local-up-cluster 使用的是cluster 目錄下的kubectl.sh 來操作k8s 環(huán)境) cat<etcd 安裝/usr/local/bin/kubectl #!/bin/bash /go/src/k8s.io/kubernetes/cluster/kubectl.sh $@ EOF chmod +x /usr/local/bin/kubectl
etcd version 3.2.18 or greater required.
etcd 版本要求大于3.2.18
# 具體參見 https://github.com/coreos/etcd/releases wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz tar xzvf etcd-v3.3.9-linux-amd64.tar.gz -C /usr/local/ # 拷貝 bin 文件到/usr/local/bin下 cp /usr/local/etcd-v3.3.9-linux-amd64/etcd /usr/local/etcd-v3.3.9-linux-amd64/etcdctl /usr/local/bin # 測(cè)試是否安裝成功 etcd —versiondocker 安裝
# 安裝 docker repo(配了中科大源) sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i "s/download.docker.com/mirrors.ustc.edu.cn/docker-ce/g" /etc/yum.repos.d/docker-ce.repo yum makecache # 安裝 docker-ce sudo yum install -y docker-ce # 啟動(dòng) docker systemctl start docker systemctl enable dockerdocker 鏡像
由于安裝鏡像存在墻,提前準(zhǔn)備好 (感謝 anjia0532 提供的同步鏡像倉(cāng)庫)
docker pull anjia0532/pause-amd64:3.1 docker tag anjia0532/pause-amd64:3.1 k8s.gcr.io/pause:3.1 docker pull anjia0532/k8s-dns-kube-dns-amd64:1.14.10 docker tag anjia0532/k8s-dns-kube-dns-amd64:1.14.10 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.10 docker pull anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.10 docker tag anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.10 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.10 docker pull anjia0532/k8s-dns-sidecar-amd64:1.14.10 docker tag anjia0532/k8s-dns-sidecar-amd64:1.14.10 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.10修改 kubernetes 代碼
由于 local-up-cluster.sh 默認(rèn)使用的是 hyperkube 鏡像在容器中啟動(dòng) kuebrnetes 服務(wù),但是這樣不能使用 dlv 去調(diào)試代碼,那么需要在 host 進(jìn)程啟動(dòng),有兩種方案都可以試試,由于local-up-cluster.sh 會(huì)在本地編譯好代碼并放入到 _output/bin 中,那么可以直接通過寫 systemd 配置文件的方式在本地啟動(dòng)服務(wù); 還有一種是我選擇的,修改local-up-cluster.sh代碼,如下:
注意: 這個(gè)只在commit id: 30b89d830b7fd0827576853d6a0db44b66a90d3d 以后可用。之前的會(huì)編譯不成功,是因?yàn)閏md下沒有 kube-schduler 包,該目錄在plugins/cmd/kube-sheduler下,需要重寫規(guī)則。
啟動(dòng)集群通過執(zhí)行l(wèi)ocal-up-cluster.sh腳本啟動(dòng)集群
# 切換到 kubernetes 根目錄 $ pwd /go/src/k8s.io/kubernetes · $ ./hack/local-up-cluster.sh Kubelet cgroup driver defaulted to use: cgroupfs API SERVER insecure port is free, proceeding... API SERVER secure port is free, proceeding… ... ... Alternatively, you can write to the default kubeconfig: export KUBERNETES_PROVIDER=local cluster/kubectl.sh config set-cluster local --server=https://localhost:6443 --certificate-authority=/var/run/kubernetes/server-ca.crt cluster/kubectl.sh config set-credentials myself --client-key=/var/run/kubernetes/client-admin.key --client-certificate=/var/run/kubernetes/client-admin.crt cluster/kubectl.sh config set-context local --cluster=local --user=myself cluster/kubectl.sh config use-context local cluster/kubectl.sh # 驗(yàn)證集群是否成功 $ kubectl get componentstatus NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"}
這里有個(gè) tip, 在代碼中有個(gè)判斷 [ "x$GO_OUT" == "x” ], 也就是說如果第一次編譯生成 bin 包后,往后只要指定 GO_OUT 再次執(zhí)行就可以不再編譯。
我這里是: export GO_OUT=/go/src/k8s.io/kubernetes/_output/bin
調(diào)試舉例# 查找 并 kill 相關(guān)進(jìn)程 $ ps -ef | grep kubelet root 538 26665 0 17:14 pts/1 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn kubelet root 31690 30984 0 17:14 pts/0 00:00:00 sudo -E /go/src/k8s.io/kubernetes/_output/bin/kubelet --v=3 --vmodule= --chaos-chance=0.0 --container-runtime=docker --hostname-override=127.0.0.1 --cloud-provider= --cloud-config= --address=127.0.0.1 --kubeconfig /var/run/kubernetes/kubelet.kubeconfig --feature-gates=AllAlpha=false --cpu-cfs-quota=true --enable-controller-attach-detach=true --cgroups-per-qos=true --cgroup-driver=cgroupfs --eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5% --eviction-soft= --eviction-pressure-transition-period=1m --pod-manifest-path=/var/run/kubernetes/static-pods --fail-swap-on=false --cluster-dns=10.0.0.10 --cluster-domain=cluster.local --port=10250 root 31693 31690 3 17:14 pts/0 00:00:01 /go/src/k8s.io/kubernetes/_output/bin/kubelet --v=3 --vmodule= --chaos-chance=0.0 --container-runtime=docker --hostname-override=127.0.0.1 --cloud-provider= --cloud-config= --address=127.0.0.1 --kubeconfig /var/run/kubernetes/kubelet.kubeconfig --feature-gates=AllAlpha=false --cpu-cfs-quota=true --enable-controller-attach-detach=true --cgroups-per-qos=true --cgroup-driver=cgroupfs --eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5% --eviction-soft= --eviction-pressure-transition-period=1m --pod-manifest-path=/var/run/kubernetes/static-pods --fail-swap-on=false --cluster-dns=10.0.0.10 --cluster-domain=cluster.local --port=10250 $ kill -9 31690 $ kill -9 31693 # 我移除了部分配置項(xiàng),否則報(bào)錯(cuò) $ dlv --headless -l 127.0.0.1:1234 exec /go/src/k8s.io/kubernetes/_output/bin/kubelet -- --v=3 --vmodule= --chaos-chance=0.0 --container-runtime=docker --hostname-override=127.0.0.1 --cloud-provider= --cloud-config= --address=127.0.0.1 --kubeconfig /var/run/kubernetes/kubelet.kubeconfig --feature-gates=AllAlpha=false --cpu-cfs-quota=true --enable-controller-attach-detach=true --cgroups-per-qos=true --cgroup-driver=cgroupfs --eviction-soft= --eviction-pressure-transition-period=1m --pod-manifest-path=/var/run/kubernetes/static-pods --fail-swap-on=false --cluster-dns=10.0.0.10 --cluster-domain=cluster.local --port=10250 # 開始調(diào)試 dlv connect 127.0.0.1:1234 (dlv) b main.main (dlv) c (dlv) args (dlv) p
備注:
這只是我初步實(shí)現(xiàn)的一個(gè)方案,并沒有結(jié)合它深度使用,后續(xù)有新技能再更新上來
如果照著我的步驟卡住了,考慮下是不是配個(gè)梯子( https://www.zfl9.com/ss-local... )
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/32683.html
摘要:參考官方文檔進(jìn)行操作本文假設(shè)環(huán)境正常運(yùn)行,并且已經(jīng)安裝。只能以單副本運(yùn)行部署運(yùn)行命令來安裝等待一段時(shí)間執(zhí)行完成后,通過如下命令確定集群是否成功運(yùn)行檢查的狀態(tài)檢查集群狀態(tài)至此,集群部署完成。 參考 ceph 官方文檔進(jìn)行操作: http://docs.ceph.com/docs/mas... 本文假設(shè)kubernetes 環(huán)境正常運(yùn)行,并且 host 已經(jīng)安裝 helm client。 ...
摘要:節(jié)點(diǎn)對(duì)不會(huì)有影響,查詢處于狀態(tài)并一直保持。根據(jù)上一節(jié)描述,此時(shí)已經(jīng)有正確的在其他節(jié)點(diǎn),此時(shí)故障節(jié)點(diǎn)恢復(fù)后,執(zhí)行優(yōu)雅刪除,刪除舊的。會(huì)從狀態(tài)變?yōu)闋顟B(tài),執(zhí)行優(yōu)雅刪除,,然后執(zhí)行重新調(diào)度與重建操作。會(huì)從狀態(tài)直接變成狀態(tài),不涉及重建。 節(jié)點(diǎn)離線后的 pod 狀態(tài) 在 kubernetes 使用過程中,根據(jù)集群的配置不同,往往會(huì)因?yàn)槿缦虑闆r的一種或幾種導(dǎo)致節(jié)點(diǎn) NotReady: kubele...
摘要:全球范圍內(nèi)的部署節(jié)點(diǎn)已超過個(gè),付費(fèi)客戶超過個(gè)。因此,我們決定重新設(shè)計(jì),將過去大受用戶歡迎的用戶體驗(yàn)即架構(gòu)于之上,從而充分利用的強(qiáng)大力量。因此,很快成為啟動(dòng)集群的最受歡迎的方式之一。年,的流行度在持續(xù)上升,且這一勢(shì)頭從未放緩。 經(jīng)過數(shù)月的努力,我們終于發(fā)布了Rancher 2.0 Technology Preview,這對(duì)Rancher Labs而言也是歷史性的、值得銘記的一刻。 Ran...
摘要:全球范圍內(nèi)的部署節(jié)點(diǎn)已超過個(gè),付費(fèi)客戶超過個(gè)。因此,我們決定重新設(shè)計(jì),將過去大受用戶歡迎的用戶體驗(yàn)即架構(gòu)于之上,從而充分利用的強(qiáng)大力量。因此,很快成為啟動(dòng)集群的最受歡迎的方式之一。年,的流行度在持續(xù)上升,且這一勢(shì)頭從未放緩。 經(jīng)過數(shù)月的努力,我們終于發(fā)布了Rancher 2.0 Technology Preview,這對(duì)Rancher Labs而言也是歷史性的、值得銘記的一刻。 Ran...
摘要:渲染節(jié)點(diǎn)并指明它們的總體狀態(tài)。為節(jié)點(diǎn)和提供工具提示信息。作為一個(gè)日志查看器,允許你使用選擇器從匹配的流式的查看日志。日志查看器你可以基于標(biāo)準(zhǔn)的標(biāo)簽選擇器匹配,通過名字,通過服務(wù),通過部署,等等。使得和團(tuán)隊(duì)在容器排錯(cuò)和安全調(diào)查方面很方便。 如果你正在 Kubernetes 上工作,你的 SRE 和 Ops 團(tuán)隊(duì)需要正確的工具來確保Kubernetes集群的高可用和在其中運(yùn)行的工作負(fù)載。這...
閱讀 2109·2023-04-26 02:41
閱讀 2153·2021-09-24 09:47
閱讀 1560·2019-08-30 15:53
閱讀 1214·2019-08-30 13:01
閱讀 1894·2019-08-29 11:27
閱讀 2868·2019-08-28 17:55
閱讀 1778·2019-08-26 14:00
閱讀 3393·2019-08-26 10:18