Aggregated APIServer 構建雲原生應用最佳實踐
作者
張鵬,騰訊雲容器產品工程師,擁有多年雲原生專案開發落地經驗。目前主要負責騰訊雲 TKE 雲原生 AI 產品的開發工作。
謝遠東,騰訊高階工程師,Kubeflow Member、Fluid(CNCF Sandbox) 核心開發者,負責騰訊雲 TKE 在 AI 場景的研發和支援工作。
概述
為什麼選擇 Aggregated APIServer?
選擇獨立 API 還是 Aggregated APIServer ?
-
能利用 Kubernetes 原生的認證、授權、准入等機制,有更高的開發效率; -
能更好的和 K8s 系統融合,藉助 K8s 生態更快的推廣自己的產品,方便使用者上手; -
藉助於 K8s 成熟的 API 工具及規範,構建出的 API 介面更加規範整齊;
考慮 API 聚合的情況 | 優選獨立 API 的情況 |
---|---|
你在開發新的 API | 你已經有一個提供 API 服務的程式並且工作良好 |
你希望可以是使用
kubectl 來讀寫你的新資源類別 |
不要求
kubectl 支援 |
你希望在 Kubernetes UI (如儀表板)中和其他內建類別一起檢視你的新資源類別 | 不需要 Kubernetes UI 支援 |
你希望複用 Kubernetes API 支援特性 [1] | 你不需要這類特性 |
你有意願取接受 Kubernetes 對 REST 資源路徑所作的格式限制,例如 API 組和名字空間。(參閱 API 概述 [2]) | 你需要使用一些特殊的 REST 路徑以便與已經定義的 REST API 保持相容 |
你的 API 是 宣告式的 [3] | 你的 API 不符合 宣告式 [4]模型 |
你的資源可以自然地界定為叢集作用域或叢集中某個名字空間作用域 | 叢集作用域或名字空間作用域這種二分法很不合適;你需要對資源路徑的細節進行控制 |
選擇 CRDs 還是 Aggregated APIServer?
-
定製資源的欄位不多; -
你在組織內部使用該資源或者在一個小規模的開源專案中使用該資源,而不是在商業產品中使用;聚合 API 可提供更多的高階 API 特性,也可對其他特性進行定製;例如,對儲存層進行定製、對 protobuf 協議支援、對 logs、patch 等操作支援。
APIServer 擴充套件的基本原理
-
AggregatorServer:負責處理 apiregistration.k8s.io
組下的 APIService 資源請求,同時將來自使用者的請求攔截轉發給 Aggregated APIServer(AA); -
KubeAPIServer:負責對請求的一些通用處理,包括:認證、鑑權以及各個內建資源(pod, deployment,service)的 REST 服務等; -
ApiExtensionsServer:負責 CustomResourceDefinition(CRD)apiResources 以及 apiVersions 的註冊,同時處理 CRD 以及相應 CustomResource(CR)的REST請求(如果對應 CR 不能被處理的話則會返回404),也是 apiserver Delegation 的最後一環;
如何快速構建 Aggregated APIServer?
安裝 apiserver-builder 工具
$ GO111MODULE=on go get sigs.k8s.io/apiserver-builder-alpha/cmd/apiserver-boot
-
下載 [8]最新版本 -
解壓到 /usr/local/apiserver-builder/ -
如果此目錄不存在,則建立此目錄 -
新增/usr/local/apiserver-builder/bin到您的路徑 export PATH=$PATH:/usr/local/apiserver-builder/bin
-
執行 apiserver-boot -h
初始化專案
$ mkdir skai-demo
$
cd skai-demo
$ apiserver-boot init repo --domain skai.io
.
├── BUILD.bazel
├── Dockerfile
├── Makefile
├── PROJECT
├── WORKSPACE
├── bin
├── cmd
│ ├── apiserver
│ │ └── main.go
│ └── manager
│ └── main.go -> ../../main.go
├── go.mod
├── hack
│ └── boilerplate.go.txt
├── main.go
└── pkg
└── apis
└── doc.go
-
hack 目錄存放自動指令碼
-
cmd/apiserver 是 aggregated server的啟動入口
-
cmd/manager 是 controller 的啟動入口
-
pkg/apis 存放 CR 相關的結構體定義,會在下一步自動生成
生成自定義資源
$ apiserver-boot create group version resource --group animal --version v1alpha1 --kind Cat --non-namespaced=false
Create Resource [y/n]
y
Create Controller [y/n]
n
└── pkg
└── apis
├── animal
│ ├── doc.go
│ └── v1alpha1
│ ├── cat_types.go
│ ├── doc.go
│ └── register.go
└── doc.go
cat_types.go
檔案,此檔案包含了我們資源的基礎定義,我們在 spec 中增加欄位定義,並在已經實現的
Validate
方法中完成基礎欄位的校驗。
// Cat
// +k8s:openapi-gen=
true
type Cat struct {
metav1.TypeMeta `json:
",inline"`
metav1.ObjectMeta `json:
"metadata,omitempty"`
Spec CatSpec `json:
"spec,omitempty"`
Status CatStatus `json:
"status,omitempty"`
}
// CatSpec defines the desired state of Cat
type CatSpec struct {
Name string `json:
"name"`
}
func (
in *Cat) Validate(ctx context.Context) field.ErrorList {
allErrs := field.ErrorList{}
if len(in.Spec.Name) == 0 {
allErrs = append(allErrs, field.Invalid(field.NewPath(
"spec",
"name"), in.Spec.Name,
"must be specify"))
}
return allErrs
}
部署執行
建立 EKS叢集 [9]&配置好本地 kubeconfig [10];
執行部署命令 ;
$ apiserver-boot run
in-cluster --image=xxx/skai.io/skai-demo:0.0.1 --name=skai-demo --namespace=default
-
自動生成 APIServer Dockerfile 檔案; -
透過 APIServer Dockerfile 構建服務映象,並將映象推送到指定倉庫; -
在config目錄下生成 CA 及其他 APIServer 部署需要的證書檔案; -
在config目錄下生成 APIServer 部署需要的 Deployment、Service、APIService、ServiceAccount 等 yaml 檔案; -
將上一步生成的 yaml 檔案部署到叢集中;
功能驗證
確認 Resource 註冊成功
$ kubectl api-versions |grep animal
animal.skai.io/v1alpha1
確認 Aggregated APIServer 能正常工作
$ kubectl get apiservice v1alpha1.animal.skai.io
NAME SERVICE AVAILABLE AGE
v1alpha1.animal.skai.io default/skai-demo True 19h
建立並檢視新增的 Resource
建立
$ cat lucky.yaml
apiVersion: animal.skai.io/v1alpha1
kind: Cat
metadata:
name: mycat
namespace: default
spec:
name: lucky
# 建立自定義 resource
$ kubectl apply -f lucky.yaml
查詢
# 查詢自定義 resource 列表
$ kubectl get cat
NAME CREATED AT
mycat 2021-11-17T09:08:10Z
# 查詢自定義資源詳情
$ kubectl get cat mycat -oyaml
apiVersion: animal.skai.io/v1alpha1
kind: Cat
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{
"apiVersion":
"animal.skai.io/v1alpha1",
"kind":
"Cat",
"metadata":{
"annotations":{},
"name":
"mycat"},
"spec":{
"name":
"lucky"}}
creationTimestamp:
"2021-11-17T09:08:10Z"
name: mycat
resourceVersion:
"17"
uid: 98af0905-f01d-4042-bad3-71b96c0919f4
spec:
name: lucky
status: {}
總結
參考資料
Kubernetes API 支援特性: 【 https://kubernetes.io/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/#common-features 】
[2]API 概述: 【 】
[3]宣告式API: 【https://kubernetes.io/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/#declarative-apis 】
[4]宣告式: 【 https://kubernetes.io/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/#declarative-apis 】
[5]官方文件: 【 https://kubernetes.io/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/#compare-ease-of-use 】
[6]sample-apiserver: 【 】
[7]apiserver-builder: 【 】
[8]下載: 【 /releases 】
[9]EKS叢集: 【 https://cloud.tencent.com/document/product/457/39813 】
[10]kubeconfig: 【 https://cloud.tencent.com/document/product/457/39814 】
往期精選推薦
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69984638/viewspace-2843709/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深圳見!雲原生加速應用構建專場:來看雲原生 FinOps、SRE、高效能運算場景最佳實踐
- 使用React構建大型應用的最佳實踐React
- 雲原生架構日誌監控最佳實踐架構
- 構建高效的 Python Web 應用:最佳實踐指南PythonWeb
- 使用Java和Dapr構建雲原生應用簡介Java
- 使用Docker Compose構建生產應用的最佳實踐 — NickDocker
- 用mobx構建大型專案的最佳實踐
- 申通快遞 雙11 雲原生應用實踐
- 混合雲應用雙活容災最佳實踐
- .NET雲原生應用實踐(一):從搭建專案框架結構開始框架
- 用mobx構建大型專案的最佳實踐(2)
- 雲原生與邊緣計算的碰撞——邊緣原生應用實踐
- Google 官方應用架構的最佳實踐指南Go應用架構
- Vue 2.0 構建單頁應用最佳實戰Vue
- 直播預告 | 雲原生在CloudQuery的應用與實踐Cloud
- 快速雲原生化,從資料中心到雲原生的遷移最佳實踐
- Docker多階段構建最佳實踐Docker
- 彈性配置為構建提速 - CODING & 騰訊雲 CVM 最佳實踐
- 京東雲的雲原生理念及 Serverless 最佳實踐Server
- 阿里雲EDAS 3.0重磅釋出,無侵入構建雲原生應用阿里
- .NET雲原生應用實踐(二):Sticker微服務RESTful API的實現微服務RESTAPI
- .NET雲原生應用實踐(五):使用Blazor WebAssembly實現前端頁面BlazorWeb前端
- 銀行基於雲原生架構的 DevOps 建設實踐經驗架構dev
- 使用nodejs構建Docker image最佳實踐NodeJSDocker
- 阿里雲丁宇:雲原生啟用應用構建新正規化,Serverless奇點已來阿里Server
- 阿里巴巴的雲原生應用開源探索與實踐阿里
- .NET雲原生應用實踐(三):連線到PostgreSQL資料庫SQL資料庫
- OPLG:新一代雲原生可觀測最佳實踐
- JavaScript Web 應用最佳實踐分析JavaScriptWeb
- 自定義元素探祕及構建可複用元件最佳實踐元件
- 雲原生灰度更新實踐
- 基於聲網 Flat 構建白板外掛應用“成語解謎”的最佳實踐
- 容器雲環境,你們如何監控應用執行情況? ---JFrog 雲原生應用監控實踐
- 大模型重塑軟體開發,華為雲AI原生應用架構設計與實踐分享大模型AI應用架構
- 擁抱雲原生,作業幫多雲架構實踐之路架構
- 阿里雲丁宇:以領先的雲原生技術,啟用應用構建新正規化阿里
- 畫像標籤體系構建與應用實踐
- 雲原生應用萬節點分鐘級分發協同實踐