친숙한 프로그래밍 언어로 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하므로 매니페스트는 프로그램에 지정된 다른 인프라 구성을 포함할 수 있습니다. 렌더링된 매니페스트는 업데이트할 때마다 프로그램 변경 사항과 동기화된 상태로 유지됩니다.결과 디렉토리는 다음과 같습니다.
![](https://s1.md5.ltd/image/00527782bbb01ffaabc848bcd54463e1.png)
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.)