친숙한 프로그래밍 언어로 Kubernetes YAML 생성

7391 단어 typescriptkubernetes
Kubernetes YAML을 손으로 작성하지 말고 친숙한 프로그래밍 언어의 힘을 사용하십시오! Pulumi는 기존 CI/CD 워크플로에 쉽게 통합되는 Kubernetes 매니페스트를 생성할 수 있습니다.

Pulumi는 클러스터에서 Kubernetes 리소스를 배포 및 업데이트할 수 있는 기능excellent support이 있지만 많은 사용자가 기존 워크플로에 통합할 수 있는 YAML을 렌더링하는 옵션을 요청했습니다. pulumi-kubernetesv1.5.4 릴리스에는 이 기능을 활성화하는 renderYamlToDirectory 옵션이 추가되었습니다. 이 옵션은 TypeScript/JavaScript, Python 및 .NET( Go support is coming soon! )을 포함하여 풀루미가 지원하는 모든 언어에서 사용할 수 있습니다.

리소스 전체에 대한 구성을 쉽게 템플릿화하는 것 외에도 친숙한 프로그래밍 언어를 사용하면 라이브러리를 작성하고 사용할 수 있으며 인프라 구성(예: 관리되는 데이터베이스 엔드포인트, 객체 스토리지 등)을 모두 동일한 프로그램에서 쉽게 혼합할 수 있습니다.

TypeScript에서 YAML 렌더링



먼저 렌더링된 매니페스트의 디렉토리를 선택하고 Provider 에서 해당 경로를 지정합니다.

import * as k8s from "@pulumi/kubernetes";
import * as kx from "@pulumi/kubernetesx";

// Instantiate a Kubernetes Provider and specify the render directory.
const provider = new k8s.Provider("render-yaml", {
    renderYamlToDirectory: "rendered",
});


그런 다음 YAML로 렌더링하려는 Kubernetes 리소스에 대해 해당 항목Provider을 사용합니다.

// Create a Kubernetes PersistentVolumeClaim.
const pvc = new kx.PersistentVolumeClaim("data", {
    spec: {
        accessModes: [ "ReadWriteOnce" ],
        resources: { requests: { storage: "1Gi" } },
    }
}, { provider });

// Create a Kubernetes ConfigMap.
const cm = new kx.ConfigMap("cm", {
    data: { "config": "very important data" },
}, { provider });

// Create a Kubernetes Secret.
const secret = new kx.Secret("secret", {
    stringData: {
        "password": new random.RandomPassword("pw", {
            length: 12}).result,
    }
}, { provider });

// Define a Pod.
const pb = new kx.PodBuilder({
    containers: [{
        env: {
            CONFIG: cm.asEnvValue("config"),
            PASSWORD: secret.asEnvValue("password"),
        },
        image: "nginx",
        ports: {http: 8080},
        volumeMounts: [ pvc.mount("/data") ],
    }]
});

// Create a Kubernetes Deployment.
const deployment = new kx.Deployment("nginx", {
    spec: pb.asDeploymentSpec( { replicas: 3 } ),
}, { provider });

// Create a Kubernetes Service.
const service = deployment.createService({
    type: kx.types.ServiceType.LoadBalancer,
});


이제 pulumi update 를 실행하면 Pulumi가 이러한 리소스를 YAML로 렌더링합니다. 업데이트 프로세스는 평소와 같이 확인Outputs하므로 매니페스트는 프로그램에 지정된 다른 인프라 구성을 포함할 수 있습니다. 렌더링된 매니페스트는 업데이트할 때마다 프로그램 변경 사항과 동기화된 상태로 유지됩니다.

결과 디렉토리는 다음과 같습니다.

CustomResourceDefinition 리소스를 먼저 적용해야 하므로 별도의 하위 디렉터리에 렌더링됩니다. (이 예에는 CRD가 포함되어 있지 않으므로 디렉토리가 비어 있습니다.) 다음과 같이 kubectl로 렌더링된 매니페스트를 배포할 수 있습니다.

kubectl apply -f "${RENDER_DIRECTORY}/0-crd"
kubectl apply -f "${RENDER_DIRECTORY}/1-manifest"


짜잔! TypeScript 코드의 33줄(공백과 주석 포함 44줄)에서 YAML의 102줄까지!

다음은 렌더링된Deployment 리소스입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    foo: bar
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"foo":"bar","pulumi.com/autonamed":"true"},"labels":{"app.kubernetes.io/managed-by":"pulumi"},"name":"nginx-nyn4tlkx"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"env":[{"name":"CONFIG","valueFrom":{"configMapKeyRef":{"key":"config","name":"cm-5opqxhna"}}},{"name":"PASSWORD","valueFrom":{"secretKeyRef":{"key":"password","name":"secret-hfcg0l06"}}}],"image":"nginx","name":"nginx","ports":[{"containerPort":8080,"name":"http"}],"volumeMounts":[{"mountPath":"/data","name":"data-4qulussd"}]}],"volumes":[{"name":"data-4qulussd","persistentVolumeClaim":{"claimName":"data-4qulussd"}}]}}}}
    pulumi.com/autonamed: "true"
  labels:
    app.kubernetes.io/managed-by: pulumi
  name: nginx-nyn4tlkx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - env:
        - name: CONFIG
          valueFrom:
            configMapKeyRef:
              key: config
              name: cm-5opqxhna
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              key: password
              name: secret-hfcg0l06
        image: nginx
        name: nginx
        ports:
        - containerPort: 8080
          name: http
        volumeMounts:
        - mountPath: /data
          name: data-4qulussd
      volumes:
      - name: data-4qulussd
        persistentVolumeClaim:
          claimName: data-4qulussd


전체 렌더링된 출력은 this gist을 참조하십시오.

주의 사항



YAML 렌더링 지원에 대해 유의해야 할 두 가지 중요한 주의 사항이 있습니다.
  • YAML 렌더링 리소스는 Kubernetes 클러스터에서 생성되지 않으므로 서버 측에서 계산된 정보는 프로그램에서 사용할 수 없습니다. 예를 들어 a Service에는 IP 할당이 없으므로 이러한 값을 내보내려고 하면 평소와 같이 작동하지 않습니다(즉, 값은 undefined 이 됨).

  • 모든 비밀 값은 렌더링된 매니페스트에서 일반 텍스트로 나타납니다. 여기에는 Pulumi에서 비밀로 표시된 모든 값이 포함됩니다. YAML로 렌더링되는 비밀 값에 대해 경고가 인쇄되지만 렌더링된 파일을 보호하는 것은 사용자의 책임입니다.

  • 더 알아보기



    풀루미와 코드를 통해 인프라와 쿠버네티스를 관리하는 방법에 대해 배우고 싶다면 . Pulumi는 오픈 소스이며 무료로 사용할 수 있습니다.

    Pulumi를 사용하여 Kubernetes 클러스터를 생성하거나 클러스터에 워크로드를 배포하는 방법에 대한 추가 예제는 Kubernetes tutorials의 나머지 부분을 확인하십시오.

    언제나처럼 GitHub에서 코드를 확인하거나, 에서 팔로우하거나, 를 구독하거나, 질문이 있거나 지원이 필요하거나 그냥 인사하고 싶은 경우에는 Community Slack 채널에 가입할 수 있습니다.

    좋은 웹페이지 즐겨찾기