88个seo网站优化基础知识点,php开发网站流程,介绍产品的营销推文,网络营销产品策略一、简介
Linkerd 是 Kubernetes 的一个完全开源的服务网格实现#xff0c;它通过为你提供运行时调试、可观测性、可靠性和安全性#xff0c;使运行服务更轻松、更安全#xff0c;所有这些都不需要对代码进行任何更改。Linkerd 通过在每个服务实例旁边安装一组超轻、透明的…一、简介
Linkerd 是 Kubernetes 的一个完全开源的服务网格实现它通过为你提供运行时调试、可观测性、可靠性和安全性使运行服务更轻松、更安全所有这些都不需要对代码进行任何更改。Linkerd 通过在每个服务实例旁边安装一组超轻、透明的代理来工作这些代理会自动处理进出服务的所有流量。由于它们是透明的这些代理充当高度仪表化的进程外网络堆栈向控制平面发送遥测数据并从控制平面接收控制信号。这种设计允许 Linkerd 测量和操纵进出服务的流量而不会引入过多的延迟。为了尽可能小、轻和安全Linkerd 的代理采用 Rust 编写。
二、功能
自动 mTLSLinkerd 自动为网格应用程序之间的所有通信启用相互传输层安全性 (TLS)。自动代理注入Linkerd 会自动将数据平面代理注入到基于 annotations 的 pod 中。容器网络接口插件Linkerd 能被配置去运行一个 CNI 插件该插件自动重写每个 pod 的 iptables 规则。仪表板和 GrafanaLinkerd 提供了一个 Web 仪表板以及预配置的 Grafana 仪表板。分布式追踪您可以在 Linkerd 中启用分布式跟踪支持。故障注入Linkerd 提供了以编程方式将故障注入服务的机制。高可用性Linkerd 控制平面可以在高可用性 (HA) 模式下运行。HTTP、HTTP/2 和 gRPC 代理Linkerd 将自动为 HTTP、HTTP/2 和 gRPC 连接启用高级功能包括指标、负载平衡、重试等。IngressLinkerd 可以与您选择的 ingress controller 一起工作。负载均衡Linkerd 会自动对 HTTP、HTTP/2 和 gRPC 连接上所有目标端点的请求进行负载平衡。多集群通信Linkerd 可以透明且安全地连接运行在不同集群中的服务。重试和超时Linkerd 可以执行特定于服务的重试和超时。服务配置文件Linkerd 的服务配置文件支持每条路由指标以及重试和超时。TCP 代理和协议检测Linkerd 能够代理所有 TCP 流量包括 TLS 连接、WebSockets 和 HTTP 隧道。遥测和监控Linkerd 会自动从所有通过它发送流量的服务收集指标。流量拆分(金丝雀、蓝/绿部署)Linkerd 可以动态地将一部分流量发送到不同的服务。
三、安装
可以通过在本地安装一个 Linkerd 的 CLI 命令行工具通过该 CLI 可以将 Linkerd 的控制平面安装到 Kubernetes 集群上。因此首先需要在本地运行 kubectl 命令确保可以访问一个可用的 Kubernetes 集群如果没有集群可以使用 KinD 在本地快速创建一个。
$ kubectl version --short
Client Version: v1.23.5
Server Version: v1.22.8可以使用下面的命令在本地安装 Linkerd 的 CLI 工具
$ curl --proto https --tlsv1.2 -sSfL https://run.linkerd.io/install | sh如果是 Mac 系统同样还可以使用 Homebrew 工具一键安装
$ brew install linkerd同样直接前往 Linkerd Release 页面 下载安装即可。安装后使用下面的命令可以验证 CLI 工具是否安装成功
$ linkerd version
Client version: stable-2.11.1
Server version: unavailable正常可以看到 CLI 的版本信息但是会出现 Server version: unavailable 信息这是因为还没有在 Kubernetes 集群上安装控制平面造成的因此接下来就来安装 Server 端。Kubernetes 集群可以通过多种不同的方式进行配置在安装 Linkerd 控制平面之前需要检查并验证所有配置是否正确要检查集群是否已准备好安装 Linkerd可以执行下面的命令
$ linkerd check --pre
Linkerd core checks
kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes APIkubernetes-version
------------------
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl versionpre-kubernetes-setup
--------------------
√ control plane namespace does not already exist
√ can create non-namespaced resources
√ can create ServiceAccounts
√ can create Services
√ can create Deployments
√ can create CronJobs
√ can create ConfigMaps
√ can create Secrets
√ can read Secrets
√ can read extension-apiserver-authentication configmap
√ no clock skew detectedlinkerd-version
---------------
√ can determine the latest version
‼ cli is up-to-dateis running version 2.11.1 but the latest stable version is 2.11.4see https://linkerd.io/2.11/checks/#l5d-version-cli for hintsStatus check results are √如果一切检查都 OK 则可以开始安装 Linkerd 的控制平面直接执行下面的命令即可一键安装
$ linkerd install | kubectl apply -f -在此命令中linkerd install 会生成一个 Kubernetes 资源清单文件其中包含所有必要的控制平面资源然后使用 kubectl apply 命令即可将其安装到 Kubernetes 集群中。可以看到会将 Linkerd 控制面安装到一个名为 linkerd 的命名空间之下安装完成后会有如下几个 Pod 运行
$ kubectl get pods -n linkerd
NAME READY STATUS RESTARTS AGE
linkerd-destination-79d6fc496f-dcgfx 4/4 Running 0 166m
linkerd-identity-6b78ff444f-jwp47 2/2 Running 0 166m
linkerd-proxy-injector-86f7f649dc-v576m 2/2 Running 0 166m安装完成后通过运行以下命令等待控制平面准备就绪并可以验证安装结果是否正常
$ linkerd checkLinkerd core checks
kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes APIkubernetes-version
------------------
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl versionlinkerd-existence
-----------------
√ linkerd-config config map exists
√ heartbeat ServiceAccount exist
√ control plane replica sets are ready
√ no unschedulable pods
√ control plane pods are ready
√ cluster networks contains all node podCIDRslinkerd-config
--------------
√ control plane Namespace exists
√ control plane ClusterRoles exist
√ control plane ClusterRoleBindings exist
√ control plane ServiceAccounts exist
√ control plane CustomResourceDefinitions exist
√ control plane MutatingWebhookConfigurations exist
√ control plane ValidatingWebhookConfigurations existlinkerd-identity
----------------
√ certificate config is valid
√ trust anchors are using supported crypto algorithm
√ trust anchors are within their validity period
√ trust anchors are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
√ issuer cert is valid for at least 60 days
√ issuer cert is issued by the trust anchorlinkerd-webhooks-and-apisvc-tls
-------------------------------
√ proxy-injector webhook has valid cert
√ proxy-injector cert is valid for at least 60 days
√ sp-validator webhook has valid cert
√ sp-validator cert is valid for at least 60 days
√ policy-validator webhook has valid cert
√ policy-validator cert is valid for at least 60 dayslinkerd-version
---------------
√ can determine the latest version
‼ cli is up-to-dateis running version 2.11.1 but the latest stable version is 2.11.4see https://linkerd.io/2.11/checks/#l5d-version-cli for hintscontrol-plane-version
---------------------
√ can retrieve the control plane version
‼ control plane is up-to-dateis running version 2.11.1 but the latest stable version is 2.11.4see https://linkerd.io/2.11/checks/#l5d-version-control for hints
√ control plane and cli versions matchlinkerd-control-plane-proxy
---------------------------
√ control plane proxies are healthy
‼ control plane proxies are up-to-datesome proxies are not running the current version:* linkerd-destination-79d6fc496f-dcgfx (stable-2.11.1)* linkerd-identity-6b78ff444f-jwp47 (stable-2.11.1)* linkerd-proxy-injector-86f7f649dc-v576m (stable-2.11.1)see https://linkerd.io/2.11/checks/#l5d-cp-proxy-version for hints
√ control plane proxies and cli versions matchStatus check results are √当出现上面的 Status check results are √ 信息后表示 Linkerd 的控制平面安装成功。除了使用 CLI 工具的方式安装控制平面之外也可以通过 Helm Chart 的方式来安装如下所示
$ helm repo add linkerd https://helm.linkerd.io/stable
# set expiry date one year from now, in Mac:
$ exp$(date -v8760H %Y-%m-%dT%H:%M:%SZ)
# in Linux:
$ exp$(date -d 8760 hour %Y-%m-%dT%H:%M:%SZ)$ helm install linkerd2 \--set-file identityTrustAnchorsPEMca.crt \--set-file identity.issuer.tls.crtPEMissuer.crt \--set-file identity.issuer.tls.keyPEMissuer.key \--set identity.issuer.crtExpiry$exp \linkerd/linkerd2此外该 chart 包含一个 values-ha.yaml 文件 它覆盖了一些默认值以便在高可用性场景下进行设置类似于 linkerd install 中的 --ha 选项可以通过获取 chart 文件来获得 values-ha.yaml
$ helm fetch --untar linkerd/linkerd2然后使用 -f flag 提供覆盖文件例如
## see above on how to set $exp
helm install linkerd2 \--set-file identityTrustAnchorsPEMca.crt \--set-file identity.issuer.tls.crtPEMissuer.crt \--set-file identity.issuer.tls.keyPEMissuer.key \--set identity.issuer.crtExpiry$exp \-f linkerd2/values-ha.yaml \linkerd/linkerd2采用哪种方式进行安装均可到这里就完成了 Linkerd 的安装重新执行 linkerd version 命令就可以看到 Server 端版本信息
$ linkerd version
Client version: stable-2.11.1
Server version: stable-2.11.1四、 示例
接下来安装一个简单的示例应用 Emojivoto该应用是一个简单的独立 Kubernetes 应用程序它混合使用 gRPC 和 HTTP 调用允许用户对他们最喜欢的表情符号进行投票。通过运行以下命令可以将 Emojivoto 安装到 emojivoto 命名空间中
$ curl -fsL https://run.linkerd.io/emojivoto.yml | kubectl apply -f -
namespace/emojivoto created
serviceaccount/emoji created
serviceaccount/voting created
serviceaccount/web created
service/emoji-svc created
service/voting-svc created
service/web-svc created
deployment.apps/emoji created
deployment.apps/vote-bot created
deployment.apps/voting created
deployment.apps/web created该应用下可以看到一共包含 4 个 Pod 服务
$ kubectl get pods -n emojivoto
NAME READY STATUS RESTARTS AGE
emoji-66ccdb4d86-6vqvt 1/1 Running 0 91s
vote-bot-69754c864f-k26fb 1/1 Running 0 91s
voting-f999bd4d7-k44nb 1/1 Running 0 91s
web-79469b946f-bz295 1/1 Running 0 91s
$ kubectl get svc -n emojivoto
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
emoji-svc ClusterIP 10.111.7.125 none 8080/TCP,8801/TCP 2m49s
voting-svc ClusterIP 10.105.192.118 none 8080/TCP,8801/TCP 2m48s
web-svc ClusterIP 10.111.236.171 none 80/TCP 2m48s可以通过 port-forward 来暴露 web-svc 服务然后便可在浏览器中访问该应用
$ kubectl -n emojivoto port-forward svc/web-svc 8080:80现在可以在浏览器通过 http://localhost:8080 访问 Emojivoto 应用 可以选择页面中喜欢的表情进行投票但是选择某些表情后会出现一些错误比如当点击甜甜圈表情符号的时候会得到一个 404 页面 不过不用担心这是应用中故意留下的错误为的是后面使用 Linkerd 来识别该问题。接下来可以将上面的示例应用加入到 Service Mesh 中来向其添加 Linkerd 的数据平面代理直接运行下面的命令即可将 Emojivoto 应用网格化
$ kubectl get -n emojivoto deploy -o yaml \| linkerd inject - \| kubectl apply -f -deployment emoji injected
deployment vote-bot injected
deployment voting injected
deployment web injecteddeployment.apps/emoji configured
deployment.apps/vote-bot configured
deployment.apps/voting configured
deployment.apps/web configured上面的命令首先获取在 emojivoto 命名空间中运行的所有 Deployments然后通过 linkerd inject 运行它们的清单然后将其重新应用到集群。注意 linkerd inject 命令只是在 Pod 规范中添加一个 linkerd.io/inject: enabled 的注解并不会直接注入一个 Sidecar 容器该注解即可指示 Linkerd 在创建 Pod 时将代理注入到其中所以执行上面的命令后应用 Pod 中会新增一个 sidecar 的代理容器。
$ kubectl get pods -n emojivoto
NAME READY STATUS RESTARTS AGE
emoji-696d9d8f95-8wrmg 2/2 Running 0 34m
vote-bot-6d7677bb68-c98kb 2/2 Running 0 34m
voting-ff4c54b8d-rdtmk 2/2 Running 0 34m
web-5f86686c4d-qh5bz 2/2 Running 0 34m可以看到每个 Pod 现在都有 2 个容器相较于之前多了一个 Linkerd 的 sidecar 代理容器 当应用更新完成后就成功将应用引入到 Linkerd 的网格服务中来了新增的代理容器组成了数据平面也可以通过下面的命令检查数据平面状态
$ linkerd -n emojivoto check --proxy
Linkerd core checks
kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes APIkubernetes-version
------------------
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl versionlinkerd-existence
-----------------
√ linkerd-config config map exists
√ heartbeat ServiceAccount exist
√ control plane replica sets are ready
√ no unschedulable pods
√ control plane pods are ready
√ cluster networks contains all node podCIDRslinkerd-config
--------------
√ control plane Namespace exists
√ control plane ClusterRoles exist
√ control plane ClusterRoleBindings exist
√ control plane ServiceAccounts exist
√ control plane CustomResourceDefinitions exist
√ control plane MutatingWebhookConfigurations exist
√ control plane ValidatingWebhookConfigurations existlinkerd-identity
----------------
√ certificate config is valid
√ trust anchors are using supported crypto algorithm
√ trust anchors are within their validity period
√ trust anchors are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
√ issuer cert is valid for at least 60 days
√ issuer cert is issued by the trust anchorlinkerd-webhooks-and-apisvc-tls
-------------------------------
√ proxy-injector webhook has valid cert
√ proxy-injector cert is valid for at least 60 days
√ sp-validator webhook has valid cert
√ sp-validator cert is valid for at least 60 days
√ policy-validator webhook has valid cert
√ policy-validator cert is valid for at least 60 dayslinkerd-identity-data-plane
---------------------------
√ data plane proxies certificate match CAlinkerd-version
---------------
√ can determine the latest version
‼ cli is up-to-dateis running version 2.11.1 but the latest stable version is 2.11.4see https://linkerd.io/2.11/checks/#l5d-version-cli for hintslinkerd-control-plane-proxy
---------------------------
√ control plane proxies are healthy
‼ control plane proxies are up-to-datesome proxies are not running the current version:* linkerd-destination-79d6fc496f-dcgfx (stable-2.11.1)* linkerd-identity-6b78ff444f-jwp47 (stable-2.11.1)* linkerd-proxy-injector-86f7f649dc-v576m (stable-2.11.1)see https://linkerd.io/2.11/checks/#l5d-cp-proxy-version for hints
√ control plane proxies and cli versions matchlinkerd-data-plane
------------------
√ data plane namespace exists
√ data plane proxies are ready
‼ data plane is up-to-datesome proxies are not running the current version:* emoji-696d9d8f95-8wrmg (stable-2.11.1)* vote-bot-6d7677bb68-c98kb (stable-2.11.1)* voting-ff4c54b8d-rdtmk (stable-2.11.1)* web-5f86686c4d-qh5bz (stable-2.11.1)see https://linkerd.io/2.11/checks/#l5d-data-plane-version for hints
√ data plane and cli versions match
√ data plane pod labels are configured correctly
√ data plane service labels are configured correctly
√ data plane service annotations are configured correctly
√ opaque ports are properly annotatedStatus check results are √当然还是可以通过 http://localhost:8080 访问应用当然在使用上和之前没什么区别可以通过 Linkerd 去查看应用实际上做了哪些事情但是需要去单独安装一个插件由于 Linkerd 的核心控制平面非常轻量级 因此 Linkerd 附带了一些插件这些插件为 Linkerd 添加了一些非关键但通常有用的功能包括各种仪表板比如可以安装一个 viz 插件Linkerd-Viz 插件包含 Linkerd 的可观察性和可视化组件。安装命令如下所示
$ linkerd viz install | kubectl apply -f -上面的命令会创建一个名为 linkerd-viz 的命名空间会在该命名空间中安装监控相关的应用比如 Prometheus、Grafana 等
$ kubectl get pods -n linkerd-viz
NAME READY STATUS RESTARTS AGE
grafana-8d54d5f6d-wwtdz 2/2 Running 0 3h1m
metrics-api-6c59967bf4-pjwdq 2/2 Running 0 4h22m
prometheus-7bbc4d8c5b-5rc8r 2/2 Running 0 4h22m
tap-599c774dfb-m2kqz 2/2 Running 0 4h22m
tap-injector-748d54b7bc-jvshs 2/2 Running 0 4h22m
web-db97ff489-5599v 2/2 Running 0 4h22m安装完成后可以使用下面的命令打开一个 dashboard 页面
$ linkerd viz dashboard 当 viz 插件部署完成后执行上面的命令后会自动在浏览器中打开一个 Linkerd 的可观察性的 Dashboard。此外也可以通过 Ingress 来暴露 viz 服务创建如下所示的资源对象
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: web-ingressnamespace: linkerd-vizannotations:nginx.ingress.kubernetes.io/upstream-vhost: $service_name.$namespace.svc.cluster.local:8084nginx.ingress.kubernetes.io/configuration-snippet: |proxy_set_header Origin ;proxy_hide_header l5d-remote-ip;proxy_hide_header l5d-server-id;
spec:ingressClassName: nginxrules:- host: linkerd.k8s.localhttp:paths:- path: /pathType: Prefixbackend:service:name: webport:number: 8084应用后就可以通过 linkerd.k8s.local 访问 viz 还可以显示自动生成的拓扑图 在页面上我们可以找到每个 Emojivoto 组件的实时指标就可以确定哪个组件出现了部分故障了这样就可以有针对性的去解决问题了。在对应的资源后面包含一个 Grafana 的图标点击可以自动跳转到 Grafana 的监控页面