天天看點

K8S 生态周報| containerd 存在 bug 會導緻 Pod 被重新開機,建議更新

作者:xTech
K8S 生态周報| containerd 存在 bug 會導緻 Pod 被重新開機,建議更新
「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 位是新增貢獻者,感謝大家的支援和參與!

K8S 生态周報| containerd 存在 bug 會導緻 Pod 被重新開機,建議更新

本次釋出的 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 項目中的實作。

K8S 生态周報| containerd 存在 bug 會導緻 Pod 被重新開機,建議更新

目前,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;
K8S 生态周報| containerd 存在 bug 會導緻 Pod 被重新開機,建議更新
  • 提供了經過改進的 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】

繼續閱讀