シークレットのシール
カタログPodの探索
現在、catalogデプロイメントは、環境変数を通じてcatalog-dbシークレットからデータベース認証情報にアクセスしています:
RETAIL_CATALOG_PERSISTENCE_USERRETAIL_CATALOG_PERSISTENCE_PASSWORD
これはenvFromを使用してシークレットを参照することで行われています:
- configMapRef:
name: catalog
- secretRef:
name: catalog-db
catalog-dbシークレットを調査すると、base64エンコードされただけであることがわかります。これは以下のように簡単にデコードできるため、シークレットマニフェストをGitOpsワークフローの一部とすることが難しくなります。
apiVersion: v1
kind: Secret
metadata:
name: catalog-db
data:
RETAIL_CATALOG_PERSISTENCE_USER: "Y2F0YWxvZw=="
RETAIL_CATALOG_PERSISTENCE_PASSWORD: "ZFltTmZXVjR1RXZUem9GdQ=="
catalog%
dYmNfWV4uEvTzoFu%
catalog-sealed-dbという新しいシークレットを作成しましょう。catalog-dbシークレットと同じキーと値を持つ新しいファイル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マニフェストを作成します。
または、コントローラから公開鍵を取得し、オフラインでシークレットをシールすることもできます:
これにより、以下の内容の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カスタムリソースを検知し、それを解除して通常のシークレットを作成していることがわかります。
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 successfullyコントローラによってSealedSecretから解除されたcatalog-sealed-dbシークレットがsecure-secretsネームスペースにデプロイされたことを確認 します。
NAME TYPE DATA AGE
catalog-sealed-db Opaque 4 7m51s
上記のシークレットから読み取るcatalogデプロイメントを再デプロイしましょう。catalogデプロイメントを更新して、catalog-sealed-dbシークレットを読み取るようにしました:
- 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は、クラスターにデプロイされた他のKubernetesリソース(DaemonSet、Deployment、ConfigMapなど)に関するYAMLマニフェストとともにGitリポジトリに安全に保存できます。その後、GitOpsワークフローを使用して、これらのリソースをクラスターにデプロイする管理ができます。