debian源码编译安装-Istio源码分析1-Istio编译与调试

在开发环境中部署和使用Istio的过程中,我们遇到了很多问题。 通过前期检查Istio相关日志,我们可以定位到一些基本的问题。 随着Istio的进一步使用和性能要求的提高,阅读并更改Istio的源码迫在眉睫,并查询了大量的信息。 我看到的Istio编译和调试需要访问内网进行make,或者所有操作都是基于Mac。 我没有考虑我们的windows很难访问内网。 系统用户。 自己查阅了一些资料debian源码编译安装,这里总结一下Istio编译以及如何调试Istio代码。

作者:李云天,中国联通云能力中心软件开发工程师,专注于云原生、Istio、微服务、SpringCloud等领域。

01

背景

在开发环境中部署和使用Istio的过程中,我们遇到了很多问题。 通过前期检查Istio相关日志,我们可以定位到一些基本的问题。 随着Istio的进一步使用和性能要求的提高,阅读并更改Istio的源码迫在眉睫,并查询了大量的信息。 我看到的Istio编译和调试需要访问内网进行make,或者所有操作都是基于Mac。 我没有考虑我们的windows很难访问内网。 系统用户。 自己查阅了一些资料,这里总结一下Istio编译以及如何调试Istio代码。

02

编译和调试环境

以下是我的构建环境信息:

Linux:Linux7.6ForLDK (GNU/Linux4.19.25-200.1.el7.bclinux.x86_64x86_64)

码头工人:2017 年 10 月 20 日

库伯内特斯:1.21

Istio:实验双栈

windows10、Goland2022

03

编译

从 GitHub 下载所需的 Istio 分支的代码。 这里我们使用Istio双栈分支experimental-dual-stack的代码。 将代码下载到某个目录后,以下命令均在该目录下执行。 Istio目录包含以下文件

Makefile:编译入口

Makefile.core.mk:一些环境配置和一些主要操作

3.1 更改配置

生成文件更改

# -include Makefile.overrides.mk

Makefile.core.mk 更改

# export GOPROXY ?= https://proxy.golang.orgexport GOPROXY = https://goproxy.cn

3.2 更改图像

这时候如果我们直接编译的话,是很难编译成功的。 在编译过程中,我们会多次从gcr.io拉取镜像。 这必须连接到 Intranet。 如果需要编译镜像和dlv文件,可以【发邮件给我】(cumtshu@163.com),具体需要的镜像见右图。 如果无法连接内网,可以自行领取。 您需要将本地docker中的这个镜像加载到本地镜像仓库中。

由于这里获取到的镜像实际上和内网的镜像是一样的,摘要信息可能略有不同,所以我们去掉了Istio中manifests目录下所有原始镜像的镜像摘要

FROM gcr.io/distroless/cc@sha256:f81e5db8287d66b012d874a6f7fea8da5b96d9cc509aa5a9b5d095a604d4bca1 as distroless改为FROM gcr.io/distroless/cc as distrolessFROM gcr.io/distroless/static-debian10@sha256:4433370ec2b3b97b338674b4de5ffaef8ce5a38d1c9c0cb82403304b8718cde9改为FROM gcr.io/distroless/static-debian10

需要镜像

3.3 安装fpm和ruby

在编译过程中会多次使用fpm来安装一些组件,因此需要安装fpm并升级ruby。 fpm的具体安装可以[参考](),ruby的升级可以[参考]()。

在安装过程中,我遇到了以下问题。 如果您也有类似问题,可以参考解决:

1、安装ruby版本时,gemsources--add配置国外源时,仍然报错

获取错误:

时间到(

我使用curl -v检查复制的Ip地址是否是ipv6地址,并查询相关的[data]()。 给出的解决方案是直接配置gems.ruby-china.com域名对应的IPv4地址或者直接禁用安装主机。 IPv6,禁用IPv6的具体方法可以参见[参考]()。

2.升级ruby时debian源码编译安装,如果获取秘钥的过程失败,可以[参考]()解决

3.编译时也遇到了如下错误

2022-07-22T06:02:26.862108 ZinfoRunningcommand:dockerbuildxbake -f /root/istiodualstack/istio/out/linux_amd64/dockerx_build/docker-bake.jsonall

未知简写标志:'f'in-f

报此错误,检查docker版本是否高于1.19,如果是[参考]()升级docker

3.4 编译Istio

配置完以上功能后,就可以编译Istio了。

编译所有组件make initmake docker编译指定组件make pilot  docker.pilot # 编译pilot组件和镜像make app  docker.app # 编译app组件和镜像make proxy  docker.proxy # 编译proxy组件和镜像make proxy_init  docker.proxy_init # 编译proxy_init组件和镜像make proxy_debug  docker.proxy_debug # 编译proxy_debug组件和镜像make sidecar_injector  docker.sidecar_injector # 编译sidecar_injector组件和镜像make proxyv2  docker.proxyv2 # 编译proxyv2组件和镜像make push.docker.pilot # 推送pilot镜像到dockerhub,其他组件类似

编译完成后,可以在本地看到编译好的相关组件信息,并使用相关组件来部署Istio

04

调试

【github上】()的调试方法要求调试机器可以访问内网,直接将dlv复制到镜像中,启动时使用dlv窃听服务进程。 考虑到我们直接连接内网比较困难,这里我们使用以下方式来调试Istio

4.1 在 Istiod 容器中运行 dlv

上图中有一个 dlv 文件,将其放在调试机器上的 /opt 文件夹中,然后通过以下命令更改已安装的 Istiod,更改 Istiod 的文件访问权限,将 dlv 文件从本地复制到镜子。

$ kubectl edit deployment istiod -n istio-systemsecurityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLreadOnlyRootFilesystem: falserunAsGroup: 1337runAsNonRoot: truerunAsUser: 1337

其实在部署之前,可以统一更改helm配置文件manifests/charts/istio-control/istio-discovery/templates/deployment.yaml

处理完以上步骤后,将dlv工具复制到istiod容器

kubectl cp dlv istiod-xxx:/opt/dlv -n istio-system

进入 istiod 容器

kubectl exec -it istiod-xxx -n istio-system -- sh

在容器内运行 dlv

dlv --listen=:2345 --headless=true --api-version=2 attach 1

暴露端口后,可以在Windows下打开Goland配置远程访问进行调试

kubectl port-forward pod/istiod-xxx 2345:2345 -n istio-system

其实我们也可以在部署 Istiod 时直接将 dlv 复制到 Istiod 镜像中,通过 dlv 启动 Istiod 服务。 首先更改pilot的Dockerfile.pilot文件,并更改pilot的启动脚本。

vimpilot/docker/Dockerfile.pilot

FROM gcr.io/istio-testing/build-tools:master-2020-07-08T14-39-36 as build-envCOPY dlv /usr/local/bin/dlvUSER 1337:1337EXPOSE 40000ENTRYPOINT ["/usr/local/bin/dlv","--accept-multiclient", "--listen=:40000", "--check-go-version=false", "--headless=true", "--api-version=2", "--log=true", "--log-output=debugger,debuglineerr,gdbwire,lldbout,rpc", "exec", "/usr/local/bin/pilot-discovery","--"]

里面只显示了一些变化,其他配置保持不变。 执行前需要将dlv文件复制到编译好的out/linux_amd64/dockerx_build/build.docker.pilot目录下。 通过这些方法启动 Istiod 后,查看 Istiod 的状态如右图所示。 此时,Istiod 处于调试状态。 通过配置goland的远程访问,可以进行单步调试。

暴露端口后,可以在Windows下打开Goland配置远程访问进行调试

kubectl port-forward --address 0.0.0.0 deployment.apps/istiod 40000:40000 -n istio-system

4.2 在调试机上运行dlv

里面的演示是将dlv放入Istiod镜像中进行调试。 另一种方法是直接通过虚拟机上的dlv进行调试。 在我们的开发环境中,我们可以直接看到我们启动的Istiod和pilot服务的pid。

通过dlvattach到进程的pid并暴露端口,可以在windows下打开Goland配置远程访问进行调试

dlv --listen=:40000 --headless=true --api-version=2 attach 198493

最后可以看到Istio可以调试了

05

总结

Istio的编译和调试对于无法访问内网的Windows用户来说不是很友好。 通过上述方法,可以对Istio进行编译和单步调试。 我将基于 Istio 的实验双栈版本来探索 Istio。 内容可能有错误或不准确的地方,欢迎交流并见谅。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 debian源码编译安装-Istio源码分析1-Istio编译与调试 https://www.wkzy.net/game/159160.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务