이번 글에서는 Kubernetes에서 시크릿(Secrets)을 사용하는 방법에 대해 알아보겠습니다. 시크릿은 MySQL 비밀번호와 같은 민감한 정보를 안전하게 관리하는 데 매우 유용합니다. 이를 실제 예제와 함께 단계별로 설명해드리겠습니다.
간단한 파이썬 웹 애플리케이션이 있습니다. 이 애플리케이션은 MySQL 데이터베이스에 연결하며, 성공적으로 연결되면 성공 메시지를 표시합니다. 그러나, 코드에 하드코딩된 호스트명, 사용자 이름, 비밀번호는 보안상 좋지 않습니다. 이 문제를 해결하기 위해 설정 맵(ConfigMap)과 시크릿(Secrets)을 사용할 수 있습니다.
import os
from flask import Flask, render_template
import mysql.connector
app = Flask(__name__)
@app.route("/")
def main():
connection = mysql.connector.connect(
host='mysql',
database='mysql',
user='root',
password='paswrd'
)
color = fetchcolor(connection)
return render_template('hello.html', color=color)
def fetchcolor(connection):
cursor = connection.cursor()
cursor.execute("SELECT color FROM colors WHERE id=1") # Example query
color = cursor.fetchone()[0]
cursor.close()
return color
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
Configmap은 호스트명과 사용자 이름과 같은 설정 데이터를 평문 텍스트로 저장합니다. 그러나 비밀번호와 같은 민감한 정보는 Configmap에 저장하는 것이 적절하지 않습니다. 이럴 때 시크릿을 사용합니다. 시크릿은 민감한 정보를 인코딩된 형식으로 저장하여 보안을 강화합니다.
시크릿을 생성하는 방법에는 명령형 방식과 선언형 방식 두 가지가 있습니다.
명령형 방식에서는 kubectl create secret generic
명령어를 사용합니다. 예를 들어, app-secret
이라는 이름으로 db-password
라는 키와 mysql
이라는 값을 가진 시크릿을 생성할 수 있습니다.
kubectl create secret generic app-secret --from-literal=db-password=mysql
선언형 방식에서는 시크릿 정의 파일을 생성합니다. 예를 들어, app-secret.yaml
파일을 다음과 같이 작성할 수 있습니다.
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
db-password: bXlzcWw=
여기서 bXlzcWw=
는 mysql
을 base64로 인코딩한 값입니다. 리눅스 호스트에서 데이터를 인코딩하려면 다음 명령어를 사용할 수 있습니다.
echo -n "mysql" | base64
시크릿을 생성한 후, kubectl get secrets
명령어로 시크릿 목록을 확인할 수 있습니다. 새로 생성된 시크릿의 자세한 정보를 보려면 kubectl describe secret app-secret
명령어를 사용합니다. 시크릿 값을 포함한 출력을 보려면 kubectl get secret app-secret -o yaml
명령어를 사용합니다. 인코딩된 값을 디코딩하려면 다음 명령어를 사용합니다.
echo "bXlzcWw=" | base64 --decode
시크릿을 생성한 후, 이를 파드에 주입해야 합니다. 이를 위해 파드 정의 파일을 작성합니다. 예를 들어, pod.yaml
파일을 다음과 같이 작성할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
envFrom:
- secretRef:
name: app-secret
이 파일은 시크릿의 데이터를 환경 변수로 파드에 주입합니다. 시크릿을 단일 환경 변수로 주입하거나, 시크릿 전체를 볼륨에 파일로 주입할 수도 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
volumes:
- name: secret-volume
secret:
secretName: app-secret
이 경우 /etc/secret
디렉토리에 db-password
파일이 생성되고, 이 파일의 내용으로 비밀번호가 포함됩니다.
이제 Kubernetes에서 시크릿을 생성하고 파드에 주입하는 방법을 알게 되었습니다. 시크릿을 사용하여 민감한 정보를 안전하게 관리하고, 애플리케이션의 보안을 강화할 수 있습니다. 시크릿을 설정 맵과 함께 사용하면 민감한 정보와 일반 설정 데이터를 분리하여 관리할 수 있습니다.