Amazon CDK cho K8s - những bước cơ bản.

 

Như chúng ta đã biết thì CDK là một framework của Amazon để viết code cho việc thiết lập hạ tầng mạng cho những ứng dụng chạy trên Amazon Web Service. 

cdk8s

Không giống như các công cụ automation hạ tầng khác, muốn sử dụng framework này bạn phải biết ít nhất 1 ngôn ngữ lập trình như : TypeScript, .NET, Java hay Python. 

Trong bài viết này mình đề cập đến dùng CDK framework để viết một hạ tầng kubernetes trên AWS dùng ngôn ngữ python. 


Trước khi đi vào thiết lập một ví dụ dùng ngôn ngữ python thì bạn cần cài Python và PIP kèm theo. 

I. Các tool cần có:

    Python >= 3.7.7

    pipenv version 2018.11.26 hoặc cao hơn. 

II. Cài đặt: 

    Cài đặt cdk8s thì bạn có 2 cách cài: 

$ brew install cdk8s

hoặc: 

$ npm install -g cdk8s-cli

III. Tạo project:

    Ok, giờ bạn tạo project cdk bạn chạy các command sau: 

$ mkdir hello
$ cd hello
$ cdk8s init python-app
creating a new project from template: python-app
...

Quá trình làm mình sẽ thực hiện các bước sau:

Tạo một thư mục hello 

Cài đặt các thư viện cdk8s 

Nhập tất cả đối tượng API Kubernetes 

IV. Apps & Charts:

Tại lúc này một file `main.py` được tạo ra có nội dung sau : 

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart

class MyChart(Chart):
  def __init__(self, scope: Construct, ns: str, **kwargs):
    super().__init__(scope, ns, **kwargs)

    # define resources here


app = App()
MyChart(app, "hello")

app.synth()

File trên được tạo ra khi ta chạy : cdk8s init

Khi bạn chạy : cdk8s synth một file : manifest YAML sẽ được tạo ra cho một Chart 

$ cdk8s synth
dist/hello.k8s.yaml

$ cat dist/hello.k8s.yaml
<EMPTY>

V. Import Constructs cho Kubernetes API:

OK, bây giờ ta định nghĩa file main.py như sau : 

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart

from imports import k8s


class MyChart(Chart):
    def __init__(self, scope: Construct, name: str):
        super().__init__(scope, name)

        # define resources here
        label = {"app": "hello-k8s"}

        k8s.Service(self, 'service',
                    spec=k8s.ServiceSpec(
                      type='LoadBalancer',
                      ports=[k8s.ServicePort(port=80, target_port=k8s.IntOrString.from_number(8080))],
                      selector=label))

        k8s.Deployment(self, 'deployment',
                       spec=k8s.DeploymentSpec(
                         replicas=2,
                         selector=k8s.LabelSelector(match_labels=label),
                         template=k8s.PodTemplateSpec(
                           metadata=k8s.ObjectMeta(labels=label),
                           spec=k8s.PodSpec(containers=[
                             k8s.Container(
                               name='hello-kubernetes',
                               image='paulbouwer/hello-kubernetes:1.7',
                               ports=[k8s.ContainerPort(container_port=8080)])]))))


app = App()
MyChart(app, "hello")

app.synth()

Như chúng ta thấy ở trên thì ứng dụng kubernetes có 2 resources là : service và deployment, đây là 2 thành phần chính của một ứng dụng cơ bản của kubernetes. 

Bây giờ ta chạy lệnh: cdk8s synth,  một file hello.k8s.yaml được tạo và có nội dung sau: 

spec:
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: hello-k8s
  type: LoadBalancer
kind: Service
apiVersion: v1
metadata:
  name: hello-service-9878228b
---
spec:
  selector:
    matchLabels:
      app: hello-k8s
  template:
    metadata:
      labels:
        app: hello-k8s
    spec:
      containers:
        - name: hello-kubernetes
          image: paulbouwer/hello-kubernetes:1.7
          ports:
            - containerPort: 8080
  replicas: 2
kind: Deployment
apiVersion: apps/v1
metadata:
  name: hello-deployment-c51e9e6b

Đó là file manifest của kubernetes, giờ ta apply để tạo một ứng dụng hello chạy lệnh sau: 

$ kubectl apply -f dist/hello.k8s.yaml

Đến đây bạn có thể sử dụng constructs trong python để : 


  • You can express the abstraction's API using strong-typed data types
  • You can express rich interactions with methods and properties
  • You can create polymorphic programming models through interfaces and base classes
  • Share them through regular package managers
  • Test them using our familiar testing tools and techniques
  • Version them
  • ...and do all that stuff that we've been doing with software in the past 20 years.


Lúc này file main.py được constructs như sau: 

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart

from webservice import WebService


class MyChart(Chart):
    def __init__(self, scope: Construct, name: str):
        super().__init__(scope, name)

        WebService(self, 'hello', image='paulbouwer/hello-kubernetes:1.7', replicas=2)
        WebService(self, 'ghost', image='ghost', container_port=2368)


app = App()
MyChart(app, "hello")

app.synth()





Nhận xét

Bài đăng phổ biến từ blog này

Trang web medium.com chết, vì sao ?

Cách sử dụng sys.argv trong python.

Thiết kế một RESTful API bằng python và flask.