摘要:里面有个工具,叫,可以比较方便的调试应用。项目的目录下有个好用的脚本,它是通过在容器里启动各服务的。考虑可以在本地进程启动服务,这样便可以当作一个应用去调试了。本文写作时分支最新为。
openstack 搞了2年,对动态语言的 debug 和 pdb念念不忘,总寻思着看 kubernetes代码能不能和 openstack 一样 pdb 一步步看下去。golang 里面有个debug 工具,叫 dlv,可以比较方便的调试 go 应用。
kubernetes 项目的 hack 目录下有个好用的 shell 脚本local-up-cluster.sh,它是通过_output/local/bin/linux/amd64/hyperkube在容器里启动k8s各服务的。考虑可以在本地进程启动 kubernetes 服务,这样便可以当作一个 go 应用去调试了。本文写作时kubernetes master 分支最新 commit id 为9884215f7976e8cc294fdbb62f8c2a6af9bca728。
linux 环境信息这里不再赘述,我用的是 centos 7.4 虚拟机,配置是4C/16G/100G
$ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)go 环境安装
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 # 测试是否安装成功 $ go version go version go1.10.3 linux/amd64 # 配置 go 环境 (建议直接将 export 内容写入到/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 # 提供一个习惯访问的 shell 脚本,可以不操作(因为后面启动的local-up-cluster 使用的是cluster 目录下的kubectl.sh 来操作k8s 环境) 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 # 测试是否安装成功 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 # 启动 docker systemctl start docker systemctl enable dockerdocker 镜像
由于安装镜像存在墙,提前准备好 (感谢 anjia0532 提供的同步镜像仓库)
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 默认使用的是 hyperkube 镜像在容器中启动 kuebrnetes 服务,但是这样不能使用 dlv 去调试代码,那么需要在 host 进程启动,有两种方案都可以试试,由于local-up-cluster.sh 会在本地编译好代码并放入到 _output/bin 中,那么可以直接通过写 systemd 配置文件的方式在本地启动服务; 还有一种是我选择的,修改local-up-cluster.sh代码,如下:
注意: 这个只在commit id: 30b89d830b7fd0827576853d6a0db44b66a90d3d 以后可用。之前的会编译不成功,是因为cmd下没有 kube-schduler 包,该目录在plugins/cmd/kube-sheduler下,需要重写规则。
启动集群通过执行local-up-cluster.sh脚本启动集群
# 切换到 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 # 验证集群是否成功 $ kubectl get componentstatus NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"}
这里有个 tip, 在代码中有个判断 [ "x$GO_OUT" == "x” ], 也就是说如果第一次编译生成 bin 包后,往后只要指定 GO_OUT 再次执行就可以不再编译。
我这里是: export GO_OUT=/go/src/k8s.io/kubernetes/_output/bin
调试举例# 查找 并 kill 相关进程 $ 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 # 我移除了部分配置项,否则报错 $ 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 # 开始调试 dlv connect 127.0.0.1:1234 (dlv) b main.main (dlv) c (dlv) args (dlv) p
备注:
这只是我初步实现的一个方案,并没有结合它深度使用,后续有新技能再更新上来
如果照着我的步骤卡住了,考虑下是不是配个梯子( https://www.zfl9.com/ss-local... )
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/32683.html
摘要:参考官方文档进行操作本文假设环境正常运行,并且已经安装。只能以单副本运行部署运行命令来安装等待一段时间执行完成后,通过如下命令确定集群是否成功运行检查的状态检查集群状态至此,集群部署完成。 参考 ceph 官方文档进行操作: http://docs.ceph.com/docs/mas... 本文假设kubernetes 环境正常运行,并且 host 已经安装 helm client。 ...
摘要:节点对不会有影响,查询处于状态并一直保持。根据上一节描述,此时已经有正确的在其他节点,此时故障节点恢复后,执行优雅删除,删除旧的。会从状态变为状态,执行优雅删除,,然后执行重新调度与重建操作。会从状态直接变成状态,不涉及重建。 节点离线后的 pod 状态 在 kubernetes 使用过程中,根据集群的配置不同,往往会因为如下情况的一种或几种导致节点 NotReady: kubele...
摘要:全球范围内的部署节点已超过个,付费客户超过个。因此,我们决定重新设计,将过去大受用户欢迎的用户体验即架构于之上,从而充分利用的强大力量。因此,很快成为启动集群的最受欢迎的方式之一。年,的流行度在持续上升,且这一势头从未放缓。 经过数月的努力,我们终于发布了Rancher 2.0 Technology Preview,这对Rancher Labs而言也是历史性的、值得铭记的一刻。 Ran...
摘要:全球范围内的部署节点已超过个,付费客户超过个。因此,我们决定重新设计,将过去大受用户欢迎的用户体验即架构于之上,从而充分利用的强大力量。因此,很快成为启动集群的最受欢迎的方式之一。年,的流行度在持续上升,且这一势头从未放缓。 经过数月的努力,我们终于发布了Rancher 2.0 Technology Preview,这对Rancher Labs而言也是历史性的、值得铭记的一刻。 Ran...
摘要:渲染节点并指明它们的总体状态。为节点和提供工具提示信息。作为一个日志查看器,允许你使用选择器从匹配的流式的查看日志。日志查看器你可以基于标准的标签选择器匹配,通过名字,通过服务,通过部署,等等。使得和团队在容器排错和安全调查方面很方便。 如果你正在 Kubernetes 上工作,你的 SRE 和 Ops 团队需要正确的工具来确保Kubernetes集群的高可用和在其中运行的工作负载。这...
阅读 2083·2023-04-26 02:41
阅读 2145·2021-09-24 09:47
阅读 1545·2019-08-30 15:53
阅读 1204·2019-08-30 13:01
阅读 1884·2019-08-29 11:27
阅读 2856·2019-08-28 17:55
阅读 1739·2019-08-26 14:00
阅读 3375·2019-08-26 10:18