当前位置: 首页 > 科技观察

在生产中使用Linkerd

时间:2023-03-19 13:47:11 科技观察

到目前为止,我们一直在以最基本的形式使用Linkerd,而没有关注生产级别的问题。在本节中,我们将了解在生产环境中使用的一些主要注意事项,包括高可用性(HA)模式、HelmCharts、跨集群通信和外部Prometheus。高可用性高可用性描述了一个具有冗余架构的系统,如果系统的某些部分发生故障,该系统将继续运行。Linkerd的高可用性模式旨在消除控制平面的单点故障。启用HA模式的一种方法是为linkerdinstall指定--ha标志,这会启用多种不同的行为。它可以部署某些Linkerd控制平面组件的多个副本:ControllerDestinationIdentityProxyInjectorServiceProfileValidator请注意,其他组件,如Grafana、Prometheus不被视为核心关键组件,因此不会配置多个副本(没有这些组件,数据平面仍然可以继续正常运行)。除了replicas,HA模式还为controlplane组件配置了资源请求,并为这些组件开启了Pod反亲和性,保证了特定组件只有一个实例被调度到同一个节点上。但是,需要注意的是,HA模式有一些细微的差别。首先,HA模式改变了代理注入器的方式,强制为代理注入适当的注解。这是为了确保在生产中,使用LinkerdformTLS的应用程序可以依赖代理,尽管如果Linkerd的代理注入器因某种原因不可用,则无法创建pod。比如kube-system命名空间会有问题,所以使用HA模式需要在kube-system命名空间添加标签config.linkerd.io/admission-webhooks:disabled来允许创建Kubernetes组件,即使Linkerd有一些问题,但不要太担心,在HA模式下运行时,当标签不在kube-system命名空间中时,linkerdcheck命令也会打印警告消息。HelmChart在生产环境中一般不推荐使用LinkerdCLI工具进行安装,更推荐使用Helm等工具进行安装。Linkerd提供了普通模式和HA模式的HelmChart,其中包含一个名为values-ha.yaml的模板,可以作为集群高可用部署的基础。Helm对??于在新创建的集群上自动配置Linkerd特别有用。有用。需要注意的是Helm的安装过程不会像linkerdinstall命令那样为你生成证书,所以在安装过程中你需要使用自己的证书,这个在之前的mTLS章节中已经介绍过了。不管是使用Helm安装还是HA模式安装,对于生产系统,都应该自己生成root证书和issuer证书。创建自己的信任锚,可以省去你手动轮换的麻烦(我们建议将过期时间设置为10年,而不是默认的1年),也可以为以后的集群生成颁发者证书,请确保私钥保留它在一个安全的地方!PrometheusMetricsLinkerd控制平面包含一个Prometheus实例,来自该实例的数据用于支持Linkerd仪表板和linkerdvizstat等命令的输出。默认情况下,实例只保留最近6小时的指标数据,生产环境往往需要访问更长时间的指标,比如1周、1个月,甚至1年。当然,我们可以重新配置Prometheus实例来增加数据保留时间,但显然这不是推荐的方法。最好的方式是将Linkerd的控制平面提供的Prometheus的指标输出到一个专门的远程存储中,比如Cortex、Thanos或者Victorimetrics,根据我们之前对Prometheus的研究,推荐使用Victoriametrics。如果您已经有一个可用的Prometheus集群,那么我们还可以配置Linkerd以使用外部Prometheus实例,并获取Linkerd控制平面组件和代理的相关指标。配置外部Prometheus如果要使用外部Prometheus,需要在外部Prometheus中添加如下捕获配置:-job_name:"grafana"kubernetes_sd_configs:-role:podnamespaces:names:["linkerd-viz"]relabel_configs:-source_labels:-__meta_kubernetes_pod_container_name操作:保持正则表达式:^grafana$-job_name:“linkerd-controller”relabel_configs:-source_labels:-__meta_kubernetes_pod_container_port_name操作:保持正则表达式:admin-http-source_labels:[__meta_kubernetes_pod_container_name]操作:替换target_label:-roled_configs组件:pod命名空间:名称:-“linkerd”-“linkerd-viz”-job_name:“linkerd-service-mirror”kubernetes_sd_configs:-角色:podrelabel_configs:-source_labels:-__meta_kubernetes_pod_label_linkerd_io_control_plane_component-__meta_kubernetes_pod_container_port_name动作:保持正则表达式:l墨水服务ice-mirror;admin-http$-source_labels:[__meta_kubernetes_pod_container_name]action:replacetarget_label:component-job_name:"linkerd-proxy"kubernetes_sd_configs:-role:podrelabel_configs:-source_labels:-__meta_kubernetes_pod_container_name-__meta_kubernetes_pod_container_port_name-__meta_kubernetes_pod_label_linkerd_io_control_plane_nsaction:keepregex:^linkerd-proxy;linkerd-admin;linkerd$-source_labels:[__meta_kubernetes_namespace]action:replacetarget_label:namespace-source_labels:[__meta_kubernetes_pod_name]action:replacetarget_label:pod#特例k8s的“工作”标签,不干扰普罗米修斯'“工作”#标签#__meta_kubernetes_pod_label_linkerd_io_proxy_job=foo=>#k8s_job=foo-source_labels:[__meta_kubernetes_pod_label_linkerd_io_proxy_job]动作:替换target_label:k8s_job#drop__meta_kubernetes_pod_label_linkerd_io_proxy_job-action:labeldropregex:__meta_kubernetes_pod_label_linkerd_io_proxy_job#__meta_kubernetes_pod_label_linkerd_io_proxy_deployment=foo=>#deployment=foo-action:labelmapregex:__meta_kubernetes_pod_label_linkerd_io_proxy_(.+)#dropalllabelsthatwejustmadecopiesofinthepreviouslabelmap-action:labeldropregex:__meta_kubernetes_pod_label_linkerd_io_proxy_(.+)#__meta_kubernetes_pod_label_linkerd_io_foo=bar=>#foo=bar-action:labelmapregex:__meta_kubernetes_pod_label_linkerd_io_(.+)#Copyallpodlabelstotmplabels-action:labelmapregex:__meta_kubernetes_pod_label_(.+)replacement:__tmp_pod_label_$1#获取带有`linkerd_io_`前缀的标签并在没有前缀的情况下复制它们-action:labelmapregex:__tmp_pod_label_linkerd_io_(.+)replacement:__tmp_pod_label_$1#Dropthe`linkerd_io_`originals-action:labeldropregex:__tmp_pod_label_linkerd_io_(.+)#Copytmplabelsintoreallabels-action:+labelmapregexd._t__t我们可以使用命令kubectlgetcm-nlinkerd-vizprometheus-config-oyaml获取完整配置。抓包配置更新后,确保Prometheus可以抓取相关指标数据。Linkerd的可视化扩展组件依赖于Prometheus实例作为仪器板和CLI提供数据。安装时有一个prometheusUrl字段可以用来配置外部Prometheus的地址,所有这些组件都可以通过这个参数配置到外部PrometheusURL。但是需要注意的是,当使用外部Prometheus并配置prometheusUrl字段时,Linkerd的Prometheus仍然会包含在安装中。如果要禁用它,请务必同时包含以下配置:prometheus:enabled:false例如,如果我们在kube-mon命名空间中有一个可用的Prometheus实例,我们可以将其替换为以下命令:$kubectlgetsvcprometheus-nkube-monNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEprometheusNodePort10.100.236.2539090:31561/TCP60d$linkerdvizinstall--setprometheusUrl=http://prometheus.kube-星期一svc.cluster.local:9090,prometheus.enabled=false|kubectlapply-f-如果是使用Helm进行安装,可以直接通过values文件进行配置。更新后再次查看LinkerdDashboard,可以看到应用的相关指标数据。图包括Grafana也能正常显示。这样Prometheus指标数据保存多长时间或者如何保存,就完全取决于我们外部的Prometheus本身了,当然也降低了Linkerd本身的复杂度。多集群通信Linkerd支持多集群通信,这是一种允许服务在Kubernetes集群之间透明通信的特性。启用此功能后,如果服务A与服务B通信,则不需要知道B是在同一集群上运行还是在不同集群上运行,在同一数据中心内运行还是跨互联网运行。相同的mTLS、指标和可靠性功能统一应用于集群内和跨集群通信。事实上,当与分流结合时,ServiceB可以从本地集群迁移或故障转移到远程集群,或者跨越一个独立的远程集群。使用linkerdmulti-clusterinstall命令将linkerd多集群组件与控制平面组件分开安装,该命令会创建一个名为linkerd-multi-cluster的命名空间,其中包含两个组件:service-mirror和linkerd-gateway,这些组件用于确保两个集群之间连接的健康状况,并为远程或目标集群上存在的服务路由流量。每个参与的集群都必须运行安装了这些组件的Linkerd控制平面。这消除了任何一个集群的单点故障:如果一个集群被删除、崩溃或变得不可用,其余集群和控制平面将继续运行。多集群设置中最困难的部分是mTLS基础设施:每个集群上的颁发者证书必须由相同的信任根签名。这意味着简单地运行linkerdinstall会出现安装问题,需要指定相同的根证书。其他以上是将Linkerd部署到生产环境之前需要考虑的一些重要事项。此外,还有一些其他的事情值得我们注意:配置资源:当你在HA模式下部署Linkerd时,Linkerd是一个控制平面组件设置CPU和内存资源请求和限制。这些限制是一个相对合理的值,但并非所有应用程序都相同,您可能需要调整这些资源配置以满足您的需求。对于高流量的服务(每个实例>1000请求/秒),我们可能还需要调整代理资源,或者在部署应用时指定config.linkerd.io/proxy-cpu-limit注解配置代理并发。检查时钟偏差:确保集群中的节点保持同步很重要,例如通过使用NTP,节点之间的大时钟偏差可能会破坏Linkerd代理验证其mTLS证书的能力(大时钟偏差会使跨节点读取日志文件变得困难!)。处理NET_ADMIN:Linkerd的代理初始化容器在注入Pod时运行,负责配置iptables规则,以便所有进出应用程序容器的TCP流量自动通过代理容器路由。这需要Kubernetes的NET_ADMINLinux能力,这意味着任何向集群添加支持Linkerd的工作负载的系统都必须被授予此能力。如果出于安全原因不希望这样做,另一种方法是使用LinkerdCNI插件在工作负载创建者的权限之外执行此操作。Linkerdviztappermission:我们之前学习过tap这个强大的命令,但是这个功能也伴随着很多风险,因为这个命令可能会将潜在的敏感信息暴露给用户,但是Linkerd允许我们使用KubernetesRBAC限制来控制谁可以输出这个输出被访问。使用Ingress:与其他一些服务网格不同,Linkerd不提供自己的Ingress控制器。相反,您可以将Linkerd与任何其他可用的KubernetesIngress控制器一起使用。这样做时,我们建议使用Linkerd代理注入Ingress控制器。这将允许Linkerd的mTLS和可观察性从请求进入集群的地方??。从现在开始可用。至此我们基本了解了如何在生产环境中使用Linkerd。但也要注意,我们上面介绍的这些东西并不是全部,强烈建议在将Linkerd部署到生产环境之前,充分理解这些概念并阅读Linkerd文档。