Kubernetes 배포 사양에서 환경 변수 사용


18

현재 Deployment.yaml서비스 배포에 Kubernetes 사양 을 사용하고 있습니다 . 사양에는 특정 IP 주소에 대한 약어 참조가 포함되어 있습니다 ( <static-ip-address>아래 표시 ).

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

암호 또는 IP 주소와 같은 정보를 원격 Git 리포지토리로 푸시하는 데 관심이 있습니다. 환경 변수를 사용하여 (예 : 배포 사양 및 실제 배포와 같이) 대략 다음과 같이이를 피할 수 있습니까?

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

분명히이 특정 구문은 아직 작동하지 않습니다. 그러나 이와 같은 것이 가능하고 그렇다면 어떻게해야합니까?

별도의 프로비저닝 도구 에 의존하지 않는 것이 좋습니다. 비밀ConfigMap유망한 것처럼 보이지만 분명히이 목적에 맞는 방식으로 소비 될 수는 없습니다. 내가 정의한 고정 IP 주소를 직접 참조 할 수 있다면 gcloud compute addresses create service-address가장 좋습니다.

답변:


27

훨씬 더 쉬운 솔루션 : envsubst

deploy.yml에서 :

LoadbalancerIP: $LBIP

그런 다음 env var를 만들고 다음과 같이 kubectl을 실행하십시오.

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

사용하고자하는 파일 (이 경우에는 YAML 매니페스트)에 일반 Bash 변수를 넣고 그 파일을 읽습니다. env vars를 값으로 대체하여 파일을 출력합니다. 이를 사용하여 다음과 같은 새 파일을 만들 수도 있습니다.

envsubst < input.yml > output.yml

envsubst예를 들어 Ubuntu / Debian gettext패키지로 제공됩니다.


2
일에 대한 envsubst. 지금까지 이것에 대해 알지
못함

1
별도의 도구가 필요하므로 모든 시스템 (예 : Mac)에 기본적으로 설치되어 있지는 않으므로 더 쉬울 수 있습니다.
Ivan

@Ivan 그의 질문은 "그러나 이런 것이 가능하다면 어떻게됩니까?"라는 것이 었습니다. 이것이 그의 질문에 대한 답입니다. 문제는 "기본적으로 모든 OS에서 사용 가능한 도구로 어떻게 할 수 있습니까?"가 아닙니다. 그리고 네, 사용하는 것보다 1) 쉽고 2) 더 깨끗 sed합니다. 정의에 따르면 기본적으로 Windows 시스템에 설치되어 sed있지 않으므로 제안 된 솔루션 도 더 쉽고 깨끗하지 않습니다 sed.
Jan Grewe

"sed"옵션과 비교하고 있는지는 확실하지 않습니다.
Ivan

2

또 다른 유쾌한 해결책이 있습니다 .Google Compute Address가 my-address정의되어 있으며 서비스 사양에서 다음과 같이 분명히 사용할 수 있습니다 loadBalancerIP: my-address.

이것을 IP 주소의 "외부"소스로 사용하고 비밀번호의 비밀을 사용하면 간단한 사용 사례 (GKE 환경 내)를위한 프로비저닝 도구 (또는 템플릿)가 더 이상 필요하지 않습니다.

지금 폐회 :sed 결국 "built-in" 과 같은 프로비저닝 도구를 사용하기로 결정했습니다 .

Deployment.yaml예는 "템플릿 변수"를 포함합니다.

loadBalancerIP: $$EXTERNAL_IP

1.2.3.4로 외부 IP 주소로 서비스를 배포합니다.

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -

1
Jan Grewe의 접근 방식은 더 일반적이며 여러 변수에 적용 할 수 있습니다. 덜 일반적이며 모든 추가 변수에 대해 조정 해야하는 자신의 것을 받아들이지 않고 그의 대답을 받아들이는 것이 좋습니다.
TekTimmy

0

yaml 파일에서 변수 대체를 수행하는 간단한 전처리 기를 작성할 수 있습니다 (또는 jsonnet 을 사용 하여 json 구성 파일에서 동일한 작업을 수행 할 수 있음 ).

Kubernetes 구성에 직접 템플릿추가하는 방법에 대한 논의 가 있지만 아직 구현되지 않았거나 사용할 수 없습니다.


예, 그러나 jsonnet은 질문에서 언급 한 프로비저닝 도구입니다.
Drux

1
내장 된 것을 찾고 있다면 내가 연결 한 문제를 따르는 것이 가장 좋은 방법입니다.
Robert Bailey

0

템플릿 을 사용할 수 있을 때까지 가장 쉬운 방법 은 Kubernetes API 를 사용하여 서비스를 업데이트 하는 작업을 실행하는 것입니다 . 비밀 (IP 주소 포함) 및 구성 맵 (템플릿 포함)과 결합 된 알파인 기반 이미지의 짧은 쉘 스크립트는 충분히 단순해야합니다. 어려운 비트는 apiserver의 인증 및 권한 부여 기능을 올바르게 사용하고 있습니다.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container 는 API에 액세스하는 예를 제공합니다. 분명히이 예에서 GET 대신 / api / v1 / namespaces / default / services 에 POST하고 싶을 것입니다.


흥미롭게 들리지만 좀 더 정교하게 작성해주세요. 적절한 쉘 스크립트의 예를 들거나 제시 할 수 있습니까?
Drux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.