主頁 >  其他 > Aggregated APIServer 構建云原生應用最佳實踐

Aggregated APIServer 構建云原生應用最佳實踐

2021-12-06 21:04:30 其他

作者

張鵬,騰訊云容器產品工程師,擁有多年云原生專案開發落地經驗,目前主要負責騰訊云 TKE 云原生 AI 產品的開發作業,

謝遠東,騰訊高級工程師,Kubeflow Member、Fluid(CNCF Sandbox) 核心開發者,負責騰訊云 TKE 在 AI 場景的研發和支持作業,

概述

隨著 Kubernetes 的日趨成熟,越來越多的公司、企業開始使用 K8s 來構建自己的云原生平臺,基于 kubernetes 良好的擴展性以及成熟穩定的架構,你可以快速部署并管理自己的云原生應用,

目前我們也在基于 kubernetes 打造一個云原生 AI 平臺(我們稱它為:SKAI),該平臺具備極致彈性多云兼容性高易用可觀測性可復現性的特點,旨在利用云原生的思想和技術,為 AI 場景的資料處理、模型訓練、模型上線推理等需求構建彈性可擴展的系統架構,從而提升資源利用率,

為了使我們的平臺更加的云原生,我們沒有選擇常用的 web 框架來構建 API 服務,而是使用 kubernetes 擴展來構建整個平臺,這樣使我們的平臺能更好的和 kubernetes 融合,可以無縫適配任何基于 k8s 的多云混合云環境,

為什么選擇 Aggregated APIServer?

選擇獨立 API 還是 Aggregated APIServer ?

盡管使用 gin、go-restful 等 go 語言 web 框架可以輕易地構建出一個穩定的 API 介面服務,但以 kubernetes 原生的方式構建 API 介面服務還是有很多優勢,例如:

  • 能利用 kubernetes 原生的認證、授權、準入等機制,有更高的開發效率;
  • 能更好的和 K8s 系統融合,借助 K8s 生態更快的推廣自己的產品,方便用戶上手;
  • 借助于 K8s 成熟的 API 工具及規范,構建出的 API 介面更加規范整齊;

但是在很多場景下,我們還是不能確定到底使用聚合 API(Aggregated APIServer)還是獨立 API 來構建我們的服務,官方為我們提供了兩種選擇的對比;如果你不能確定使用聚合 API 還是獨立 API,下面的表格或許對你有幫助:

考慮 API 聚合的情況 優選獨立 API 的情況
你在開發新的 API 你已經有一個提供 API 服務的程式并且作業良好
你希望可以是使用 kubectl 來讀寫你的新資源類別 不要求 kubectl 支持
你希望在 Kubernetes UI (如儀表板)中和其他內置類別一起查看你的新資源類別 不需要 Kubernetes UI 支持
你希望復用 Kubernetes API 支持特性 你不需要這類特性
你有意愿取接受 Kubernetes 對 REST 資源路徑所作的格式限制,例如 API 組和名字空間,(參閱 API 概述) 你需要使用一些特殊的 REST 路徑以便與已經定義的 REST API 保持兼容
你的 API 是宣告式的 你的 API 不符合宣告式模型
你的資源可以自然地界定為集群作用域或集群中某個名字空間作用域 集群作用域或名字空間作用域這種二分法很不合適;你需要對資源路徑的細節進行控制

首先我們希望我們的 SKAI 平臺能更好的和 k8s 結合,并且它是一個宣告式的 API,盡可能的復用 Kubernets API 的特性,顯然聚合 API 對我們來說更加適合,

選擇 CRDs 還是 Aggregated APIServer?

除了聚合 API,官方還提供了另一種方式以實作對標準 kubernetes API 介面的擴展:CRD(Custom Resource Definition ),能達到與聚合 API 基本一樣的功能,而且更加易用,開發成本更小,但相較而言聚合 API 則更為靈活,針對這兩種擴展方式如何選擇,官方也提供了相應的參考,

通常,如果存在以下情況,CRD 可能更合適:

  • 定制資源的欄位不多;
  • 你在組織內部使用該資源或者在一個小規模的開源專案中使用該資源,而不是在商業產品中使用;
    聚合 API 可提供更多的高級 API 特性,也可對其他特性進行定制;例如,對存盤層進行定制、對 protobuf 協議支持、對 logs、patch 等操作支持,

兩種方式的核心區別是定義 api-resource 的方式不同,在 Aggregated APIServer 方式中,api-resource 是通過代碼向 API 注冊資源型別,而 Custom Resource 是直接通過 yaml 檔案向 API 注冊資源型別,

簡單來說就是 CRD 是讓 kube-apiserver 認識更多的物件類別(Kind),Aggregated APIServer 是構建自己的 APIServer 服務,雖然 CRD 更簡單,但是缺少更多的靈活性,更詳細的 CRDs 與 Aggregated API 的對比可參考官方檔案,

對于我們而言,我們希望使用更多的高級 API 特性,例如 "logs" 或 "exec",而不僅僅局限于 CRUD ,所以我們最終選擇了 Aggregated APIServer ,

APIServer 擴展的基本原理

kube-apiserver 作為整個 Kubernetes 集群操作 etcd 的唯一入口,負責 Kubernetes 各資源的認證&鑒權,校驗以及 CRUD 等操作,提供 RESTful APIs,供其它組件呼叫:

kube-apiserver 其實包含三種 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 的最后一環;

三個 APIServer 通過 delegation 的關系關聯,在 kube-apiserver 初始化創建的程序中,首先創建的是 APIExtensionsServer,它的 delegationTarget 是一個空的 Delegate,即什么都不做,繼而將 APIExtensionsServer 的 GenericAPIServer,作為 delegationTarget 傳給了 KubeAPIServer,創建出了 KubeAPIServer,再然后,將 kubeAPIServer 的 GenericAPIServer 作為 delegationTarget 傳給了 AggregatorServer,創建出了 AggregatorServer,所以他們之間 delegation 的關系為: Aggregator -> KubeAPIServer -> APIExtensions,如下圖所示:

如何快速構建 Aggregated APIServer?

雖然官方提供了一個 sample-apiserver,我們可以參考實作自己的 Aggregated APIServer,但完全手工撰寫太過復雜,也不便于后期維護,我們最終選擇了官方推薦的工具 apiserver-builder,apiserver-builder 可以幫助我們快速創建專案骨架,并且使用 apiserver-builder 構建的專案目錄結構比較清晰,更利于后期維護,

安裝 apiserver-builder 工具

通過 Go Get 安裝

$ GO111MODULE=on go get sigs.k8s.io/apiserver-builder-alpha/cmd/apiserver-boot

通過安裝包安裝

  • 下載最新版本
  • 解壓到 /usr/local/apiserver-builder/
  • 如果此目錄不存在,則創建此目錄
  • 添加/usr/local/apiserver-builder/bin到您的路徑 export PATH=$PATH:/usr/local/apiserver-builder/bin
  • 運行apiserver-boot -h

初始化專案

完成 apiserver-boot 安裝后,可通過如下命令來初始化一個 Aggregated APIServer 專案:

$ 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

可根據自己的需求選擇是否生成 Controller,我們這里暫時選擇不生成, 對于需要通過 namespace 隔離的 resource 需要增加 --non-namespaced=false 的引數,默認都是 true,

執行完成后代碼結構如下:

└── pkg
    └── apis
        ├── animal
        │   ├── doc.go
        │   └── v1alpha1
        │       ├── cat_types.go
        │       ├── doc.go
        │       └── register.go
        └── doc.go

可以看到在 pkg/apis 下生成了 animal 的 group 并在 v1alpha1 版本下新增了 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
}

部署運行

完成以上步驟,你其實已經擁有一個完整的 Aggregated APIServer,接下來我們試著將它運行起來;apiserver-boot 本身提供了兩種運行模式:in-cluster、local; local 模式下只作為單獨的 API 服務部署在本地方便做除錯,過于簡單這里不做過多介紹,主要關注一下 in-cluster 模式;in-cluster 可以將你的 Aggregated APIServer 部署在任何 K8s 集群中,例如:minikube,騰訊 TKE,EKS 等,我們這里使用 EKS 集群作為演示,

創建EKS集群&配置好本地kubeconfig;

執行部署命令 ;

$ apiserver-boot run in-cluster --image=xxx/skai.io/skai-demo:0.0.1 --name=skai-demo --namespace=default

在執行部署命令程序中,apiserver-boot 主要幫我們做了如下幾件事情:

  • 自動生成 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: {}

總結

本文從實戰角度出發介紹我們開發 SKAI 平臺程序中選擇 Aggregated API 的原因,以及 kube-apisever 的擴展原理,最后介紹了 apiserver-builder 工具,并演示如何一步一步構建起自己的 Aggregated API,并將它部署到 EKS 集群中,希望該篇 Aggregated APIServer 最佳實踐可以幫助即將使用 K8s API 擴展來構建云原生應用的開發者,

關于我們

更多關于云原生的案例和知識,可關注同名【騰訊云原生】公眾號~

福利:

①公眾號后臺回復【手冊】,可獲得《騰訊云原生路線圖手冊》&《騰訊云原生最佳實踐》~

②公眾號后臺回復【系列】,可獲得《15個系列100+篇超實用云原生原創干貨合集》,包含Kubernetes 降本增效、K8s 性能優化實踐、最佳實踐等系列,

【騰訊云原生】云說新品、云研新術、云游新活、云賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373800.html

標籤:其他

上一篇:pygame小游戲開發 - 俄羅斯方塊

下一篇:NTP網路時鐘服務器(NTP時間服務器)結構設計開發書

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more