Sho*_*med 10 docker kubernetes coredns
我有一个正在运行的 k8s 集群,其中包含两个 CoreDNS 副本。但是当我尝试输入 POD 的 bash 提示符时,它向我抛出以下错误
# kubectl exec -it coredns-5644d7b6d9-285bj -n kube-system sh
error: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "94f45da89fa5493a8283888464623788ef5e832dc31e0d89e427e71d86391fd6": OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown
Run Code Online (Sandbox Code Playgroud)
但我可以毫无问题地登录其他 Pod。我尝试使用 nsenter 和内核进程 ID 它可以工作,但它只适用于与网络相关的开放,例如,
# nsenter -t 24931 -n ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default
link/ether 7a:70:99:aa:53:6c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.2/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::7870:99ff:feaa:536c/64 scope link
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
如何使用 kubectl 进入这个 pod 并消除该错误?
Chr*_*s C 17
您可以按照此处的说明使用 sidecar 模式: https: //support.rancher.com/hc/en-us/articles/360041568712-How-to-troubleshoot-using-the-namespace-of-a-container#sidecar -容器-0-2
简而言之,执行此操作可以找到正在运行 coredns pod 的节点:
kubectl -n kube-system get po -o wide | grep coredns
Run Code Online (Sandbox Code Playgroud)
ssh 到这些节点之一,然后:
docker ps -a | grep coredns
Run Code Online (Sandbox Code Playgroud)
将容器 ID 复制到剪贴板并运行:
ID=<paste ID here>
docker run -it --net=container:$ID --pid=container:$ID --volumes-from=$ID alpine sh
Run Code Online (Sandbox Code Playgroud)
您现在将位于“sidecar”容器内,可以四处查看。IE
cat /etc/coredns/Corefile
Run Code Online (Sandbox Code Playgroud)
Thu*_*ght 12
有一种方法可以访问corednsKubernetes 中 pod 的文件系统。
由于映像不包含任何 shell,因此使用临时容器进行调试是可行的方法。
$ kubectl debug -it coredns-6d4b75cb6d-77d86 --image=busybox:1.28 --target=coredns
Run Code Online (Sandbox Code Playgroud)
我kube-system使用更改为命名空间
$ kubectl config set-context --current --namespace=kube-system
Run Code Online (Sandbox Code Playgroud)
但该-n选项也可以在命令中使用。
使用选项附加临时容器--target可实现进程命名空间共享
访问终端后,您可以使用以下命令查看进程:
$ ps aux
PID USER TIME COMMAND
1 root 0:08 /coredns -conf /etc/coredns/Corefile
210 root 0:00 sh
266 root 0:00 ps aux
Run Code Online (Sandbox Code Playgroud)
PIDcoredns 进程的结构是1,容器文件系统通过链接对 Pod 中的其他容器可见/proc/$pid/root。这使得调试更容易,但这也意味着文件系统机密仅受文件系统权限的保护。(文档)
最后,可以在以下位置查看配置文件
$ cat /proc/1/root/etc/coredns/Corefile
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
Run Code Online (Sandbox Code Playgroud)
如果您想检查 Corefile 那么您可以运行以下命令
kubectl get cm coredns -n kube-system -o yaml
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12957 次 |
| 最近记录: |