Kubernetes v1.23.0 正式釋出,新特性一覽

張晉濤發表於2021-12-14
「K8S 生態週報」內容主要包含我所接觸到的 K8S 生態相關的每週值得推薦的一些資訊。歡迎訂閱知乎專欄「k8s生態」

Kubernetes v1.23 即將釋出,這是 2021 年釋出的第三個版本,也是今年最後一個正式釋出的版本。

此版本中主要包括 47 項增強更新,其中 11 項達到 stable, 17 項達到 beta 還有 19 項達到 alpha 。 當然,也有 1 項被標記為廢棄。相比於 v1.22 從數量上來說是少了一點(v1.22 有 53 項增強更新),但這並不影響這是一個很棒的版本!

在 Kubernetes 的釋出週期變更為 每4個月一個版本 後,很明顯的感覺就是不用在升級上面花費太多時間了,畢竟 Kubernetes 的升級操作是個體力活,大家覺得呢?

我們一起來看看這個版本中有哪些值得關注的變更吧!

新增 kubectl alpha events 命令

在之前的 《K8S 生態週報| Helm 新版本釋出增強對 OCI 的支援》 文章的上游進展中我曾為大家介紹了該功能。它是按照 KEP #1440 實施的。

增加此命令主要是由於在不修改 kubectl get 的前提下,檢視 event 有一些限制,所以直接增加 kubectl events 命令可以更方便的去獲取到需要的資訊,尤其是 event 是在 Kubernetes 中經常需要檢視的一個資訊。kubectl get events 比較典型的一些問題, 比如排序(雖然可以通過加引數解決), watch,以及無法按照時間線方式去檢視 events 等。

我們來看看這個命令具體如何使用。

我們先來建立兩個 Pod,分別叫 redisredis2

(MoeLove) ➜ kubectl run redis --image="ghcr.io/tao12345666333/redis:alpine" 
pod/redis created
(MoeLove) ➜ kubectl run redis2 --image="ghcr.io/tao12345666333/redis:alpine"
pod/redis2 created
(MoeLove) ➜ kubectl  get pods
NAME     READY   STATUS    RESTARTS   AGE
redis    1/1     Running   0          12m
redis2   1/1     Running   0          2m23s

執行 kubectl alpha events 可以看到當前 namespace 下的所有 events 。如果增加 --for 條件可以用來篩選只展示特定資源相關的 events 。同時 預設情況下就是按時間排序的

(MoeLove) ➜ kubectl  alpha events
LAST SEEN   TYPE     REASON      OBJECT       MESSAGE
12m         Normal   Scheduled   Pod/redis    Successfully assigned default/redis to kind-control-plane
12m         Normal   Pulling     Pod/redis    Pulling image "ghcr.io/tao12345666333/redis:alpine"
12m         Normal   Pulled      Pod/redis    Successfully pulled image "ghcr.io/tao12345666333/redis:alpine" in 4.028873745s
12m         Normal   Created     Pod/redis    Created container redis
12m         Normal   Started     Pod/redis    Started container redis
3m5s        Normal   Scheduled   Pod/redis2   Successfully assigned default/redis2 to kind-control-plane
3m5s        Normal   Pulled      Pod/redis2   Container image "ghcr.io/tao12345666333/redis:alpine" already present on machine
3m4s        Normal   Created     Pod/redis2   Created container redis2
3m4s        Normal   Started     Pod/redis2   Started container redis2
(MoeLove) ➜ kubectl  alpha events --for pod/redis2
LAST SEEN   TYPE     REASON      OBJECT       MESSAGE
3m23s       Normal   Scheduled   Pod/redis2   Successfully assigned default/redis2 to kind-control-plane
3m23s       Normal   Pulled      Pod/redis2   Container image "ghcr.io/tao12345666333/redis:alpine" already present on machine
3m22s       Normal   Created     Pod/redis2   Created container redis2
3m22s       Normal   Started     Pod/redis2   Started container redis2

IPv4/IPv6 雙棧支援達到 GA

在配置雙棧網路的 Kubernetes 時,需要同時指定 --node-cidr-mask-size-ipv4--node-cidr-mask-size-ipv6 以便於設定每個 Node 上的子網大小。在此之前我們都是直接使用 --node-cidr-mask-size 進行設定即可。

如果我們仍然使用單棧 Kubernetes 叢集的話,正常來說不需要做什麼調整,當然我們也可以使用上面提到的選項,來單獨設定叢集的 IPv4/IPv6 子網。

PodSecurity Admission 達到 Beta

PodSecurity Admission 是之前的 PSP 的代替,關於 Kubernetes Admission 可以參考我之前的文章 《理清 Kubernetes 中 Admission 機制》,這裡就不展開了。

IngressClass 支援 namespace 級別的引數

IngressClass.Spec.Parameters.Namespace 欄位當前達到 GA ,這樣我們就可以為 IngressClass 設定引數為 namespace 級別了。比如:

apiVersion: networking.k8s.io/v1
 kind: IngressClass
 metadata:
   name: external-lb
 spec:
   controller: example.com/ingress-controller
   parameters:
     apiGroup: k8s.example.com
     kind: IngressParameters
     name: external-lb
     namespace: external-configuration
     scope: Namespace

Probe 中增加 gRPC 協議的支援

通過 KEP #2727 ,在此版本中為 Pod.Spec.Container.{Liveness,Readiness,Startup} 的 Probe 新增了 gRPC 協議的支援。 例如:

readinessProbe:
  grpc:
    port: 9090
    service: moelove-service
  initialDelaySeconds: 5
  periodSeconds: 10

可通過 GRPCContainerProbe feature gate 開啟此特性。具體細節可參考 #106463

新增 OpenAPI V3

這個特性是 Alpha 級別,可通過 OpenApiv3 feature gate 進行開啟。

增加此特性主要是由於 CRD 目前可通過 OpenApi V3 進行定義,但是 api-server 目前還不支援。當從 OpenApi V3 轉換為 V2 時,部分資訊將會丟失。

更多詳細資訊可參考 KEP #2896

CRD Validation 表示式語言

這是一項 Alpha 級別的特性,預設是不開啟的。可通過增加 CustomResourceValidationExpressions feature gate 來進行開啟。單獨介紹此 Alpha 級別的特性是因為目前基於 Custom Resource Definitions (CRDs) 的方式對 Kubernetes 進行擴充套件已經成為主流,但是在 CRD 中目前能新增的校驗規則有限,更多的場景都需要通過額外的 Admission 來完成。

此功能使用一種叫做 Common Expression Language (CEL) 的語言進行規則定義,通過 x-kubernetes-validation-rules 欄位進行規則的新增。

例如,某個 CRDs 的內容如下,其中定義了 minReplicas 小於 replicas 並且 replicas 小於 maxReplicas

...
openAPIV3Schema:
  type: object
  properties:
    spec:
      type: object
      x-kubernetes-validation-rules:
        - rule: "self.minReplicas <= self.replicas"
          message: "replicas should be greater than or equal to minReplicas."
        - rule: "self.replicas <= self.maxReplicas"
          message: "replicas should be smaller than or equal to maxReplicas."
      properties:
        ...
        minReplicas:
          type: integer
        replicas:
          type: integer
        maxReplicas:
          type: integer
      required:
        - minReplicas
        - replicas
        - maxReplicas 

那麼,當有如下的自定義資源建立時,Kubernetes 將會拒絕其請求。

apiVersion: "stable.example.com/v1"
kind: CustomDeployment
metadata:
  name: my-new-deploy-object
spec:
  minReplicas: 0
  replicas: 20
  maxReplicas: 10

並且返回如下錯誤:

The CustomDeployment "my-new-deploy-object" is invalid:
* spec: Invalid value: map[string]interface {}{"maxReplicas":10, "minReplicas":0, "replicas":20}: replicas should be smaller than or equal to maxReplicas.

這樣相比原來我們通過 Admission 的方式來進行校驗就會方便的多。關於 Kubernetes Admission 可以參考我之前的文章 《理清 Kubernetes 中 Admission 機制》。

HPA v2 API 達到 GA

HPA v2 大約是在 5 年前首次提出,經過這 5 年的發展,終於在現在它達到了 GA 級別。

以上就是關於 Kubernetes v1.23 中我認為值得關注的一些主要特性,更多資訊可參閱其 ReleaseNote


歡迎訂閱我的文章公眾號【MoeLove】

TheMoeLove

相關文章