国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

k8s之CRD--為自定義資源生成代碼

jkyin / 2864人閱讀

摘要:看過的應該都知道項目中有大量代碼工具生成的代碼。執行即腳本將自動生成下面的文件和路徑腳本運行后大體會建立如下的包管理結構是不是很簡單代碼是被完全生成的,就像包含我們的語言類型的文件下面的文件一樣然后你就可以基于生成的代碼寫自己的了。

CRD簡介和使用姿勢

CustomResourceDefinition(CRD)是 v1.7 + 新增的無需改變代碼就可以擴展 Kubernetes API 的機制,用來管理自定義對象。它實際上是 ThirdPartyResources(TPR) 的升級版本,而 TPR 已經在 v1.8 中刪除。

一些使用場景:

提供/管理外部數據存儲/數據庫(例如 CloudSQL/RDS 實例)

對k8s基礎資源進行更高層次的抽象(比如定義一個etcd集群)

其實crd在很多k8s周邊開源項目中有使用,比如ingress-controller和眾多的operator。

CRD 控制器

在使用 CRD 擴展 Kubernetes API 時,通常還需要實現一個新建資源的控制器,監聽改資源的變化情況,并作進一步的處理。官方提供的示例項目sample-controller。
這個例子主要講述了以下幾個方面:

如何使用自定義資源定義注冊Foo類型的新自定義資源(自定義資源類型)

如何創建/獲取/列出新資源類型Foo實例

如何在資源處理創建/更新/刪除事件上設置控制器

編寫crd controller之前,一定要使用k8s官方提供的代碼生成工具k8s.io/code-generator 去生成 client, informers, listers and deep-copy函數.不僅代碼風格符合k8s,而且減少出錯和減少工作量都是有很大的幫助。

在項目中使用代碼生成器

下面展示了代碼生成工具是如何工作的以及如何使用最少的代碼行將它們應用到自己的項目中,從而為您生成 deepcopy 函數/typed clients/listers/informer,所有這些的生成僅需要一個 shell 腳本調用和部分代碼注釋。
不要覺得代碼生成有多么復雜,其實官方已經做了很多工作了,提供了 generator-group.sh。看過client-go的gopher應該都知道項目中有大量代碼工具生成的代碼。
執行./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腳本將自動生成下面的文件和路徑

pkg/apis/canarycontroller/v1alpha1/zz_generated.deepcopy.go

pkg/client/

腳本運行后大體會建立如下的包管理結構:

是不是很簡單?pkg/client 代碼是被完全生成的,就像包含我們的 CustomResource golang語言類型的 types.go 文件下面的 zz_generated.deepcopy.go 文件一樣,然后你就可以基于生成的代碼寫自己的controller了。
不過并不是不需要自己寫一點代碼,畢竟機器沒有智能到你定義了什么樣子的crd。所有以下幾個文件需要自己來定義和實現,均是和你自己的業務邏輯相關。
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
}
更多相關細節

見 Kubernetes Deep Dive: Code Generation for CustomResources給出了具體的步驟和關于tag的標注。

總結

基于crd以及crd controller可以抽象很多業務場景。接下我司準備實現一個部署策略相關的項目。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33046.html

相關文章

  • k8sCRD--為自定義資源生成代碼

    摘要:看過的應該都知道項目中有大量代碼工具生成的代碼。執行即腳本將自動生成下面的文件和路徑腳本運行后大體會建立如下的包管理結構是不是很簡單代碼是被完全生成的,就像包含我們的語言類型的文件下面的文件一樣然后你就可以基于生成的代碼寫自己的了。 CRD簡介和使用姿勢 CustomResourceDefinition(CRD)是 v1.7 + 新增的無需改變代碼就可以擴展 Kubernetes AP...

    simon_chen 評論0 收藏0
  • kubernetes自定義資源對象高級功能

    摘要:可以通過驗證自定義對象是否符合標準。此功能可用于及以上版本自定義資源。狀態和規范節分別由自定義資源內的和表示。對子資源的請求采用自定義資源對象,并忽略除狀態節之外的任何更改。該對象作為有效負載發送。 kubernetes自定義資源對象高級功能 本文首發于微信公眾號我的小碗湯,掃碼文末二維碼即可關注,歡迎一起交流! kubernetes自定義資源對象再極大程度提高了API Server的...

    Mr_zhang 評論0 收藏0
  • kubernetes自定義資源對象高級功能

    摘要:可以通過驗證自定義對象是否符合標準。此功能可用于及以上版本自定義資源。狀態和規范節分別由自定義資源內的和表示。對子資源的請求采用自定義資源對象,并忽略除狀態節之外的任何更改。該對象作為有效負載發送。 kubernetes自定義資源對象高級功能 本文首發于微信公眾號我的小碗湯,掃碼文末二維碼即可關注,歡迎一起交流! kubernetes自定義資源對象再極大程度提高了API Server的...

    陳江龍 評論0 收藏0
  • 容器監控實踐—Prometheus部署方案

    摘要:同時有權限控制日志審計整體配置過期時間等功能。將成為趨勢前置條件要求的版本應該是因為和支持的限制的核心思想是將的部署與它監控的對象的配置分離,做到部署與監控對象的配置分離之后,就可以輕松實現動態配置。 一.單獨部署 二進制安裝各版本下載地址:https://prometheus.io/download/ Docker運行 運行命令:docker run --name promet...

    GeekQiaQia 評論0 收藏0
  • 容器 PaaS 新技術架構下的運維實踐

    摘要:王磊此次演講的題目為容器新技術架構下的運維實踐,詳細為大家講解了在基于構建容器的過程中,如何以應用為中心,通過新的技術工具對服務節點集群平臺等多個方面進行管理運維,提高系統的自動化運維能力。 2018年11月16-17日,運維&容器技術盛會 CNUTCon 全球運維技術大會在上海·光大會展中心成功舉辦。時速云聯合創始人兼 CTO 王磊受邀參加此次大會,并發表主題演講。王磊此次演講的題目...

    BaronZhang 評論0 收藏0

發表評論

0條評論

jkyin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<