cdk8s是一個由aws開源的軟件開發框架,用於使用熟悉的編程語言和豐富的面向對象的API定義Kubernetes應用程序和可重用的抽象。 cdk8s生成純Kubernetes YAML--您可使用cdk8s爲在任何地方運行的任何Kubernetes集羣定義應用程序。javascript
cdk8s應用程序是使用一種受支持的編程語言編寫的程序。它們被構造爲構造樹。java
樹的根是一個App
構造。在應用程序中,用戶能夠定義任意數量的圖表(擴展了Chart
類的類)。每一個圖表都被合成到一個單獨的Kubernetes清單文件中。圖表依次由任意數量的構造組成,最終由資源組成,這些資源表明任何Kubernetes資源,例如Pod
,Service
,Deployment
,ReplicaSet
等。node
構造是cdk8的基本構建塊。它們是經過普通的面向對象的類來構成和建立更高級別的抽象的工具。git
若是您來自Kubernetes世界,則能夠將構造視爲以編程方式定義的Helm Charts。關於「以編程方式定義」構造的好處是,咱們可使用它們來利用面向對象編程的所有功能。例如:github
cdk8s應用程序僅定義Kubernetes應用程序,實際上並未將其應用於集羣。執行某個應用程序時,它會將應用程序中定義的全部圖表綜合到dist目錄中,而後可使用kubectl apply -f dist/chart.k8s.yaml
或GitOps工具(如Flux)將這些圖表應用於任何Kubernetes集羣。typescript
讓咱們來看一個簡單的"Hello,World!" TypeScript中的示例。npm
先決條件編程
我的比較喜歡vscode,vscode 對cdk8s支持很是好。api
安裝CLIapp
cdk8s有一個CLI,其中包含一些有用的命令。讓咱們從全局安裝cdk8s CLI開始:
$ npm install -g cdk8s-cli
安裝成功有相似輸出:
usr/local/bin/cdk8s -> /usr/local/lib/node_modules/cdk8s-cli/bin/cdk8s + cdk8s-cli@0.23.0
建立工程
如今,咱們將使用cdk8s init
命令建立一個新的TypeScript cdk8s應用程序:
$ mkdir hello $ cd hello $ cdk8s init typescript-app creating a new project from template: typescript-app ...
這將執行如下操做:
最終咱們能夠看到以下輸出:
======================================================================================================== Your cdk8s typescript project is ready! cat help Print this message Compile: npm run compile Compile typescript code to javascript (or "yarn watch") npm run watch Watch for changes and compile typescript in the background npm run build Compile + synth Synthesize: npm run synth Synthesize k8s manifests from charts to dist/ (ready for 'kubectl apply -f') Deploy: kubectl apply -f dist/*.k8s.yaml Upgrades: npm run import Import/update k8s apis (you should check-in this directory) npm run upgrade Upgrade cdk8s modules to latest version npm run upgrade:next Upgrade cdk8s modules to latest "@next" version (last commit) ========================================================================================================
watch
因爲TypeScript是一種編譯語言,所以咱們須要將.ts文件編譯爲.js才能執行CDK應用程序。您能夠像這樣在後臺連續進行操做:
$ npm run watch
應用和圖表
打開 main.ts
文件,能夠看到以下內容:
應用程序以結構樹的形式構成,結構是抽象的可組合單元。咱們將很快了解有關構造的更多信息。
cdk8s init
建立的初始代碼定義了一個具備單個空圖表的應用程序。
當您運行npm run synth
時,將爲您應用中的每一個Chart合成一個Kubernetes清單YAML,並將其寫入dist
目錄。
引入Kubernetes API 的構造
好的,如今讓咱們在圖表中定義一些Kubernetes API對象。
與圖表和應用程序相似,Kubernetes API對象在cdk8s中也表示爲構造。使用命令cdk8s import
將這些結構「導入」到您的項目中,而後能夠在項目目錄中的imports/k8s.ts
文件下找到它們。
cdk8s初始化建立項目時,它已經爲您執行了cdk8s import
,所以您應該已經在其中看到了imports目錄。您能夠將該目錄提交到源代碼管理中,也能夠在構建過程當中生成它。
如今,讓咱們使用這些構造來定義一個簡單的Kubernetes應用程序,其中包含受hello-kubernetes項目啓發的Service
和Deployment
資源。
import { Construct } from 'constructs'; import { App, Chart } from 'cdk8s'; // imported constructs import { Deployment, Service, IntOrString } from './imports/k8s'; class MyChart extends Chart { constructor(scope: Construct, name: string) { super(scope, name); const label = { app: 'hello-k8s' }; new Service(this, 'service', { spec: { type: 'LoadBalancer', ports: [ { port: 80, targetPort: IntOrString.fromNumber(8080) } ], selector: label } }); new Deployment(this, 'deployment', { spec: { replicas: 2, selector: { matchLabels: label }, template: { metadata: { labels: label }, spec: { containers: [ { name: 'hello-kubernetes', image: 'paulbouwer/hello-kubernetes:1.7', ports: [ { containerPort: 8080 } ] } ] } } } }); } } const app = new App(); new MyChart(app, 'hello'); app.synth();
如今,在執行npm run synth
以後,下面是hello.k8s.yaml
的內容:
apiVersion: v1 kind: Service metadata: name: hello-service-9878228b spec: ports: - port: 80 targetPort: 8080 selector: app: hello-k8s type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment-c51e9e6b spec: replicas: 2 selector: matchLabels: app: hello-k8s template: metadata: labels: app: hello-k8s spec: containers: - image: paulbouwer/hello-kubernetes:1.7 name: hello-kubernetes ports: - containerPort: 8080
應用程序合成的清單可使用諸如kubectl apply之類的標準工具應用於任何Kubernetes集羣:
$ kubectl apply -f dist/hello.k8s.yaml
隨着Kubernetes的使用量增長,而且管理應用程序和集羣的繁瑣工做從運維團隊轉移到開發團隊,管理擴展的工做不是很直觀。OAM和cdk8s 經過不一樣的思考維度,來簡化k8s應用的管理。
使用cdk8s,避免了yaml的諸多不足。可使用強類型數據類型來表達抽象的API,加入豐富的測試和代碼版本管理。並且很是容易和整個CICD流程結合起來。