친숙한 프로그래밍 언어로 Kubernetes YAML 생성
7391 단어 typescriptkubernetes
Pulumi는 클러스터에서 Kubernetes 리소스를 배포 및 업데이트할 수 있는 기능excellent support이 있지만 많은 사용자가 기존 워크플로에 통합할 수 있는 YAML을 렌더링하는 옵션을 요청했습니다.
pulumi-kubernetes
의 v1.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 렌더링 지원에 대해 유의해야 할 두 가지 중요한 주의 사항이 있습니다.
Service
에는 IP 할당이 없으므로 이러한 값을 내보내려고 하면 평소와 같이 작동하지 않습니다(즉, 값은 undefined
이 됨). 모든 비밀 값은 렌더링된 매니페스트에서 일반 텍스트로 나타납니다. 여기에는 Pulumi에서 비밀로 표시된 모든 값이 포함됩니다. YAML로 렌더링되는 비밀 값에 대해 경고가 인쇄되지만 렌더링된 파일을 보호하는 것은 사용자의 책임입니다.
더 알아보기
풀루미와 코드를 통해 인프라와 쿠버네티스를 관리하는 방법에 대해 배우고 싶다면 . Pulumi는 오픈 소스이며 무료로 사용할 수 있습니다.
Pulumi를 사용하여 Kubernetes 클러스터를 생성하거나 클러스터에 워크로드를 배포하는 방법에 대한 추가 예제는 Kubernetes tutorials의 나머지 부분을 확인하십시오.
언제나처럼 GitHub에서 코드를 확인하거나, 에서 팔로우하거나, 를 구독하거나, 질문이 있거나 지원이 필요하거나 그냥 인사하고 싶은 경우에는 Community Slack 채널에 가입할 수 있습니다.
Reference
이 문제에 관하여(친숙한 프로그래밍 언어로 Kubernetes YAML 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pulumi/generate-kubernetes-yaml-with-familiar-programming-languages-43of텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)