小試 cdk8s

cdk8s是一個由aws開源的軟件開發框架,用於使用熟悉的編程語言和豐富的面向對象的API定義Kubernetes應用程序和可重用的抽象。 cdk8s生成純Kubernetes YAML--您可使用cdk8s爲在任何地方運行的任何Kubernetes集羣定義應用程序。javascript

特性

  • 與Kubernetes一塊兒使用:您可使用cdk8s爲在任何地方運行的任何Kubernetes集羣(包括任何雲或本地)定義應用程序。 cdk8s在您的開發環境中本地運行,並生成可應用於任何集羣的標準Kubernetes YAML。
  • 多語言支持:目前將支持TypeScript,JavaScript,Python,Java和.NET,未來還會有更多支持。它能夠與Kubernetes的任何上游版本一塊兒使用。
  • 支持核心Kubernetes對象和自定義資源:您能夠從任何Kubernetes API版本和自定義資源定義導入對象以與cdk8s一塊兒使用。這使得使用cdk8s輕鬆編寫整個Kubernetes應用程序變得容易,並在應用程序更改時使它們保持最新。
  • 與GitOps工做流程完美配合,使您在修改配置時以及在API版本之間輕鬆查看更改。只需使用cdk8來合成新的YAML配置文件並將它們提交到git repo。
  • 社區驅動。

設計原理

cdk8s應用程序是使用一種受支持的編程語言編寫的程序。它們被構造爲構造樹。java

樹的根是一個App構造。在應用程序中,用戶能夠定義任意數量的圖表(擴展了Chart類的類)。每一個圖表都被合成到一個單獨的Kubernetes清單文件中。圖表依次由任意數量的構造組成,最終由資源組成,這些資源表明任何Kubernetes資源,例如PodServiceDeploymentReplicaSet等。node

構造是cdk8的基本構建塊。它們是經過普通的面向對象的類來構成和建立更高級別的抽象的工具。git

若是您來自Kubernetes世界,則能夠將構造視爲以編程方式定義的Helm Charts。關於「以編程方式定義」構造的好處是,咱們可使用它們來利用面向對象編程的所有功能。例如:github

  • 您可使用強類型數據類型來表達抽象的API
  • 您能夠表達與方法和屬性的豐富交互
  • 您能夠經過接口和基類建立多態編程模型
  • 經過常規軟件包管理器共享它們
  • 使用咱們熟悉的測試工具和技術對其進行測試
  • 版本管理

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
...

這將執行如下操做:

  • 建立一個新的項目目錄
  • 安裝cdk8s做爲依賴項
  • 導入全部Kubernetes API對象
  • 將TypeScript編譯爲JavaScript

最終咱們能夠看到以下輸出:

========================================================================================================

 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項目啓發的ServiceDeployment資源。

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流程結合起來。

相關文章
相關標籤/搜索