programing

Docker의 env-file에 해당하는 Kubernetes

coolbiz 2023. 7. 29. 13:11
반응형

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.

질문:

  1. 환경 변수를 다음과 같이 하드 코딩하는 대신 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
  1. 이 방법이 불가능할 경우 제안된 접근 방식은 무엇입니까?

암호 또는 구성 맵을 사용하여 컨테이너의 환경 변수를 채울 수 있습니다.작업 중인 데이터가 중요한 경우(예: 암호) 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-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

반응형