「K8S 生態週報」內容主要包含我所接觸到的 K8S 生態相關的每週值得推薦的一些資訊。歡迎訂閱知乎專欄「k8s生態」。
大家好,我是張晉濤。
這是 2023 年的第一篇『K8S 生態週報』,在上個月的月中之後我因為陽了就停止更新了,一直在修養身體。生病相關的內容我在上一篇文章 張晉濤:我的 2022 總結 | MoeLove有做介紹。願大家都注意身體,保持健康。
這篇中的內容同樣也包含了近一個月中值得關注的內容。
containerd v1.6.15 釋出
儘管 containerd 的 1.7.0-beta.2 也已經於近期釋出,但正式版釋出還需要一段時間。現在 containerd 使用最多的還是 v1.6 和 v1.5 這兩個主要版本,
這次釋出的 v1.6.15 中有一個非常關鍵的變更,是 #7845 - CRI: Fix no CNI info for pod sandbox on restart by dcantah
我主要也是想聊一下這個,從 v1.6.9 開始的最近幾個 containerd 版本中都受到了此問題影響。
簡單來說就是 containerd 重啟後,Sandbox IP 沒能保留,最終導致 kubelet 將會重啟 Pod (如果重啟 kubelet)。
具體現象如下,在 Node 上透過 crictl 工具檢視任意未使用 HostNetwork 的 Pod 的 .status.network
欄位,可以看到如下結果:
(MoeLove) ➜ crictl -r unix:///run/containerd/containerd.sock inspectp e03077da768e6 | jq .status.network
{
"additionalIps": [],
"ip": "10.244.1.5"
在重啟 containerd 後,再次重複操作,就會發現 .status.network.ip
欄位為空了:
(MoeLove) ➜ crictl -r unix:///run/containerd/containerd.sock inspectp e03077da768e6 | jq .status.network
{
"additionalIps": [],
"ip": ""
不過次是如果在 Kubernetes 叢集中透過 kubectl 檢視該 Pod 的狀態,會發現 Pod 的 IP 還在。
(MoeLove) ➜ kubectl get pods moelove-test-pods -o json | jq .status.podIPs
[
{
"ip": "10.244.1.5"
}
]
但如果在 Node 上重啟 kubelet,再次檢視 Pod 的狀態,則會發現它的 IP 發生了變化,並且還重啟了。
(MoeLove) ➜ kubectl get pods moelove-test-pods -o json | jq '{podIPs: .status.podIPs, restartCount: .status.containerStatuses[].restartCount}'
{
"podIPs": [
{
"ip": "10.244.1.8"
}
],
"restartCount": 1
}
在生產環境中,比如要進行版本升級,或者一些維護操作,kubelet 發生重啟是一件常規的事情。
但上述這種情況, 在大多數生產環境都是不能接受的。 這將會導致 Node 上的 Pod 都發生重啟,進而可能會影響到業務的穩定性。
現在 containerd 上游已經進行了修復,也 cherry-pick 到了 v1.6.15 中。
所以,如果想要避免或者修正此問題,
可以使用低於 containerd v1.6.9 的版本,或者直接更新到 v1.6.15。
更多關於 containerd 新版本的變更,請參考其 ReleaseNote
Apache APISIX Ingress v1.6 釋出
距離上一個版本 v1.5 釋出,已經過了 3 個月,Apache APISIX Ingress v1.6 終於正式釋出!
在這個版本中,共有 29 位貢獻者參與程式碼提交,其中 17 位是新增貢獻者,感謝大家的支援和參與!
本次釋出的 Apache APISIX Ingress v1.6 版本帶來了眾多新特性,主要集中在對 Gateway API 的支援,擴充套件 APISIX Ingress 的使用場景,和一些易用性方面的提升。以下是一些重點特性的介紹。
擴充套件對 Gateway API 的支援
Gateway API 是 Kubernetes 中下一代的 Ingress 規範,致力於提供富有表現力,可擴充套件和麵向角色的介面來發展 Kubernetes 的網路,各個 Ingress controller 專案都在積極推進對該規範的支援。Apache APISIX Ingress 專案自 2021 年開始就在積極的緊跟上游社群的發展,並積極推進 Gateway API 在 APISIX Ingress 專案中的實現。
當前,Apache APISIX Ingress 專案中透過 Gateway API 進行配置的特性尚處於 beta 階段,歡迎大家在測試環境中積極進行測試,並提供反饋,我們將持續的對此特性進行最佳化和改進,儘早完成此特性的 GA。
在 APISIX Ingress v1.6 版本中,我們新增了對 Gateway API 中的 TCPRoute
和 UDPRoute
這兩種資源的支援,同時,擴充套件了對 HTTPRoute
資源中 Filters
的支援,這樣使用者在使用 HTTPRoute
資源的時候,就可以在該資源中應用一些重定向,Header 改寫等能力了。
例如可以使用如下配置:
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: http-route
spec:
hostnames: ["httpbin.org"]
rules:
- matches:
- path:
type: PathPrefix
value: /headers
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
add:
- name: X-Api-Version
value: v1
- name: X-api-key
value: api-value
set:
- name: X-Auth
value: filter
remove:
- Remove-header
backendRefs:
- name: httpbin
port: 80
透過使用此配置,client 在對 httpbin.org
進行請求時,將會新增 "X-Api-Version": "v1"
和 "X-Api-Key": "api-value"
的請求頭,並將 "X-Auth"
請求頭的值設定為 filter
,同時將移除 "Remove-Header"
這個請求頭 。
另外就是在這個版本中,增加了對外部服務的代理以及 ExternalName Service 支援;還有支援和外部服務註冊發現元件的整合,比如 Consul, Nacos,Eureka, DNS 等,
而 這些功能在很多 Ingress controller 中是不具備的 。
此外,我們也積極的和眾多開源專案進行了協作,比如可以和 Flagger 以及 Argo 等 GitOps 領域的主流專案整合。關於 Flagger 和 Argo 等相關專案的使用,可以檢視我之前寫的文章。
歡迎感興趣的小夥伴檢視具體的 ReleaseNote
KEDA v2.9 正式釋出
KEDA 是一個基於 Kubernetes ,由事件驅動的自動擴容元件,它為部署在 Kubernetes 上的應用提供了非常靈活的彈性伸縮的能力。
它最新發布的 v2.9 包含了很多值得注意的更新:
- 新增了基於 CouchDB, Etcd 和 Loki 的縮放器;
- 為應用程式自動所放引入現成的 Grafana Dashboard;
- 提供了經過改進的 Prometheus metrics;
- 實驗性的支援了在輪詢間隔期間為縮放器快取指標值的功能;
- 關於 metrics 指標如何暴露給 Kubernetes 的效能改進和架構變化;
- Azure Key Vault 身份驗證提供程式現在支援用於身份驗證的容器標識;
- 針對我們 50 多個縮放器中的一些縮放器的大量新功能和修復;
另外需要注意的是,根據 KEDA 的廢棄策略,自 v2.9 開始官方僅為 Kubernetes v1.23 及更新版本提供支援。
HPA 的 apiVersion 也從 autoscaling/v2beta2
升級到了 autoscaling/v2
。
更多關於此版本的變更,請檢視 ReleaseNote
上游進展
- kubernetes components using leader election to leases by aimuz · Pull Request #114055 · kubernetes/kubernetes 我在之前的文章中介紹過,Kubernetes 中的選舉機制,之前使用基於 ConfigMap 和 secrets 的比較多,但是自 Kubernetes v1.27 開始,將僅僅允許使用 Lease 的介面進行選舉相關操作了;
- Add metric for max no. of CIDRs available by aryan9600 · Pull Request #112260 · kubernetes/kubernetes 新增了
cidrset_cidrs_max_total
和multicidrset_cidrs_max_total
metrics,用於暴露有多少 CIDRs 可供分配; - Migrate to runtime.v1 for CRI · Issue #125 · Mirantis/cri-dockerd 目前 Mirantis 維護的 cri-dockerd 專案也已經將 CRI 升級到了 runtime.v1 了,這樣就可以和 Kubernetes 新版本進行相容,配合使用了;
- Release v1.9.0-beta.1 · kyverno/kyverno Kyverno 釋出了 v1.9.0-beta.1 版本;
- Release v1.13.0-rc4 · cilium/cilium Cilium v1.13.0-rc4 釋出;
- Release v23.0.0-rc.1 · moby/moby Docker v23.0.0-rc1 釋出,這次應該不會跳票了,現在試用裡面便有我的一些努力;
其他
- CircleCI security alert: Rotate any secrets stored in CircleCI (Updated Jan 7) CircleCI 中的一些資訊可能遭到了洩漏,所以建議使用者儘快修改其中的機密資訊。(我已經登出了賬戶)
- update image to v1.7.0 by wangyang0616 · Pull Request #2636 · volcano-sh/volcano 看起來 volcano 是打算釋出 v1.7 版本了
歡迎訂閱我的文章公眾號【MoeLove】