Secret 봉인하기
Catalog Pod 살펴보기
현재 catalog Deployment는 환경 변수를 통해 catalog-db Secret에서 데이터베이스 자격 증명에 액세스합니다:
RETAIL_CATALOG_PERSISTENCE_USERRETAIL_CATALOG_PERSISTENCE_PASSWORD
이는 envFrom을 사용하여 Secret을 참조하는 방식으로 수행됩니다:
- configMapRef:
name: catalog
- secretRef:
name: catalog-db
catalog-db Secret을 살펴보면 base64로만 인코딩되어 있어 다음과 같이 쉽게 디코딩할 수 있으므로 GitOps 워크플로의 일부로 Secret 매니페스트를 포함하기 어렵다는 것을 알 수 있습니다.
apiVersion: v1
kind: Secret
metadata:
name: catalog-db
data:
RETAIL_CATALOG_PERSISTENCE_USER: "Y2F0YWxvZw=="
RETAIL_CATALOG_PERSISTENCE_PASSWORD: "ZFltTmZXVjR1RXZUem9GdQ=="
catalog%
dYmNfWV4uEvTzoFu%
새로운 Secret catalog-sealed-db를 생성해 보겠습니다. catalog-db Secret과 동일한 키와 값을 가진 새 파일 new-catalog-db.yaml을 생성하겠습니다.
apiVersion: v1
kind: Secret
metadata:
name: catalog-sealed-db
namespace: catalog
type: Opaque
data:
RETAIL_CATALOG_PERSISTENCE_USER: "Y2F0YWxvZw=="
RETAIL_CATALOG_PERSISTENCE_PASSWORD: "ZFltTmZXVjR1RXZUem9GdQ=="
이제 kubeseal을 사용하여 SealedSecret YAML 매니페스트를 생성해 보겠습니다.
또는 컨트롤러에서 공개 키를 가져와서 오프라인으로 Secret을 봉인하는 데 사용할 수 있습니다:
다음 내용으로 sealed-secret이 생성됩니다:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: catalog-sealed-db
namespace: catalog
spec:
encryptedData:
password: AgBe(...)R91c
username: AgBu(...)Ykc=
template:
data: null
metadata:
creationTimestamp: null
name: catalog-sealed-db
namespace: catalog
type: Opaque
SealedSecret을 EKS 클러스터에 배포해 보겠습니다:
컨트롤러 로그를 보면 방금 배포된 SealedSecret 커스텀 리소스를 감지하여 일반 Secret을 생성하기 위해 봉인을 해제하는 것을 알 수 있습니다.
2022/11/07 04:28:27 Updating catalog/catalog-sealed-db
2022/11/07 04:28:27 Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"catalog", Name:"catalog-sealed-db", UID:"a2ae3aef-f475-40e9-918c-697cd8cfc67d", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"23351", FieldPath:""}): type: 'Normal' reason: 'Unsealed' SealedSecret unsealed successfullySealedSecret에서 봉인 해제된 catalog-sealed-db Secret이 컨트롤러에 의해 catalog 네임스페이스에 배포되었는지 확인합니다.
NAME TYPE DATA AGE
catalog-sealed-db Opaque 4 7m51s
위 Secret을 읽는 catalog 배포를 재배포해 보겠습니다. 다음과 같이 catalog-sealed-db Secret을 읽도록 catalog 배포를 업데이트했습니다:
- Kustomize Patch
- Deployment/catalog
- Diff
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog
spec:
template:
spec:
containers:
- name: catalog
envFrom:
- configMapRef:
name: catalog
env:
- name: RETAIL_CATALOG_PERSISTENCE_USER
valueFrom:
secretKeyRef:
name: catalog-sealed-db
key: RETAIL_CATALOG_PERSISTENCE_USER
- name: RETAIL_CATALOG_PERSISTENCE_PASSWORD
valueFrom:
secretKeyRef:
name: catalog-sealed-db
key: RETAIL_CATALOG_PERSISTENCE_PASSWORD
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: catalog
namespace: catalog
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: catalog
app.kubernetes.io/name: catalog
template:
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/instance: catalog
app.kubernetes.io/name: catalog
spec:
containers:
- env:
- name: RETAIL_CATALOG_PERSISTENCE_USER
valueFrom:
secretKeyRef:
key: RETAIL_CATALOG_PERSISTENCE_USER
name: catalog-sealed-db
- name: RETAIL_CATALOG_PERSISTENCE_PASSWORD
valueFrom:
secretKeyRef:
key: RETAIL_CATALOG_PERSISTENCE_PASSWORD
name: catalog-sealed-db
envFrom:
- configMapRef:
name: catalog
image: public.ecr.aws/aws-containers/retail-store-sample-catalog:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
name: catalog
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 5
successThreshold: 3
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
fsGroup: 1000
serviceAccountName: catalog
volumes:
- emptyDir:
medium: Memory
name: tmp-volume
app.kubernetes.io/instance: catalog
app.kubernetes.io/name: catalog
spec:
containers:
- - envFrom:
+ - env:
+ - name: RETAIL_CATALOG_PERSISTENCE_USER
+ valueFrom:
+ secretKeyRef:
+ key: RETAIL_CATALOG_PERSISTENCE_USER
+ name: catalog-sealed-db
+ - name: RETAIL_CATALOG_PERSISTENCE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: RETAIL_CATALOG_PERSISTENCE_PASSWORD
+ name: catalog-sealed-db
+ envFrom:
- configMapRef:
name: catalog
- - secretRef:
- name: catalog-db
image: public.ecr.aws/aws-containers/retail-store-sample-catalog:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
SealedSecret 리소스인 catalog-sealed-db는 클러스터에 배포된 DaemonSet, Deployment, ConfigMap 등과 같 은 다른 Kubernetes 리소스와 관련된 YAML 매니페스트와 함께 Git 리포지토리에 안전하게 저장할 수 있습니다. 그런 다음 GitOps 워크플로를 사용하여 이러한 리소스의 배포를 클러스터에 관리할 수 있습니다.