kubectl logs、exec、port-forward 執(zhí)行失敗問題解決

問題描述

master節(jié)點上執(zhí)行kbuectl logs / exec / port-forward等命令均異常,具體表現(xiàn)如下:

root@master1:~# kubectl logs pod-name
Error from server (NotFound): the server could not find the requested resource ( pods/log kubia-manual)

root@master1:~# kubectl exec -it pod-name /bin/bash
error: unable to upgrade connection: pod does not exist

root@master1:~# kubectl port-forward pod-name 8888:8080
error: error upgrading connection: unable to upgrade connection: pod does not exist

不僅如此,執(zhí)行任何pod操作或查看屬于pod的子資源,都會顯示 pod 不存在。

問題原因

原因是因為,我是用的VirtualBox虛擬化出了兩臺 ubuntu 主機搭建的 k8s ,詳見 virtualbox 虛擬機組網(wǎng) 。在組網(wǎng)的過程中,我采用了雙網(wǎng)卡方案,網(wǎng)卡1使用NAT地址轉(zhuǎn)換用來訪問互聯(lián)網(wǎng),網(wǎng)卡2使用Host-only來實現(xiàn)虛擬機互相訪問。而 k8s 默認(rèn)使用了網(wǎng)卡1的 ip 地址,這就導(dǎo)致了 工作節(jié)點的 ip 地址使用的是網(wǎng)卡1的 NAT 地址轉(zhuǎn)換地址(不可以訪問其他虛擬機),從而導(dǎo)致的問題的產(chǎn)生。

問題發(fā)現(xiàn)

如果你確定自己就是因為這個問題的話,可以跳過這一節(jié)直接執(zhí)行 解決方案 中的名命令來嘗試恢復(fù),或者你也可以通過如下方式來檢查自己的kubectl命令無法執(zhí)行是否也是該問題導(dǎo)致的:

在使用命令時攜帶-v=9參數(shù)來提高日志的輸出等級,如下:

kubectl logs kubia-manual -v=9

從輸出圖中可以看到,kubectl先去訪問了本機的apiserver來獲取目標(biāo)pod的信息(藍(lán)框1,本機 ip 為192.168.56.11),返回結(jié)果正常,但是進一步去請求podlog資源的時候就出現(xiàn)了 404 的情況(藍(lán)框2),而當(dāng)我們仔細(xì)查看pod的信息時,可以發(fā)現(xiàn) 它的hostIP居然是 NAT 地址轉(zhuǎn)換模式的默認(rèn)地址10.0.2.15! (紅框)。

logs 命令的日志輸出

解決方案

因為這個地址是工作節(jié)點上的kubelet自動生成并發(fā)給管理節(jié)點的,所以現(xiàn)在我們要登錄工作節(jié)點,然后手動指定他的 ip 地址:

在 kubelet 啟動時指定 ip

首先修改文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf,低版本的 ubuntu 中該文件可能位于/etc/systemd/kubelet.service.d/目錄下:

sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

然后添加在ExecStart行之前新增一行,內(nèi)容為:Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.56.21",注意!這個 ip 地址要填寫你 當(dāng)前節(jié)點的 ip 地址,這個 ip 是可以正常訪問管理節(jié)點的網(wǎng)卡 ip,如下:

EnvironmentFile=-/etc/default/kubelet
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet 
Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.56.21"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

添加完成后:wq保存退出,然后重啟kubelet

重啟 kubelet

執(zhí)行下面命令即可:

systemctl stop kubelet.service && \
systemctl daemon-reload && \
systemctl start kubelet.service

正常情況下不會刷新任何內(nèi)容,如果刷新了幾條warning的話不用理會,然后登錄管理節(jié)點再次嘗試 可能需要十幾秒的時間等待 kubelet 重啟完成

root@master1:~# kubectl logs kubia-manual
Kubia server starting...

root@master1:~# kubectl exec -it kubia-manual /bin/bash
root@kubia-manual:/# exit
exit
command terminated with exit code 130

root@master1:~# kubectl port-forward kubia-manual 8888:8080
Forwarding from 127.0.0.1:8888 -> 8080
Forwarding from [::1]:8888 -> 8080

發(fā)現(xiàn)所有命令都已經(jīng)可用,至此,問題解決。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容