Docker의 env-file에 해당하는 Kubernetes
배경:
현재 서비스에 도커와 도커 컴포지트를 사용하고 있습니다.다양한 환경에 대한 구성을 애플리케이션에서 읽은 환경 변수를 정의하는 파일로 외부화했습니다.를 들어, 를예들a는prod.env
파일 이름:
ENV_VAR_ONE=Something Prod
ENV_VAR_TWO=Something else Prod
a 리고a.test.env
파일 이름:
ENV_VAR_ONE=Something Test
ENV_VAR_TWO=Something else Test
따라서 우리는 간단히 사용할 수 있습니다.prod.env
또는test.env
컨테이너를 시작할 때 파일:
docker run --env-file prod.env <image>
의 애플리케이션은 그런다애션은에정환서변기구선다니에 합니다.prod.env
.
질문:
- 환경 변수를 다음과 같이 하드 코딩하는 대신 Kubernetes의 파일(예: 포드를 정의할 때)에서 제공할 수 있는 방법이 있습니까?
apiVersion: v1종류: 포드메타데이터:레이블:컨텍스트: 도커-k8s-lab이름: mysql-pod이름: mysql-pod사양:컨테이너:-env:-이름: MYSQL_USER값: mysql-이름: MYSQL_PASSWORD값: mysql-이름: MYSQL_DATABASE값: 샘플-이름: MYSQL_ROOT_PASSWORD값: 초비밀이미지:"vmdk:vmdk"이름: mysql포트:-컨테이너 포트: 3306
- 이 방법이 불가능할 경우 제안된 접근 방식은 무엇입니까?
암호 또는 구성 맵을 사용하여 컨테이너의 환경 변수를 채울 수 있습니다.작업 중인 데이터가 중요한 경우(예: 암호) Secrets를 사용하고, 중요하지 않은 경우 ConfigMaps를 사용합니다.
포드 정의에서 컨테이너가 암호에서 값을 가져오도록 지정합니다.
apiVersion: v1
kind: Pod
metadata:
labels:
context: docker-k8s-lab
name: mysql-pod
name: mysql-pod
spec:
containers:
- image: "mysql:latest"
name: mysql
ports:
- containerPort: 3306
envFrom:
- secretRef:
name: mysql-secret
이 구문은 Kubernetes 1.6 이상에서만 사용할 수 있습니다.이전 버전의 Kubernetes에서는 다음과 같이 각 값을 수동으로 지정해야 합니다.
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_USER
:env
어레이를 가치로 사용)
모든 값에 대해 반복합니다.
어떤 접근 방식을 사용하든 이제 프로덕션용과 개발용으로 서로 다른 두 가지 비밀을 정의할 수 있습니다.
dev-secret.devl:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_USER: bXlzcWwK
MYSQL_PASSWORD: bXlzcWwK
MYSQL_DATABASE: c2FtcGxlCg==
MYSQL_ROOT_PASSWORD: c3VwZXJzZWNyZXQK
prod-secret.skl:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_USER: am9obgo=
MYSQL_PASSWORD: c2VjdXJlCg==
MYSQL_DATABASE: cHJvZC1kYgo=
MYSQL_ROOT_PASSWORD: cm9vdHkK
올바른 쿠버네티스 클러스터에 올바른 암호를 배포합니다.
kubectl config use-context dev
kubectl create -f dev-secret.yaml
kubectl config use-context prod
kubectl create -f prod-secret.yaml
이제 포드가 시작될 때마다 암호에 지정된 값으로 환경 변수를 채웁니다.
Kubernetes(v1.6)에 대한 새로운 업데이트를 통해 몇 년 전에 요청한 내용을 사용할 수 있습니다.
이사용수다있을 할 수 .envFrom
당신의 yaml 파일에 있는 것처럼:
containers:
- name: django
image: image/name
envFrom:
- secretRef:
name: prod-secrets
개발 비밀이 중요한 경우 다음을 통해 개발 비밀을 생성할 수 있습니다.
kubectl create secret generic prod-secrets --from-env-file=prod/env.txt`
여기서 txt 파일 내용은 키 값입니다.
DB_USER=username_here
DB_PASSWORD=password_here
문서들은 여전히 예시의 호수입니다. 저는 그 장소들을 정말 열심히 검색해야 했습니다.
참고: 사이에는 차이가 있습니다.--from-file
그리고.--from-env-file
아래 주석에 설명된 대로 비밀을 만들 때.
YAML 파일을 사용하여 Kubernetes용 포드를 정의할 때 컨테이너에 대한 환경 변수를 포함하는 다른 파일을 직접 지정할 수 있는 방법은 없습니다.Kubernetes 프로젝트는 미래에 이 분야를 개선할 것이라고 말합니다(Kubernetes 문서 참조).
그 동안 프로비저닝 도구를 사용하여 포드 YAML을 템플릿으로 만들 것을 제안합니다.예를 들어 Ansible을 사용하면 포드 YAML 파일은 다음과 같습니다.
파일my-pod.yaml.template
:
apiVersion: v1
kind: Pod
...
spec:
containers:
...
env:
- name: MYSQL_ROOT_PASSWORD
value: {{ mysql_root_pasword }}
...
할 수 있습니다.mysql_root_password
다음과 같이 리소스를 생성할 때 편리한 위치로 대체합니다.
파일my-playbook.yaml
:
- hosts: my_hosts
vars_files:
- my-env-vars-{{ deploy_to }}.yaml
tasks:
- name: create pod YAML from template
template: src=my-pod.yaml.template dst=my-pod.yaml
- name: create pod in Kubernetes
command: kubectl create -f my-pod.yaml
파일my-env-vars-prod.yaml
:
mysql_root_password: supersecret
파일my-env-vars-test.yaml
:
mysql_root_password: notsosecret
이제 다음과 같이 실행하여 포드 리소스를 생성합니다.
ansible-playbook -e deploy=test my-playbook.yaml
이것은 나에게 도움이 됩니다.
파일env-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: env-secret
type: Opaque
stringData:
.env: |-
APP_NAME=Laravel
APP_ENV=local
리고안으로그에.deployment.yaml
또는pod.yaml
spec:
...
volumeMounts:
- name: foo
mountPath: "/var/www/html/.env"
subPath: .env
volumes:
- name: foo
secret:
secretName: env-secret
````
나는 지금 2시간 동안 이것에 머리를 부딪혔어요.저는 서류에서 제 (그리고 바라건대) 고통을 최소화할 수 있는 아주 간단한 해결책을 발견했습니다.
지킨다
env.prod
,env.dev
당신이 가지고 있는 것처럼.하나의 줄자 스크립트를 사용하여 yaml로 가져옵니다.
kubectl create configmap my-dev-config --from-env-file=env.dev
kubectl create configmap my-prod-config --from-env-file=env.prod
결과를 확인할 수 있습니다(즉시 만족도).
# You can also save this to disk
kubectl get configmap my-dev-config -o yaml
루비스트인 저는 개인적으로 이 솔루션을 가장 DRYest라고 생각합니다. 유지 관리해야 할 단일 지점(Python/Ruby 라이브러리와 호환되는 ENVash 파일...)을 가지고 한 번의 실행으로 YAMLize할 수 있기 때문입니다.
깨끗하게 점에 이하는 데 가 되는 ENV를 ).cat config.original | egrep -v "^#" | tee config.cleaned
하지만 이것이 복잡성을 크게 바꾸지는 못합니다.
여기에 모두 문서화되어 있습니다.
이것은 오래된 질문이지만 미래의 초보자를 위한 나의 대답을 설명하겠습니다.
kustomize configMapGenerator를 사용할 수 있습니다.
configMapGenerator:
- name: example
env: dev.env
그리고 이 configMap/예시 in 포드 정의를 참조하십시오.
이것은 오래된 질문이지만 많은 시청자들이 있기 때문에 저는 제 대답을 덧붙입니다.K8s 구현에서 구성을 분리하는 가장 좋은 방법은 Helm을 사용하는 것입니다.각 조타 장치 패키지에는 다음이 포함될 수 있습니다.values.yaml
파일을 사용하면 헬름 차트에서 해당 값을 쉽게 사용할 수 있습니다.다중 구성 요소 토폴로지를 사용하는 경우에는 상위 Helm 패키지를 생성할 수 있으며 상위 값 패키지는 하위 값 파일을 덮어쓸 수도 있습니다.
컨테이너에 K8S 값을 환경 변수로 지정하여 참조할 수 있습니다.
다음과 같이 배포를 mongo.yml로 합니다.
--
kind: Deployment
--
--
containers:
--
env:
- name: DB_URL
valueFrom:
configMapKeyRef:
name: mongo-config
key: mongo-url
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
mongo-secret이 중요한 데이터(예: 암호 또는 인증서)에 사용되는 경우
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
type: Opaque
data:
mongo-user: bW9uZ291c2Vy
mongo-password: bW9uZ29wYXNzd29yZA==
그리고 mongo-config는 민감하지 않은 데이터에 사용됩니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: mongo-config
data:
mongo-url: mongo-service
다음 단계를 시도할 수 있습니다.
이 명령은 파일을 저장합니다.prod.env
비밀로
kubectl create secret generic env-prod --from-file=prod.env=prod.env
그런 다음 배포 환경에서 이 파일을 참조할 수 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-identity
labels:
app.kubernetes.io/name: api-identity
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: api-identity
template:
metadata:
labels:
app.kubernetes.io/name: api-identity
spec:
imagePullSecrets:
- name: docker-registry-credential
containers:
- name: api-identity
image: "api-identity:test"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8005
protocol: TCP
volumeMounts:
- name: env-file-vol
mountPath: "/var/www/html/.env"
subPath: .env
volumes:
- name: env-file-vol
secret:
secretName: env-prod
언급URL : https://stackoverflow.com/questions/33478555/kubernetes-equivalent-of-env-file-in-docker
'programing' 카테고리의 다른 글
장고에서 이너 조인을 만드는 방법은? (0) | 2023.09.07 |
---|---|
Twitter 부트스트랩 모달:슬라이드 다운 효과를 제거하는 방법 (0) | 2023.07.29 |
테스트 컨테이너, mariadb, 샤딩 구 및 플라이웨이 (0) | 2023.07.29 |
Liquibase 업데이트 오류 (0) | 2023.07.29 |
매크로의 타일(~)은 무엇을 의미합니까? (0) | 2023.07.29 |