问题描述
上下文
我正在尝试使用 OpenCensus 和 Linkerd。 尽管 Linkerd 可以选择在其命名空间中自动配置 OpenCensus 和 jaeger,但我不想使用它们。相反,我将它们独立部署在名为“ops”的命名空间下。
问题
- OpenCensus 收集器是否应由 Linkerd 注入。
在官方 docs 的末尾(正好是倒数第 4 行),它说,
确保使用 Linkerd 代理注入 OpenCensus 收集器。
这是什么意思?
我应该将 linkerd sidecar 注入 OpenCensus 收集器 pod 中吗?
如果是,为什么?
例如,假设我已经像这样配置了默认命名空间。
apiVersion: v1
kind: Namespace
Metadata:
name: default
annotations:
linkerd.io/inject: enabled
config.linkerd.io/trace-collector: my-opencensus-collector.ops:12345
config.alpha.linkerd.io/trace-collector-service-account: my-opencensus-collector-service-account
my-opencensus-collector
位于 ops
命名空间中,因此我将 .ops
放在其服务名称的末尾,结果为 my-opencensus-collector.ops:12345
。
OpenCensus 收集器的专用服务帐户也存在于 ops
命名空间中。在这种情况下,我应该将命名空间名称也放在服务帐户名称的末尾吗?
哪个是对的?
config.alpha.linkerd.io/trace-collector-service-account: my-opencensus-collector-service-account
或
config.alpha.linkerd.io/trace-collector-service-account: my-opencensus-collector-service-account.ops
谢谢!
解决方法
- OpenCensus 收集器是否应由 Linkerd 注入。
是的,OpenCensus 收集器应该注入 Linkerd 代理,因为代理本身使用 mTLS 发送跨度信息。使用 mTLS,请求的发送端(客户端)和接收端(服务器端)必须相互出示证书,以验证彼此的身份,以验证身份是由相同的可信来源。
Linkerd 服务网格由控制平面和数据平面组成。控制平面是一组在集群内运行以实现服务网格功能的服务。相互 TLS (mTLS) 是这些功能之一,由控制平面的 linkerd-identity
组件实现。
数据平面由任意数量的 Linkerd 代理组成,这些代理被注入到应用程序中的服务中,例如 OpenCensus 收集器。每当在 Pod 中启动代理时,它都会向 linkerd-identity
组件发送证书签名请求并接收证书作为回报。
因此,当控制平面中的 Linkerd 代理将 Span 发送到收集器时,它们会使用这些证书对自己进行身份验证,这些证书必须由注入 OpenCensus 收集器 Pod 的代理进行验证。这可确保在集群内安全地发送所有流量,甚至是分布式跟踪。
- 我应该按命名空间为 serviceaccount 名称添加后缀吗?
在您的情况下,您应该使用命名空间为服务帐户添加后缀。默认情况下,Linkerd 会使用 Pod 命名空间,因此如果 Pod 命名空间中不存在服务帐户,那么配置将无效。 logic 有一个函数,用于检查注解名称中的命名空间并附加它(如果存在):
func ammendSvcAccount(ns string,params *Params) {
hostAndPort := strings.Split(params.CollectorSvcAddr,":")
hostname := strings.Split(hostAndPort[0],".")
if len(hostname) > 1 {
ns = hostname[1]
}
params.CollectorSvcAccount = fmt.Sprintf("%s.%s",params.CollectorSvcAccount,ns)
}
所以,这个是正确的:
config.alpha.linkerd.io/trace-collector-service-account: my-opencensus-collector-service-account.ops