
k8s에 환경 변수를 넣는 방법이 쉬울 줄 알았다. 별 것 아닐 줄 알았다.
helm 차트를 활용해 배포 파이프라인을 구축하였다. 물론 환경 변수 내용도 파이프라인에 넣어서 같이 배포하면 가능하긴 하지만, 배포용 yaml이 들어있는 리포지토리에 환경 변수를 직접 넣어야 한다는 부담이 있다. 전부 완료하고 든 생각은 base64 암호화를 적용해서 괜찮지 않을까..?생각도 했지만, 아무래도 키 값들이 노출되는게 부담이 되어, 어떻게 해결해야 할 지 알아보았다.
namespace별 secret.yaml 우선 등록하기
환경 변수를 k8s에 등록하는 방법은, namespace별 secret.yaml 파일을 작성해서 적용하면 사용 가능하다고 한다. 또한, CD 파이프라인에 secret.yaml 파일을 같이 넣어야 할 필요 없다고 한다. helm 차트에 secret 이름만 고지해주면 된다고 한다.
하지만...순탄치 않았다...(그래서 결론이뭐냐?! -> 적용 방법은 마지막에 전부 모아뒀다)
base64 암호화??
그냥 타이핑으로 key:value에서 value에 해당하는 값을 넣어서 yaml을 적용하려고 했다. 그러나 yaml을 적용하려고 명령어를 입력했는데, value값을 암호화해야 한다는 오류가 떴다.
그래 뭐, 암호화 까짓것 하지! 하고 본 환경변수의 갯수는....?16개였다. 물론 어려운 일은 아니였으나, 자동화가 매우 하고 싶은 개발자 근성이 발동해 아래 python코드를 얻어냈다(GPT에게서...)
name과 namespace부분을 적절히 수정해야 한다!!
import base64
# 입력 파일 경로 (key=value 형식)
input_file = 'my-secret.txt'
# 출력 파일 경로 (Kubernetes Secret YAML)
output_file = 'my-secret.yaml'
# Kubernetes Secret 기본 형식
secret_template = '''apiVersion: v1
kind: Secret
metadata:
name: my-secret
namespace: {네임스페이스 지정}
type: Opaque
data:
'''
def encode_value(value: str) -> str:
return base64.b64encode(value.encode()).decode()
def convert_to_secret():
with open(input_file, 'r') as infile, open(output_file, 'w') as outfile:
outfile.write(secret_template)
for line in infile:
# key=value 형식에서 key와 value 분리
key, value = line.strip().split('=', 1)
# base64 인코딩
encoded_value = encode_value(value)
# YAML 형식으로 작성
outfile.write(f' {key}: {encoded_value}\n')
print(f'변환 완료: {output_file}')
convert_to_secret()
상세한 변수 값들은 수정해서 사용하면 된다. 코드에 대한 간단한 사용법은 다음과 같다.
- key=value\nkey=value\n...형태로 txt파일을 준비해둔다(.env를 사용할 때와 같은 형식)
- 파이썬을 실행하고 yaml형식의 파일을 받는다.
- k8s 환경에 yaml 파일을 보내고 다음 명령어로 secret을 먼저 설정한다.
kubectl apply -f <secret yaml 파일 이름> -n <네임스페이스> - helm 내용들에 다음과 같이 추가한다(secret이 존재함을 암시하는 것. 중요!)
- deployment.yaml
spec.template.spec.containers.envFrom.secretRef.name : {{ .Values.secrets.name }} - values.yaml
secret.name:(이부분에 3.에서 secret을 설정할 때 설정한 이름을 사용한다)
- deployment.yaml
확실히 k8s를 사용하니 이런 부분에 있어서 깔끔한 면이 있는 것 같다. 시간이 꽤 많이 들었지만, k8s와 CICD세팅한 것이 굉장히 의미있는 시도였던 것 같다.
'Infra' 카테고리의 다른 글
| [트러블슈팅] Vercel 다중 프로젝트 연결 시 도메인/서브도메인 충돌 해결기 (0) | 2025.08.21 |
|---|---|
| [K8S] 쿠버네티스에서 Ingress를 활용한 HTTPS 적용방법(NGINX Ingress Controller) (0) | 2025.06.27 |
| [미니PC] 2. Github Action+ArgoCD+GHCR를 활용한 CI/CD 구축 (0) | 2025.05.14 |
| [미니PC] 1. 우분투 서버에 Kubernetes(마스터+워커 단일 서버)+ArgoCD 설치 관련 (0) | 2025.05.14 |
| [Docker] portainer와 watchtower (0) | 2025.03.26 |