摘要:可以通過驗證自定義對象是否符合標準。此功能可用于及以上版本自定義資源。狀態和規范節分別由自定義資源內的和表示。對子資源的請求采用自定義資源對象,并忽略除狀態節之外的任何更改。該對象作為有效負載發送。
kubernetes自定義資源對象高級功能
本文首發于微信公眾號“我的小碗湯”,掃碼文末二維碼即可關注,歡迎一起交流!
kubernetes自定義資源對象再極大程度提高了API Server的可擴展性,讓企業能夠根據業務需求通過CRD編寫controller或者operator來實現生產中各種特殊場景。隨著k8s的版本升級,CRD的功能也越來越完善,下面對其中幾點進行說明。
以下驗證kubernetes版本為1.13.2,docker版本:18.09.5
Validation(驗證)在項目中用自定義資源對象時,如果創建自定義資源時某些字段不符合要求,會導致監聽該資源對象的controller或者operator出現異常,解析結構體報錯,所以Validation這個功能非常實用,在創建時就進行校驗,減少后面的排錯和異常處理的麻煩。
可以通過 OpenAPI v3 schema驗證自定義對象是否符合標準 。此外,以下限制適用于 schema:
字段default、nullable、discriminator、readOnly、writeOnly、xml、 deprecated 和 $ref 不能設置。
該字段 uniqueItems 不能設置為 true。
該字段 additionalProperties 不能設置為 false。
可以使用 kube-apiserverCustomResourceValidation 上的功能門(feature gate)禁用此功能:
--feature-gates=CustomResourceValidation=false
從以下特性門參數說明地址,可以看到Validation功能在k8s 1.8版本就已經有了,但是CustomResourceValidation特性門是默認false,1.9Beta之后版本默認為true
https://kubernetes.io/docs/re...
以下示例將大概對該功能進行應用和說明,在以下示例中,CustomResourceDefinition 對自定義對象應用以下驗證:
spec.replicas 為必填項,類型為integer,值為大于等于0小于50的偶數(2的倍數);
spec.repository 為必填項;
spec.version為必填項;
spec.pause為boolean類型;
spec.updateStrategy為object類型,該object中有type、pipeline、assignStrategies屬性;
spec.updateStrategy.type為string類型,而且只能為"AssignReceive", "AutoReceive"兩個枚舉值;
spec.updateStrategy.pipeline為string類型,而且為正整數的字符串,符合正則表達式^([1-9][0-9]*){1,3}$;
spec.updateStrategy.assignStrategies為array類型,其元素為object類型(包含slots和fromReplicas屬性);
spec.updateStrategy.assignStrategies.slots為1-16384的正整數;
spec.updateStrategy.assignStrategies.fromReplicas為字符串,符合正則表達式^[a-z0-9,]{3,}$,即至少匹配3位a-z或者0-9或者逗號的字符串;
spec.pod為array類型,其元素為object類型(包含configmap、monitorImage、initImage、middlewareImage字段);
spec.pod.configmap、spec.pod.monitorImage、spec.pod.initImage 、spec.pod.middlewareImage為string類型;且用required指定configmap、initImage、middlewareImage字段為必填項。
將以下內容保存到 redis-cluster-crd.yaml:
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: redisclusters.redis.middleware.hc.cn spec: group: redis.middleware.hc.cn versions: - name: v1alpha1 # Each version can be enabled/disabled by Served flag. served: true # One and only one version must be marked as the storage version. storage: true scope: Namespaced names: kind: RedisCluster singular: rediscluster listKind: RedisClusterList plural: redisclusters shortNames: - rec # 執行kubectl get all時會查到pod、service、該crd等屬于all categories的資源對象 categories: - all validation: # openAPIV3Schema 適用于驗證自定義對象的 schema。 openAPIV3Schema: properties: spec: required: ["replicas", "repository", "version"] properties: pause: type: boolean replicas: type: integer minimum: 0 maximum: 50 # 偶數 multipleOf: 2 updateStrategy: type: object properties: type: type: string # 枚舉 enum: ["AssignReceive", "AutoReceive"] pipeline: type: string pattern: "^([1-9][0-9]*){1,3}$" assignStrategies: type: array items: type: object properties: slots: type: integer minimum: 1 maximum: 16384 fromReplicas: type: string # 至少匹配3位,a-z或者0-9或者, pattern: "^[a-z0-9,]{3,}$" pod: type: array items: type: object required: ["configmap", "middlewareImage", "initImage"] properties: configmap: type: string monitorImage: type: string initImage: type: string middlewareImage: type: string
創建它:
kubectl create -f redis-cluster-crd.yaml
默認不加validation時,在創建自定義資源對象時,不會校驗,有些字段沒有了(如spec.replicas)都可以正常被創建,為了減少排錯的難度和operator、controller的麻煩的檢驗,所以在創建自定義資源定義時,就把validation加上。以上的檢驗應該覆蓋到了常見的檢驗場景,其他場景可以自己摸索。具體還可以參考kubernetes源碼,1.13.2版本kubernetes源碼位于types.go第327行CustomResourceValidation結構體:
$GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go
將以下YAML保存到redis-cluster-cr.yaml:
apiVersion: redis.middleware.hc.cn/v1alpha1 kind: RedisCluster metadata: name: example000-redis-cluster namespace: kube-system spec: # 代表redis集群的個數 replicas: 3 # 代表是否進入維修狀態 pause: true repository: library/redis # 鏡像版本,便于后續多版本特化支持 version: 3.2.6 #redis集群升級策略 updateStrategy: # 升級類型為AutoReceive(自動分配,不用AssignStrategies), AssignReceive(指定值分配,需要用AssignStrategies) type: AssignReceive1 pipeline: "100a" assignStrategies: - slots: 0 fromReplicas: nodeId1 - # 從nodeId3,nodeId4一共分配1000個卡槽 slots: 1000 # 多個nodeId用逗號分隔 fromReplicas: nodeId3,nodeId4 # redis 實例配置詳情 pod: # 配置文件模板名 - configmap: example000-redis-cluster-config # 監控鏡像 monitorImage: redis-exporter:v1 # 初始化鏡像 #initImage: redis-init:v1 # 中間件容器鏡像 middlewareImage: redis-trib:3.2.6
并創建它:
kubectl create -f redis-cluster-cr.yaml
會發現報以下錯誤:
# kubectl apply -f redis-cluster-cr.yaml The RedisCluster "example000-redis-cluster" is invalid: []: Invalid value: map[string]interface {}{"apiVersion":"redis.middleware.hc.cn/v1alpha1", "kind":"RedisCluster", "metadata":map[string]interface {}{"namespace":"kube-system", "uid":"b0946031-766b-11e9-b457-000c295db389", "resourceVersion":"44231", "generation":19, "creationTimestamp":"2019-05-14T17:14:10Z", "annotations":map[string]interface {}{"kubectl.kubernetes.io/last-applied-configuration":"{"apiVersion":"redis.middleware.hc.cn/v1alpha1","kind":"RedisCluster","metadata":{"annotations":{},"name":"example000-redis-cluster","namespace":"kube-system"},"spec":{"pause":true,"pod":[{"configmap":"example000-redis-cluster-config","middlewareImage":"redis-trib:3.2.6","monitorImage":"redis-exporter:v1"}],"replicas":3,"repository":"library/redis","updateStrategy":{"assignStrategies":[{"fromReplicas":"nodeId1","slots":0},{"fromReplicas":"nodeId3,nodeId4","slots":1000}],"pipeline":"100a","type":"AssignReceive1"},"version":"3.2.6"}} "}, "name":"example000-redis-cluster"}, "spec":map[string]interface {}{"version":"3.2.6", "pause":true, "pod":[]interface {}{map[string]interface {}{"middlewareImage":"redis-trib:3.2.6", "monitorImage":"redis-exporter:v1", "configmap":"example000-redis-cluster-config"}}, "replicas":3, "repository":"library/redis", "updateStrategy":map[string]interface {}{"assignStrategies":[]interface {}{map[string]interface {}{"fromReplicas":"nodeId1", "slots":0}, map[string]interface {}{"fromReplicas":"nodeId3,nodeId4", "slots":1000}}, "pipeline":"100a", "type":"AssignReceive1"}}}: validation failure list: spec.updateStrategy.assignStrategies.fromReplicas in body should match "^[a-z0-9,]{3,}$" spec.updateStrategy.assignStrategies.slots in body should be greater than or equal to 1 spec.updateStrategy.pipeline in body should match "^([1-9][0-9]*){1,3}$" spec.updateStrategy.type in body should be one of [AssignReceive AutoReceive] spec.pod.initImage in body is required spec.replicas in body should be a multiple of 2
如果所有字段都符合校驗邏輯,才可以創建對象。
將以下 YAML 保存到 redis-cluster-cr.yaml:
apiVersion: redis.middleware.hc.cn/v1alpha1 kind: RedisCluster metadata: name: example000-redis-cluster namespace: kube-system spec: # 代表redis集群的個數 replicas: 6 # 代表是否進入維修狀態 pause: true repository: library/redis # 鏡像版本,便于后續多版本特化支持 version: 3.2.6 #redis集群升級策略 updateStrategy: # 升級類型為AutoReceive(自動分配,不用AssignStrategies), AssignReceive(指定值分配,需要用AssignStrategies) type: AssignReceive pipeline: "100" assignStrategies: - slots: 1 fromReplicas: all - # 從nodeId3,nodeId4一共分配1000個卡槽 slots: 1000 # 多個nodeId用逗號分隔 fromReplicas: node1,node2 # redis 實例配置詳情 pod: # 配置文件模板名 - configmap: example000-redis-cluster-config # 監控鏡像 monitorImage: redis-exporter:v1 # 初始化鏡像 initImage: redis-init:v1 # 中間件容器鏡像 middlewareImage: redis-trib:3.2.6
并創建它,發現才可以創建:
# kubectl apply -f redis-cluster-cr.yaml rediscluster.redis.middleware.hc.cn/example000-redis-cluster configuredCategory(分類)
類別是自定義資源所屬的分組資源的列表(例如 all)。您可以使用 kubectl get
以下示例添加 all CustomResourceDefinition 中的類別列表,并說明如何使用 kubectl get all 輸出自定義資源 。
將以下 內容保存到 redis-cluster-crd.yaml中執行kubectl apply -f redis-cluster-crd.yaml:
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: redisclusters.redis.middleware.hc.cn spec: group: redis.middleware.hc.cn versions: - name: v1alpha1 # Each version can be enabled/disabled by Served flag. served: true # One and only one version must be marked as the storage version. storage: true scope: Namespaced names: kind: RedisCluster singular: rediscluster listKind: RedisClusterList plural: redisclusters shortNames: - rec # 執行kubectl get all時會查到pod、service、該crd等屬于all categories的資源對象 categories: - all
將以下內容保存到redis-cluster-cr.yaml中執行kubectl apply -f redis-cluster-cr.yaml:
apiVersion: redis.middleware.hc.cn/v1alpha1 kind: RedisCluster metadata: name: example000-redis-cluster namespace: kube-system spec: # 代表redis集群的個數 replicas: 6 # 代表是否進入維修狀態 pause: true repository: library/redis # 鏡像版本,便于后續多版本特化支持 version: 3.2.6 #redis集群升級策略 updateStrategy: # 升級類型為AutoReceive(自動分配,不用AssignStrategies), AssignReceive(指定值分配,需要用AssignStrategies) type: AssignReceive pipeline: "100" assignStrategies: - slots: 2000 fromReplicas: nodeId1 - # 從nodeId3,nodeId4一共分配1000個卡槽 slots: 1000 # 多個nodeId用逗號分隔 fromReplicas: nodeId3,nodeId4 # redis 實例配置詳情 pod: # 配置文件模板名 - configmap: example000-redis-cluster-config # 監控鏡像 monitorImage: redis-exporter:v1 # 初始化鏡像 initImage: redis-init:v1 # 中間件容器鏡像 middlewareImage: redis-trib:3.2.6
執行kubectl get all -nkube-system時會查到pod、service、該crd等屬于all categories的資源對象。(這個可能得等幾分鐘才能生效)
子資源 status子資源啟用狀態子資源后,將公開自定義資源的子資源 /status。
狀態和規范節分別由自定義資源內的 .status 和 .spec JSONPath 表示。
PUT /status 對子資源的請求采用自定義資源對象,并忽略除狀態節之外的任何更改。
PUT /status 對子資源的請求僅驗證自定義資源的狀態節。
PUT/ POST/ PATCH 請求自定義資源忽略更改狀態節。
對 spec 節的任何更改都會增加 .metadata.generation 的值。
在code-generator生成代碼時會生成,如下方法:
// RedisClusterInterface has methods to work with RedisCluster resources. type RedisClusterInterface interface { Create(*v1alpha1.RedisCluster) (*v1alpha1.RedisCluster, error) Update(*v1alpha1.RedisCluster) (*v1alpha1.RedisCluster, error) UpdateStatus(*v1alpha1.RedisCluster) (*v1alpha1.RedisCluster, error) ...... }scale子資源
啟用 scale 子資源后,將公開自定義資源的子資源 /scale。該 autoscaling/v1.Scale 對象作為有效負載發送 /scale。
要啟用 scale 子資源,CustomResourceDefinition 中需要定義以下值。
SpecReplicasPath 在與之對應的自定義資源中定義 JSONPath Scale.Spec.Replicas。這是一個必需的值。.spec 只允許使用帶點符號的 JSONPaths 。如果 SpecReplicasPath 自定義資源中沒有值,則 /scale 子資源將在GET上返回錯誤。
StatusReplicasPath 在與之對應的自定義資源中定義 JSONPath Scale.Status.Replicas。這是一個必需的值。.stutus 只允許使用帶點符號的 JSONPaths 。如果 StatusReplicasPath 自定義資源中沒有值,則子資源 /scale 中的狀態副本值將默認為 0。
LabelSelectorPath在與之對應的自定義資源中定義 JSONPath Scale.Status.Selector。這是一個可選值。必須將其設置為與 HPA 一起使用。.status 只允許使用帶點符號的 JSONPaths 。如果 LabelSelectorPath 自定義資源中沒有值,則子資源 /scale 中的狀態選擇器值將默認為空字符串。
在以下示例中,啟用了status 和 scale 子資源。
將以下內容保存到redis-cluster-crd.yaml并創建 kubectl apply -f redis-cluster-crd.yaml:
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: redisclusters.redis.middleware.hc.cn spec: group: redis.middleware.hc.cn versions: - name: v1alpha1 # Each version can be enabled/disabled by Served flag. served: true # One and only one version must be marked as the storage version. storage: true scope: Namespaced names: kind: RedisCluster singular: rediscluster listKind: RedisClusterList plural: redisclusters shortNames: - rec # 執行kubectl get all時會查到pod、service、該crd等屬于all categories的資源對象 categories: - all subresources: # status enables the status subresource. status: {} scale: # specReplicasPath defines the JSONPath inside of a custom resource that corresponds to Scale.Spec.Replicas. specReplicasPath: .spec.replicas # statusReplicasPath defines the JSONPath inside of a custom resource that corresponds to Scale.Status.Replicas. statusReplicasPath: .status.replicas # labelSelectorPath defines the JSONPath inside of a custom resource that corresponds to Scale.Status.Selector. labelSelectorPath: .status.labelSelector
創建 CustomResourceDefinition 對象后,您可以創建自定義對象。
如果您將以下 YAML 保存到 redis-cluster-cr.yaml:
apiVersion: redis.middleware.hc.cn/v1alpha1 kind: RedisCluster metadata: name: example000-redis-cluster namespace: kube-system spec: # 代表redis集群的個數 replicas: 6 # 代表是否進入維修狀態 pause: true repository: library/redis # 鏡像版本,便于后續多版本特化支持 version: 3.2.6 #redis集群升級策略 updateStrategy: # 升級類型為AutoReceive(自動分配,不用AssignStrategies), AssignReceive(指定值分配,需要用AssignStrategies) type: AssignReceive pipeline: "100" assignStrategies: - slots: 2000 fromReplicas: nodeId1 - # 從nodeId3,nodeId4一共分配1000個卡槽 slots: 1000 # 多個nodeId用逗號分隔 fromReplicas: nodeId3,nodeId4 # redis 實例配置詳情 pod: # 配置文件模板名 - configmap: example000-redis-cluster-config # 監控鏡像 monitorImage: redis-exporter:v1 # 初始化鏡像 initImage: redis-init:v1 # 中間件容器鏡像 middlewareImage: redis-trib:3.2.6
并創建它:
kubectl create -f redis-cluster-cr.yaml
然后在以下位置創建新的命名空間 RESTful API 端點:
/apis/redis.middleware.hc.cn/v1alpha1/namespaces/kube-system/redisclusters/example000-redis-cluster/status
和
/apis/redis.middleware.hc.cn/v1alpha1/namespaces/kube-system/redisclusters/example000-redis-cluster/scale
可以使用該 kubectl scale 命令縮放自定義資源。例如,以上創建的自定義資源的的 .spec.replicas 設置為 10:
# kubectl get rec --all-namespaces NAMESPACE NAME DESIRED PAUSE AGE kube-system example000-redis-cluster 6 true 10h # kubectl scale --replicas=10 rec/example000-redis-cluster -nkube-system rediscluster.redis.middleware.hc.cn/example000-redis-cluster scaled # kubectl get rec --all-namespaces NAMESPACE NAME DESIRED PAUSE AGE kube-system example000-redis-cluster 10 true 10h # kubectl get rec example000-redis-cluster -n kube-system -o jsonpath="{.spec.replicas}" 10打印其他列
從 Kubernetes 1.11 開始,kubectl 使用服務器端打印。服務器決定 kubectl get 命令顯示哪些列。您可以使用 CustomResourceDefinition 自定義這些列。下面的示例將輸出 Spec、Replicas 和 Age 列。
將 CustomResourceDefinition保存到 redis-cluster-crd.yaml。
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: redisclusters.redis.middleware.hc.cn spec: group: redis.middleware.hc.cn versions: - name: v1alpha1 # Each version can be enabled/disabled by Served flag. served: true # One and only one version must be marked as the storage version.
scope: Namespaced names: kind: RedisCluster singular: rediscluster listKind: RedisClusterList plural: redisclusters shortNames: - rec # 執行kubectl get all時會查到pod、service、該crd等屬于all categories的資源對象 categories: - all additionalPrinterColumns: - name: DESIRED type: integer description: The number of statefulset managed by the this redisCluster JSONPath: .spec.replicas # boolean,date,integer,number,string - name: PAUSE type: boolean description: Whether this redisCluster"s grandson (pod) will not be managed by statefulset JSONPath: .spec.pause
2. 創建 CustomResourceDefinition:
kubectl create -f redis-cluster-crd.yaml
3. 使用上面創建的 `redis-cluster-cr.yaml` 實例。 4. 調用服務器端打印:
kubectl get rec --all-namespaces
請注意 `NAME`、`NAMESPACE`, `DESIRED`、`PAUSE` 和 `AGE` 在輸出列,并且都被轉成了大寫字母:
[root@master-192 redis-container]# kubectl get rec --all-namespaces
NAMESPACE NAME DESIRED PAUSE AGE
kube-system example000-redis-cluster 6 true 10h
`NAME`和`NAMESPACE` 列是隱含的,不需要在 CustomResourceDefinition 中定義。 ## operator中應用該特性 在golang編寫的operator代碼中創建該結構體:
//創建CRD
func CreateRedisClusterCRD(extensionCRClient *extensionsclient.Clientset) error {
//add CustomResourceValidation due to guarantee redis operator work normally labelSelectorPath := ".status.labelSelector" replicasMinimum := float64(0) replicasMaximum := float64(50) replicasMultipleOf := float64(2) slotsMinimum := float64(1) slotsMaximum := float64(16384) assignStr := "AssignReceive" autoStr := "AutoReceive" assignJson, _ := json.Marshal(assignStr) autoJson, _ := json.Marshal(autoStr) crd := &v1beta1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ Name: "redisclusters." + v1alpha1.SchemeGroupVersion.Group, }, Spec: v1beta1.CustomResourceDefinitionSpec{ Group: v1alpha1.SchemeGroupVersion.Group, Versions: []v1beta1.CustomResourceDefinitionVersion { { // Served is a flag enabling/disabling this version from being served via REST APIs Served: true, Name: v1alpha1.SchemeGroupVersion.Version, // Storage flags the version as storage version. There must be exactly one flagged as storage version Storage: true, }, }, Scope: v1beta1.NamespaceScoped, Names: v1beta1.CustomResourceDefinitionNames{ Kind: "RedisCluster", ListKind: "RedisClusterList", Plural: "redisclusters", Singular: "rediscluster", ShortNames: []string{"rec"}, Categories: []string{"all"}, }, Subresources: &v1beta1.CustomResourceSubresources { Status: &v1beta1.CustomResourceSubresourceStatus {}, Scale: &v1beta1.CustomResourceSubresourceScale { SpecReplicasPath: ".spec.replicas", StatusReplicasPath: ".status.replicas", LabelSelectorPath: &labelSelectorPath, }, }, AdditionalPrinterColumns: []v1beta1.CustomResourceColumnDefinition{ { Name: "DESIRED", Type: "integer", Description: "The number of statefulset managed by the this redisCluster", JSONPath: ".spec.replicas", }, { Name: "PAUSE", Type: "boolean", Description: "Whether this redisCluster"s grandson (pod) will not be managed by statefulset", JSONPath: ".spec.pause", }, { Name: "AGE", Type: "date", JSONPath: ".metadata.creationTimestamp", }, }, Validation: &v1beta1.CustomResourceValidation { OpenAPIV3Schema: &v1beta1.JSONSchemaProps { Properties: map[string]v1beta1.JSONSchemaProps { "spec": { Required: []string{"replicas", "repository", "version"}, Properties: map[string]v1beta1.JSONSchemaProps{ "pause": { Type: "boolean", }, "replicas": { Type: "integer", Minimum: &replicasMinimum, Maximum: &replicasMaximum, MultipleOf: &replicasMultipleOf, }, "updateStrategy": { Type: "object", Properties: map[string]v1beta1.JSONSchemaProps{ "type": { Type: "string", Enum: []v1beta1.JSON { { //這里必須是JSON格式的字符串 Raw: assignJson, }, { Raw: autoJson, }, }, }, "pipeline": { Type: "string", Pattern: `^([1-9][0-9]*){1,3}$`, }, "assignStrategies": { Type: "array", Items: &v1beta1.JSONSchemaPropsOrArray{ Schema: &v1beta1.JSONSchemaProps{ Type: "object", Properties: map[string]v1beta1.JSONSchemaProps{ "slots": { Type: "integer", Minimum: &slotsMinimum, Maximum: &slotsMaximum, }, "fromReplicas": { Type: "string", Pattern: `^[a-z0-9,]{3,}$`, }, }, }, }, }, }, }, }, }, "pod": { Type: "array", Items: &v1beta1.JSONSchemaPropsOrArray { Schema: &v1beta1.JSONSchemaProps { Type: "object", Required: []string{"replicas", "repository", "version"}, Properties: map[string]v1beta1.JSONSchemaProps{ "configmap": { Type: "string", }, "monitorImage": { Type: "string", }, "initImage": { Type: "string", }, "middlewareImage": { Type: "string", }, }, }, }, }, }, }, }, }, } _, err := extensionCRClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd) return err
}
## 參考 官方Extend the Kubernetes API with CustomResourceDefinitions: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ feature-gates參數說明: https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/ CustomResourceDefinition中文文檔: https://kubernetes.feisky.xyz/cha-jian-kuo-zhan/api/customresourcedefinition swagger和openAPI: 數據類型: https://www.breakyizhan.com/swagger/2969.html 正則表達式: https://www.cnblogs.com/afarmer/archive/2011/08/29/2158860.html ---- --- 本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程序猿,那么這些資源很適合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時我們組建了一個技術交流群,里面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號后臺回復【2】,免費邀請加技術交流群互相學習提高,會不定期分享編程IT相關資源。 **掃碼關注,精彩內容第一時間推給你**
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27864.html
摘要:可以通過驗證自定義對象是否符合標準。此功能可用于及以上版本自定義資源。狀態和規范節分別由自定義資源內的和表示。對子資源的請求采用自定義資源對象,并忽略除狀態節之外的任何更改。該對象作為有效負載發送。 kubernetes自定義資源對象高級功能 本文首發于微信公眾號我的小碗湯,掃碼文末二維碼即可關注,歡迎一起交流! kubernetes自定義資源對象再極大程度提高了API Server的...
摘要:提供用于獲取有關容器和容器組狀態的實時信息的服務,以及有關群集中開發人員操作的詳細信息。集群最高級別的抽象是指運行本身是集群應用程序的一組機器及其管理的容器,一個集群必須有一個,即命令和控制集群中所有其他機器的系統。Docker容器改變了人們對開發、部署和維護軟件的思考方式,利用現代操作系統的本機隔離功能,容器支持類似于虛擬機的關注點分離,但是與基于虛擬機監控程序的虛擬機相比,它的開銷要小得...
摘要:安全功能的最新引入是一組稱為準入控制器的插件。通過將標志傳遞給服務器來配置啟用的準入控制器集。本討論將僅關注基于的準入控制器。摘要準入控制器為安全性提供了顯著優勢。 作者:Malte Isberner(StackRox) Kubernetes極大地提高了當今生產中后端群集的速度和可管理性。由于其靈活性、可擴展性和易用性,Kubernetes已成為容器編排器的事實標準。Kubernete...
摘要:安全功能的最新引入是一組稱為準入控制器的插件。通過將標志傳遞給服務器來配置啟用的準入控制器集。本討論將僅關注基于的準入控制器。摘要準入控制器為安全性提供了顯著優勢。 作者:Malte Isberner(StackRox) Kubernetes極大地提高了當今生產中后端群集的速度和可管理性。由于其靈活性、可擴展性和易用性,Kubernetes已成為容器編排器的事實標準。Kubernete...
摘要:而用戶能在同一平臺上管理任何集群,輕松地充分利用的強大能力及其迅速壯大的生態系統。在本指南中,你將會了解如何快速上手。環境中的所有主機必須允許彼此間的流量能夠進行跨主機聯網。這一過程需要幾分鐘完成。如果服務正常,將會顯示狀態為綠色。 大家好,給大家介紹一下,這是幫助大家率先上手嘗試Rancher 2.0的神器 @Rancher 2.0快速上手指南 內容導讀 準備一臺Linux主機 啟...
閱讀 732·2021-08-17 10:11
閱讀 1598·2019-08-30 11:15
閱讀 1020·2019-08-26 13:54
閱讀 3508·2019-08-26 11:47
閱讀 1220·2019-08-26 10:20
閱讀 2820·2019-08-23 18:35
閱讀 1216·2019-08-23 17:52
閱讀 1299·2019-08-23 16:19