摘要:看過的應(yīng)該都知道項(xiàng)目中有大量代碼工具生成的代碼。執(zhí)行即腳本將自動(dòng)生成下面的文件和路徑腳本運(yùn)行后大體會(huì)建立如下的包管理結(jié)構(gòu)是不是很簡(jiǎn)單代碼是被完全生成的,就像包含我們的語言類型的文件下面的文件一樣然后你就可以基于生成的代碼寫自己的了。
CRD簡(jiǎn)介和使用姿勢(shì)
CustomResourceDefinition(CRD)是 v1.7 + 新增的無需改變代碼就可以擴(kuò)展 Kubernetes API 的機(jī)制,用來管理自定義對(duì)象。它實(shí)際上是 ThirdPartyResources(TPR) 的升級(jí)版本,而 TPR 已經(jīng)在 v1.8 中刪除。
一些使用場(chǎng)景:提供/管理外部數(shù)據(jù)存儲(chǔ)/數(shù)據(jù)庫(例如 CloudSQL/RDS 實(shí)例)
對(duì)k8s基礎(chǔ)資源進(jìn)行更高層次的抽象(比如定義一個(gè)etcd集群)
其實(shí)crd在很多k8s周邊開源項(xiàng)目中有使用,比如ingress-controller和眾多的operator。
CRD 控制器在使用 CRD 擴(kuò)展 Kubernetes API 時(shí),通常還需要實(shí)現(xiàn)一個(gè)新建資源的控制器,監(jiān)聽改資源的變化情況,并作進(jìn)一步的處理。官方提供的示例項(xiàng)目sample-controller。
這個(gè)例子主要講述了以下幾個(gè)方面:
如何使用自定義資源定義注冊(cè)Foo類型的新自定義資源(自定義資源類型)
如何創(chuàng)建/獲取/列出新資源類型Foo實(shí)例
如何在資源處理創(chuàng)建/更新/刪除事件上設(shè)置控制器
編寫crd controller之前,一定要使用k8s官方提供的代碼生成工具k8s.io/code-generator 去生成 client, informers, listers and deep-copy函數(shù).不僅代碼風(fēng)格符合k8s,而且減少出錯(cuò)和減少工作量都是有很大的幫助。
在項(xiàng)目中使用代碼生成器下面展示了代碼生成工具是如何工作的以及如何使用最少的代碼行將它們應(yīng)用到自己的項(xiàng)目中,從而為您生成 deepcopy 函數(shù)/typed clients/listers/informer,所有這些的生成僅需要一個(gè) shell 腳本調(diào)用和部分代碼注釋。
不要覺得代碼生成有多么復(fù)雜,其實(shí)官方已經(jīng)做了很多工作了,提供了 generator-group.sh。看過client-go的gopher應(yīng)該都知道項(xiàng)目中有大量代碼工具生成的代碼。
執(zhí)行./hack/update-codegen.sh,即
#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -o errexit set -o nounset set -o pipefail SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/.. CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)} # generate the code with: # --output-base because this script should also be able to run inside the vendor dir of # k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir # instead of the $GOPATH directly. For normal projects this can be dropped. ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" k8s.io/canary-controller/pkg/client k8s.io/canary-controller/pkg/apis canarycontroller:v1alpha1 --output-base "$(dirname ${BASH_SOURCE})/../../.." --go-header-file ${SCRIPT_ROOT}/hack/boilerplate.go.txt # To use your own boilerplate text use: # --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt
update-codegen腳本將自動(dòng)生成下面的文件和路徑
pkg/apis/canarycontroller/v1alpha1/zz_generated.deepcopy.go
pkg/client/
腳本運(yùn)行后大體會(huì)建立如下的包管理結(jié)構(gòu):
是不是很簡(jiǎn)單?pkg/client 代碼是被完全生成的,就像包含我們的 CustomResource golang語言類型的 types.go 文件下面的 zz_generated.deepcopy.go 文件一樣,然后你就可以基于生成的代碼寫自己的controller了。
不過并不是不需要自己寫一點(diǎn)代碼,畢竟機(jī)器沒有智能到你定義了什么樣子的crd。所有以下幾個(gè)文件需要自己來定義和實(shí)現(xiàn),均是和你自己的業(yè)務(wù)邏輯相關(guān)。
pkg/apis以下的除zz_generated.deepcopy.go以外的所有文件。
比如:
types.go
/* Copyright 2017 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Canary is a specification for a Foo resource type Canary struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec CanarySpec `json:"spec"` Status CanaryStatus `json:"status"` } // CanarySpec is the spec for a Foo resource type CanarySpec struct { DeploymentName string `json:"deploymentName"` Replicas *int32 `json:"replicas"` } // CanaryStatus is the status for a Foo resource type CanaryStatus struct { AvailableReplicas int32 `json:"availableReplicas"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // CanaryList is a list of Foo resources type CanaryList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` Items []Canary `json:"items"` }
registry.go
/* Copyright 2017 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" canarycontroller "k8s.io/canary-controller/pkg/apis/canarycontroller" ) // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: canarycontroller.GroupName, Version: "v1alpha1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { return SchemeGroupVersion.WithKind(kind).GroupKind() } // Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } var ( SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) AddToScheme = SchemeBuilder.AddToScheme ) // Adds the list of known types to Scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &Canary{}, &CanaryList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil }更多相關(guān)細(xì)節(jié)
見 Kubernetes Deep Dive: Code Generation for CustomResources給出了具體的步驟和關(guān)于tag的標(biāo)注。
總結(jié)基于crd以及crd controller可以抽象很多業(yè)務(wù)場(chǎng)景。接下我司準(zhǔn)備實(shí)現(xiàn)一個(gè)部署策略相關(guān)的項(xiàng)目。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/32653.html
摘要:看過的應(yīng)該都知道項(xiàng)目中有大量代碼工具生成的代碼。執(zhí)行即腳本將自動(dòng)生成下面的文件和路徑腳本運(yùn)行后大體會(huì)建立如下的包管理結(jié)構(gòu)是不是很簡(jiǎn)單代碼是被完全生成的,就像包含我們的語言類型的文件下面的文件一樣然后你就可以基于生成的代碼寫自己的了。 CRD簡(jiǎn)介和使用姿勢(shì) CustomResourceDefinition(CRD)是 v1.7 + 新增的無需改變代碼就可以擴(kuò)展 Kubernetes AP...
摘要:可以通過驗(yàn)證自定義對(duì)象是否符合標(biāo)準(zhǔn)。此功能可用于及以上版本自定義資源。狀態(tài)和規(guī)范節(jié)分別由自定義資源內(nèi)的和表示。對(duì)子資源的請(qǐng)求采用自定義資源對(duì)象,并忽略除狀態(tài)節(jié)之外的任何更改。該對(duì)象作為有效負(fù)載發(fā)送。 kubernetes自定義資源對(duì)象高級(jí)功能 本文首發(fā)于微信公眾號(hào)我的小碗湯,掃碼文末二維碼即可關(guān)注,歡迎一起交流! kubernetes自定義資源對(duì)象再極大程度提高了API Server的...
摘要:可以通過驗(yàn)證自定義對(duì)象是否符合標(biāo)準(zhǔn)。此功能可用于及以上版本自定義資源。狀態(tài)和規(guī)范節(jié)分別由自定義資源內(nèi)的和表示。對(duì)子資源的請(qǐng)求采用自定義資源對(duì)象,并忽略除狀態(tài)節(jié)之外的任何更改。該對(duì)象作為有效負(fù)載發(fā)送。 kubernetes自定義資源對(duì)象高級(jí)功能 本文首發(fā)于微信公眾號(hào)我的小碗湯,掃碼文末二維碼即可關(guān)注,歡迎一起交流! kubernetes自定義資源對(duì)象再極大程度提高了API Server的...
摘要:同時(shí)有權(quán)限控制日志審計(jì)整體配置過期時(shí)間等功能。將成為趨勢(shì)前置條件要求的版本應(yīng)該是因?yàn)楹椭С值南拗频暮诵乃枷胧菍⒌牟渴鹋c它監(jiān)控的對(duì)象的配置分離,做到部署與監(jiān)控對(duì)象的配置分離之后,就可以輕松實(shí)現(xiàn)動(dòng)態(tài)配置。 一.單獨(dú)部署 二進(jìn)制安裝各版本下載地址:https://prometheus.io/download/ Docker運(yùn)行 運(yùn)行命令:docker run --name promet...
摘要:王磊此次演講的題目為容器新技術(shù)架構(gòu)下的運(yùn)維實(shí)踐,詳細(xì)為大家講解了在基于構(gòu)建容器的過程中,如何以應(yīng)用為中心,通過新的技術(shù)工具對(duì)服務(wù)節(jié)點(diǎn)集群平臺(tái)等多個(gè)方面進(jìn)行管理運(yùn)維,提高系統(tǒng)的自動(dòng)化運(yùn)維能力。 2018年11月16-17日,運(yùn)維&容器技術(shù)盛會(huì) CNUTCon 全球運(yùn)維技術(shù)大會(huì)在上海·光大會(huì)展中心成功舉辦。時(shí)速云聯(lián)合創(chuàng)始人兼 CTO 王磊受邀參加此次大會(huì),并發(fā)表主題演講。王磊此次演講的題目...
閱讀 3456·2021-09-08 09:36
閱讀 2534·2019-08-30 15:54
閱讀 2345·2019-08-30 15:54
閱讀 1761·2019-08-30 15:44
閱讀 2378·2019-08-26 14:04
閱讀 2437·2019-08-26 14:01
閱讀 2869·2019-08-26 13:58
閱讀 1315·2019-08-26 13:47