Написание более 200 строк кода YAML, просто для развертывания микросервиса на Kubernetes, является огромной болью для инженера DevOps.
CDK8s можно использовать для удаления всего этого дубликата кода и облегчить развертывание микросервиса без необходимости писать массивные манифесты YAML.
Мы также получаем возможность писать код, используя наши любимые объектно-ориентированные языки.
Мы будем написать пример CDK8S -диаграммы с использованием конструкций TypeScript и OpenSource CDK8S.
Конструкции используются:
@opencdk8s/cdk8s-redis-sts v0.0.7 cdk8s-plus-17 v1.0.0-beta.8
- Инициализировать проект CDK8S
mkdir cdk8s-node-app && cd cdk8s-node-app cdk8s init typescript-app
- Установите конструктивные библиотеки
npm install @opencdk8s/cdk8s-redis-sts
- Редактировать main.ts, чтобы включить наше приложение Redis DB и Nodejs
import { Construct } from 'constructs'; import { App, Chart, ChartProps } from 'cdk8s'; import { MyRedis } from '@opencdk8s/cdk8s-redis-sts'; import { Deployment } from 'cdk8s-plus-17'; export class MyChart extends Chart { constructor(scope: Construct, id: string, props: ChartProps = { }) { super(scope, id, props); const redis = new MyRedis(this, 'redis', { image: 'redis', namespace: 'default', volumeSize: '10Gi', replicas: 3, createStorageClass: false, }); new Deployment(this, "deployment", { metadata: { namespace: 'default', }, containers: [{ image: "hunterthompson/node-redis-counter:latest", name: "hello", env: { 'REDIS_URI': { value: redis.name } } }] }) } } const app = new App(); new MyChart(app, 'microservice'); app.synth();
- Запустить компиляцию и синтезатор
npm run compile && npm run synth
Конечным результатом команды Synth Run NPM является манифест YAML, который вы можете применить, используя kubectl
apiVersion: v1 data: master.conf: |- bind 0.0.0.0 daemonize no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 supervised no slave.conf: |- slaveof redis 6379 kind: ConfigMap metadata: name: redis-redis-conf namespace: default --- apiVersion: v1 kind: Service metadata: labels: app: redis name: redis namespace: default spec: ports: - port: 6379 targetPort: 6379 selector: app: redis type: ClusterIP --- apiVersion: apps/v1 kind: StatefulSet metadata: labels: app: redis name: redis namespace: default spec: replicas: 3 selector: matchLabels: app: redis serviceName: redis template: metadata: labels: app: redis spec: containers: - command: - bash - -c - |- [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 ordinal=${BASH_REMATCH[1]} if [[ $ordinal -eq 0 ]]; then redis-server /mnt/redis/master.conf else redis-server /mnt/redis/slave.conf fi env: [] image: redis name: redis ports: - containerPort: 6379 resources: limits: cpu: 400m memory: 512Mi requests: cpu: 200m memory: 256Mi volumeMounts: - mountPath: /data name: redis - mountPath: /mnt/redis/ name: redis-redis-conf terminationGracePeriodSeconds: 10 volumes: - configMap: name: redis-redis-conf name: redis-redis-conf volumeClaimTemplates: - metadata: name: redis namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: gp2 -------- apiVersion: apps/v1 kind: Deployment metadata: name: microservice-deployment-c89e8760 namespace: default spec: replicas: 1 selector: matchLabels: cdk8s.deployment: microservice-deployment-c87f6fea template: metadata: labels: cdk8s.deployment: microservice-deployment-c87f6fea spec: containers: - env: - name: REDIS_URI value: redis image: hunterthompson/node-redis-counter:latest imagePullPolicy: Always name: hello ports: [] volumeMounts: [] volumes: []
Мы только что синтезировали манифест YAML 130, написав 33 строки кода CDK8S.
Оригинал: «https://dev.to/hunterthompson/deploying-a-simple-nodejs-microservice-using-cdk8s-3mjg»