到目前为止,我们一直在以最基本的形式使用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.253
