「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,分別叫 redis
和 redis2
。
(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】