新聞中心
Linkerd 升級到全新的 2.12 版本
作者:陽明 2022-09-12 21:10:42
云計算
云原生 Linkerd 2.12 是采用 Gateway API 作為核心配置機(jī)制的第一步。雖然這個 API 對于服務(wù)網(wǎng)格用例來說還不是完美的,但它為這個版本提供了一個強大的起點,更重要的是,在 Gateway API 的基礎(chǔ)上構(gòu)建將使我們能夠?qū)⑻囟ㄓ?Linkerd 的配置對象的數(shù)量保持在最低限度,即使我們引入了新功能。

在祁陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站制作 網(wǎng)站設(shè)計制作按需設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),祁陽網(wǎng)站建設(shè)費用合理。
Linkerd 最新的 2.12 版本已經(jīng)發(fā)布了,這個龐大的版本為 Linkerd 引入了基于路由的策略,允許用戶以完全零信任的方式定義和執(zhí)行基于 HTTP 路由的授權(quán)策略。這些策略建立在 Linkerd 強大的工作負(fù)載身份之上,由雙向 TLS 保護(hù),并使用 Kubernetes 新推出的 Gateway API 的類型進(jìn)行配置。
更新日志
Linkerd 2.12 是采用 Gateway API 作為核心配置機(jī)制的第一步。雖然這個 API 對于服務(wù)網(wǎng)格用例來說還不是完美的,但它為這個版本提供了一個強大的起點,更重要的是,在 Gateway API 的基礎(chǔ)上構(gòu)建將使我們能夠?qū)⑻囟ㄓ?Linkerd 的配置對象的數(shù)量保持在最低限度,即使我們引入了新功能。這是我們?yōu)?Kubernetes 成為最簡單和最輕量的服務(wù)網(wǎng)格的目標(biāo)的重要組成部分。此外 2.12 版本還引入了訪問日志記錄,這是一個期待已久的功能,允許 Linkerd 生成 Apache 樣式的請求日志。它增加了對 iptables-nft 的支持,并引入了許多其他改進(jìn)和性能增強。
Per-route 策略
Linkerd 的新的 per-route 策略擴(kuò)展了現(xiàn)有的基于端口的策略,對服務(wù)如何被允許相互通信進(jìn)行更精細(xì)的控制。這些策略是為采取零信任安全方法的組織設(shè)計的,這種方法不僅需要加密,還需要強大的工作負(fù)載身份和明確的授權(quán)。
- 將網(wǎng)絡(luò)視為對抗性的:它們不依賴 IP 地址,也不要求 CNI 層或底層網(wǎng)絡(luò)的任何其他方面是安全的。
- 使用安全的工作負(fù)載身份:Linkerd 的工作負(fù)載身份是由 ServiceAccounts 自動生成的,并在連接時通過雙向 TLS 進(jìn)行加密驗證。
- 在 Pod 級別上強制執(zhí)行:每個連接和每個請求都經(jīng)過驗證。
- 很容易的允許模式:有安全意識的采用者可以很容易地默認(rèn)拒絕對敏感資源的訪問,除非明確允許("最小特權(quán)原則")。
默認(rèn)拒絕配置在 Kubernetes 中可能會有一些問題,因為 health 和 readiness 探針狀態(tài)需要在沒有授權(quán)的情況下通過。在 Linkerd 2.12 中,health 和 readiness 狀態(tài)探測現(xiàn)在是默認(rèn)授權(quán)的,但也可以明確授權(quán),同時仍然鎖定其他應(yīng)用端點。
Gateway API
Linkerd 2.12 提供了支持 Kubernetes Gateway API 的第一步。雖然 Gateway API 最初是作為 Kubernetes 中長期存在的 Ingress 資源的一個更豐富、更靈活的替代品而設(shè)計的,但它為描述服務(wù)網(wǎng)狀流量提供了一個很好的基礎(chǔ),并允許 Linkerd 將其增加的配置保持在最低水平。
在 Linkerd 2.12 中,Linkerd 提供了 Gateway API 的部分實現(xiàn)來配置 Linkerd 的基于路由的策略。這樣我們就可以開始使用 Gateway API,而不用實現(xiàn)規(guī)范中對 Linkerd 沒有意義的部分。隨著 Gateway API 的發(fā)展,也會慢慢地更好滿足 Linkerd 的需求。
訪問日志
Linkerd 2.12 還引入了訪問日志記錄,它允許代理發(fā)出 Apache 樣式的請求日志。出于性能和資源利用率的原因,此功能默認(rèn)關(guān)閉(尤其是對于高流量工作負(fù)載),但也可以在需要它的情況下輕松啟用。
其他更新
Linkerd 2.12 還有大量的其他改進(jìn)、性能提升和錯誤修復(fù),包括:
- 一個新的config.linkerd.io/shutdown-grace-period 注解,用于配置代理的最大寬限期,以便優(yōu)雅地關(guān)閉。
- 一個新的iptables-nft 模式,用于 Linkerd 的 init 容器中的iptables-nft 支持。
- 修復(fù)了某些控制平面組件在信任根輪換后未按要求重啟的問題。
- 修正了當(dāng)在 Linkerd 命名空間中發(fā)現(xiàn)意外的 Pod 時,linkerd check 命令崩潰的問題。
- 修改了proxy.await 的 Helm 值,這樣用戶就可以在控制平面組件上禁用linkerd-await。
- 注釋,允許 Linkerd 擴(kuò)展部署在必要時被自動縮放器驅(qū)逐。
- 能夠在獨立模式下運行Linkerd CNI 插件。
- 多集群擴(kuò)展中的 ServiceAccount token Secret,支持 Kubernetes 版本>= v1.24。
升級
現(xiàn)在我們將集群中的 Linkerd 升級到最新的 2.12 版本。
首先需要更新 Linkerd CLI 工具,執(zhí)行如下所示的命令即可:
$ curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
這會將你的本地 CLI 升級到最新版本。當(dāng)然我們有可以通過 Linkerd 的 Release 頁面直接下載對應(yīng)平臺的 CLI 安裝包。
$ wget https://github.91chi.fun/https://github.com//linkerd/linkerd2/releases/download/stable-2.12.0/linkerd2-cli-stable-2.12.0-darwin-arm64
$ sudo mv linkerd2-cli-stable-2.12.0-darwin-arm64 /usr/local/bin/linkerd
$ chmod +x /usr/local/bin/linkerd
驗證 CLI 已安裝并正確運行:
$ linkerd version
Client version: stable-2.12.0
Server version: stable-2.11.1
可以看到 CLI 升級成功了,由于控制平面還沒升級,所以看到的還是現(xiàn)在的 2.11.1 版本。
接下來就可以升級 Kubernetes 集群上的 Linkerd 控制平面了,不用擔(dān)心,現(xiàn)有的數(shù)據(jù)平面將繼續(xù)使用更新版本的控制平面運行,并且你的網(wǎng)格服務(wù)不會出現(xiàn)故障。
如果你使用的是 viz 插件自帶的 Prometheus 組件,那么升級后數(shù)據(jù)會丟失,如果你配置的外置的 Prometheus 則不用擔(dān)心該問題。
Linkerd SMI 擴(kuò)展
如果你使用 CLI 安裝了 Linkerd 2.11.x,并且正在使用 TrafficSplit CRD,則需要注意丟失 TS 的 CR,如果你不使用此 CRD,則可以忽略該注意事項。
TrafficSplit CRD 不再隨 Linkerd 2.12.0 提供,而是由 Linkerd SMI 擴(kuò)展提供。
同樣首先從 Release 頁面下載對應(yīng)的可執(zhí)行包:
$ wget https://github.91chi.fun/https://github.com//linkerd/linkerd-smi/releases/download/v0.2.0/linkerd-smi-0.2.0-darwin-arm64
$ chmod +x linkerd-smi-0.2.0-darwin-arm64
$ sudo mv linkerd-smi-0.2.0-darwin-arm64 /usr/local/bin/linkerd-smi
$ linkerd-smi version
v0.2.0
同樣 Linkerd SMI 也可以通過 CLI 工具進(jìn)行安裝,此擴(kuò)展包含一個 SMI-Adaptor,它將 SMI 資源轉(zhuǎn)換為本地 Linkerd 資源。
$ linkerd smi install | kubectl apply -f -
$ linkerd smi check
此外也可以通過下面的 Helm 方式來安裝 Linkerd SMI 擴(kuò)展。但在安裝該擴(kuò)展之前,你需要在 CRD 中添加以下注釋和標(biāo)簽,以便 linkerd-smi chart 可以采用它:
$ kubectl annotate --overwrite crd/trafficsplits.split.smi-spec.io \
meta.helm.sh/release-name=linkerd-smi \
meta.helm.sh/release-namespace=linkerd-smi
# 添加smi repo倉庫
$ helm repo add l5d-smi https://linkerd.github.io/linkerd-smi
$ helm upgrade --install linkerd-smi -n linkerd-smi --create-namespace l5d-smi/linkerd-smi
Release "linkerd-smi" has been upgraded. Happy Helming!
NAME: linkerd-smi
LAST DEPLOYED: Sun Sep 11 14:54:02 2022
NAMESPACE: linkerd-smi
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Linkerd SMI extension was successfully installed
$ kubectl get pods -n linkerd-smi
NAME READY STATUS RESTARTS AGE
namespace-metadata--1-jnttx 0/1 Completed 0 17m
smi-adaptor-5788b875d4-r4b7w 2/2 Running 6 (5m53s ago) 17m
最后,你可以繼續(xù)使用通常的 CLI 升級說明,但在應(yīng)用 linkerd upgrade --crds 的輸出時避免使用 --prune 標(biāo)志以避免刪除 TrafficSplit CRD!
升級
接下來我們可以直接使用 linkerd upgrade 命令來升級控制平面,該命令確??刂破矫娴乃鞋F(xiàn)有配置和 mTLS 被保留下來。
$ kubectl get crd |grep linkerd
serverauthorizations.policy.linkerd.io 2022-08-19T04:06:33Z
servers.policy.linkerd.io 2022-08-19T04:06:33Z
serviceprofiles.linkerd.io 2022-08-19T04:06:33Z
$ linkerd upgrade --crds | \
kubectl apply --prune -l linkerd.io/control-plane-ns=linkerd \
--prune-whitelist=apiextensions.k8s.io/v1/customresourcedefinition \
--prune-whitelist=split.smi-spec.io/v1alpha2/trafficsplit \
-f -
customresourcedefinition.apiextensions.k8s.io/authorizationpolicies.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/httproutes.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/meshtlsauthentications.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/networkauthentications.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/serverauthorizations.policy.linkerd.io configured
customresourcedefinition.apiextensions.k8s.io/servers.policy.linkerd.io configured
customresourcedefinition.apiextensions.k8s.io/serviceprofiles.linkerd.io configured
customresourcedefinition.apiextensions.k8s.io/trafficsplits.split.smi-spec.io configured
注意,上面更新命令中我們使用了 --prune 標(biāo)志,該標(biāo)志可以刪除在新版本中不再存在的前一版本的 Linkerd 資源,上面我們是更新新版本的 CRD 資源,可以看到新增了 4 個 CRD,因為現(xiàn)在引入了 Gateway API。
$ kubectl get crd |grep linkerd
authorizationpolicies.policy.linkerd.io 2022-09-11T02:56:13Z
httproutes.policy.linkerd.io 2022-09-11T02:56:13Z
meshtlsauthentications.policy.linkerd.io 2022-09-11T02:56:14Z
networkauthentications.policy.linkerd.io 2022-09-11T02:56:14Z
serverauthorizations.policy.linkerd.io 2022-08-19T04:06:33Z
servers.policy.linkerd.io 2022-08-19T04:06:33Z
serviceprofiles.linkerd.io 2022-08-19T04:06:33Z
不過需要注意的是新增的 Gateway API 相關(guān)的 CRD 并不是原始 Kubernetes 下面定義的,而是也是在 policy.linkerd.io 的組下面,這是因為 Linkerd 對這些 CRD 也做了一些適配。
接下來直接使用下面的命令更新控制平面資源對象:
$ linkerd upgrade | \
kubectl apply --prune -l linkerd.io/control-plane-ns=linkerd -f -
接下來,再次運行此命令并添加一些 --prune-whitelist 標(biāo)志,這可以確保正確修剪某些集群范圍的資源所必需的。
$ linkerd upgrade | kubectl apply --prune -l linkerd.io/control-plane-ns=linkerd \
--prune-whitelist=rbac.authorization.k8s.io/v1/clusterrole \
--prune-whitelist=rbac.authorization.k8s.io/v1/clusterrolebinding \
--prune-whitelist=apiregistration.k8s.io/v1/apiservice -f -
升級過程完成后,同樣可以運行檢查命令來確保一切正常:
$ linkerd check
該命令將針對控制平面進(jìn)行一系列檢查,并確保其正常運行。
現(xiàn)在再次查看 Linkerd 版本,正常 Server 端的版本也更新了。
$ linkerd version
Client version: stable-2.12.0
Server version: stable-2.12.0
接著我們就可以升級數(shù)據(jù)平面了,最簡單的方法是在你的服務(wù)上運行滾動部署,允許代理注入器在它們出現(xiàn)時注入最新版本的代理。
$ kubectl -nrollout restart deploy
一般來說穩(wěn)定版的控制平面與上一個穩(wěn)定版的數(shù)據(jù)平面是兼容的,所以數(shù)據(jù)平面的升級可以在控制平面升級后的任何時候進(jìn)行,但是不建議超過一個穩(wěn)定版本的差距。
同樣更新完成后可以使用 check 命令來校驗數(shù)據(jù)平面狀態(tài)。
$ linkerd check --proxy
# ......
linkerd-data-plane
------------------
√ data plane namespace exists
√ data plane proxies are ready
? data plane is up-to-date
some proxies are not running the current version:
* emoji-696d9d8f95-5vn9w (stable-2.11.1)
* vote-bot-646b9fd6fd-8xj2j (stable-2.11.1)
* voting-ff4c54b8d-xhjv7 (stable-2.11.1)
* web-5f86686c4d-58p7k (stable-2.11.1)
* web-svc-2-f9d77474f-vxlrh (stable-2.11.1)
* ingress-nginx-controller-f56c7f6fd-rxhrs (stable-2.11.1)
see https://linkerd.io/2.12/checks/#l5d-data-plane-version for hints
? data plane and cli versions match
emoji-696d9d8f95-5vn9w running stable-2.11.1 but cli running stable-2.12.0
see https://linkerd.io/2.12/checks/#l5d-data-plane-cli-version for hints
√ 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 annotated
Linkerd extensions checks
=========================
- Running smi extension check
該命令通過一組檢查來驗證數(shù)據(jù)平面是否正常運行,并將列出仍在運行舊版本代理的 pod,然后我們可以根據(jù)實際情況去升級對應(yīng)的 pod 即可。
Linkerd Viz 擴(kuò)展
另外還有一個需要注意的是 viz 插件,在最新版本中已經(jīng)沒有內(nèi)置 grafana 了,所以這里我們先直接將該插件卸載干凈(該插件不會影響網(wǎng)格的核心功能),然后重新安裝最新版本。
$ linkerd viz install | kubectl delete -f -
卸載完成后重新安裝,由于新版本已經(jīng)沒有內(nèi)置 Grafana 了,我們重新安裝的使用可以通過 --set grafana.url 來指定外部的 Grafana 地址(如果是集群外的地址可以通過 grafana.externalUrl 參數(shù)指定),同樣我們還可以使用外部的 Prometheus:
$ linkerd viz install --set grafana.url=grafana:3000,prometheusUrl=http://prometheus.kube-mon.svc.cluster.local:9090,prometheus.enabled=false | kubectl apply -f -
重新安裝后查看 viz 的 pod 列表:
$ kubectl get pods -n linkerd-viz
NAME READY STATUS RESTARTS AGE
metrics-api-674bf48d7f-kzr5b 2/2 Running 0 17m
tap-67d6d8ff4d-q7nqn 2/2 Running 0 5m21s
tap-injector-7c565f754-jgvc5 2/2 Running 0 5m20s
web-87b958bcf-d5pfp 2/2 Running 0 5m20s
可以看到現(xiàn)在沒有了 Grafana 和 Prometheus 了,因為我們對接的外部 Prometheus,而 Grafana 則是新版本中沒有內(nèi)置使用了,上面我們指定的 Grafana 地址在 viz 同命名空間之下,所以這里我們手動安裝一個即可。
如果單個 Grafana 實例指向多個 Linkerd,你可以通過其 UID 中的不同前綴分隔儀表板,可以在每個 Linkerd 實例的 grafana.uidPrefix 設(shè)置中配置這些前綴。
這里我們直接使用 Helm Chart 來進(jìn)行安裝,定制一個如下所示的 values 文件:
podAnnotations:
linkerd.io/inject: enabled
grafana.ini:
server:
root_url: "%(protocol)s://%(domain)s:/grafana/"
auth:
disable_login_form: true
auth.anonymous:
enabled: true
org_role: Editor
auth.basic:
enabled: false
analytics:
check_for_updates: false
panels:
disable_sanitize_html: true
log:
mode: console
log.console:
format: text
level: info
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus.kube-mon.svc.cluster.local:9090
isDefault: true
jsonData:
timeInterval: "5s"
editable: true
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: "default"
orgId: 1
folder: ""
type: file
文章名稱:Linkerd 升級到全新的 2.12 版本
網(wǎng)站路徑:http://fisionsoft.com.cn/article/cddgops.html


咨詢
建站咨詢
