๊ฐ์
์ด ์ ์ฐจ์์๋ Hashicorp Vault ๋ด์์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ํด๋ฌ์คํฐ์ Kubernetes ๋ณด์ ๋น๋ฐ์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ Kubernetes ๋ณด์ ๋น๋ฐ์์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ์ํ์ ์ฐธ์กฐํ์ธ์.
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํ๋ซํผ ๊ด๋ฆฌ์๊ฐ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- Hashicorp Vault์์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ํํฉ๋๋ค.
- ๋น๋ฐ๋ฒํธ ์ํ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด Vault์ ์๋ ์ด์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ก ๋กค๋ฐฑํฉ๋๋ค.
- ํ ๋ฒ์ ํ๋์ ๋ฆฌ์ ์ ๋ํด Cassandra ๋น๋ฐ๋ฒํธ๋ฅผ ์ํํ์ฌ ์๋น์ค ๊ฐ์ฉ์ฑ์ ๋ํ ์ํฅ์ ์ต์ํํ๊ณ ์ํ ํ๋ก์ธ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
- ๋จ์ผ ๋ฆฌ์ ์ ์ํ ์์, ์งํ๋ฅ ๋ฐ ์๋ฃ๋ฅผ ์ถ์ ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ Apigee Hybrid 1.13.1 ์ด์์์ ์ ๊ณต๋ฉ๋๋ค.
์์ํ๊ธฐ ์ ์
์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ์ํ์ ์ค์ ํ๊ธฐ ์
- Cassandra ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐฑ์ ํฉ๋๋ค. ์ด ๋ฐฑ์ ์ ์ํ ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณต์ํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
- ํด๋ฌ์คํฐ๊ฐ ์ ์ ์ํ์ธ์ง ํ์ธํฉ๋๋ค(์ฆ, ๋ชจ๋ Apigee ๋ฆฌ์์ค๊ฐ ์คํ ์ค์ด๊ณ ๋๊ธฐ ์ค์ธ ์ํ ๋ณ๊ฒฝ์ฌํญ์ด ์์).
๋จ์ผ ๋ฆฌ์ ์ค์
-
์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ํด Apigee ๋ค์์คํ์ด์ค์ ์๋ก์ด
SecretProviderClass
Kubernetes ๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ฌ์ฉํ ํ ํ๋ฆฟ์ Hashicorp Vault์ Cassandra ๋ณด์ ๋น๋ฐ ์ ์ฅ์ ์ฐธ์กฐํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด Vault ์ญํ ์ด Kubernetes ๋ค์์คํ์ด์ค ๋ด์ ๋ณด์ ๋น๋ฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. -
๋ค์ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์
SecretRotation
์ปค์คํ ๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค.# rotation.yaml apiVersion: apigee.cloud.google.com/v1alpha1 kind: SecretRotation metadata: name: ROTATION_PROCESS_NAME namespace: APIGEE_NAMESPACE spec: organizationId: ORG_NAME rotationId: ROTATION_ID timeoutMinutes: 480 # optional. overrides the default (480m == 8hr). # less than or equal to 0 means infinite timeout. precheck: true cassandra: oldSecretProviderClass: OLD_SPC_NAME newSecretProviderClass: NEW_SPC_NAME jobType: ROTATE
- ROTATION_PROCESS_NAME: ์ํ ์์
์ ๊ณ ์ ์ด๋ฆ์
๋๋ค. ์ํ ์ฌ์ ํ์ธ ์์
๋ฐ ์ํ ์์
์ ๋ํด
metadata.name
์ ๊ณ ์ ํ ๊ฐ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ดsr-1-precheck
๋ค์์sr-1
๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค. - ROTATION_ID:
spec.rotationId
๋ฅผ ์ปค์คํ ์๋ณ์(์:rotation-1-precheck
)๋ก ์ค์ ํฉ๋๋ค. - NEW_SPC_NAME:
spec.cassandra.newSecretProviderClass
๋ฅผ ์ด์ ๋จ๊ณ์์ ๋ง๋ ์๋ก์ด ๋ณด์ ๋น๋ฐ ์ ๊ณต์ ํด๋์ค ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค. - OLD_SPC_NAME:
spec.cassandra.oldSecretProviderClass
๋ฅผApigeeDatastore
์์ ํ์ฌ ์ฌ์ฉ ์ค์ธ SPC ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค.
- ROTATION_PROCESS_NAME: ์ํ ์์
์ ๊ณ ์ ์ด๋ฆ์
๋๋ค. ์ํ ์ฌ์ ํ์ธ ์์
๋ฐ ์ํ ์์
์ ๋ํด
-
rotation.yaml
ํ์ผ์ ์ ์ฉํ์ฌ ์ํ ์ฌ์ ํ์ธ ์์ ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
-
์ฌ์ ํ์ธ ์์
์ด ์๋ฃ๋์์ ๋ ํ์ธํ ์์
์ํ๋ฅผ ํ์ธํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
-
์ํ ์ฌ์ ํ์ธ ์์
์ด ์๋ฃ๋๋ฉด
metadata.name
๊ฐ์ ๋ณ๊ฒฝํ๊ณspec.precheck
๋ฅผfalse
๋ก ์ค์ ํฉ๋๋ค. ํ์ผ์ ๋ค์ ์ ์ฉํ์ฌ ์ํ์ ์ํํฉ๋๋ค.kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
-
์ํ ์์
์ด ์๋ฃ๋๊ณ ํธ๋ํฝ์ด ๊ณ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธ๋์์ผ๋ฉด ๋ค์ ๋ ๋จ๊ณ์ ๋ฐ๋ผ ํ๋ก์ธ์ค๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
-
metadata.name
์ ๊ฐ์ ์ ๋ฐ์ดํธํ๊ณspec.cassandra.jobType
์CLEANUP
์ผ๋ก ์ค์ ํฉ๋๋ค. -
ํ์ผ์ ์ ์ฉํ์ฌ ์ ๋ฆฌ ์์
์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
์ ๋ฆฌ ์์ ์ด ๋๋๋ฉด ์ํ ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋ฉ๋๋ค.
-
-
์ฌ์ ์ ํ์ผ์ ์
๋ฐ์ดํธํ๊ณ
cassandra.auth.secretProviderClass
๋ฅผ ์ ๋ณด์ ๋น๋ฐ ์ ๊ณต์ ํด๋์ค(newSecretProviderClass
)๋ก ์ค์ ํฉ๋๋ค.cassandra: auth: secretProviderClass: NEW_SPC_NAME
- Cassandra ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐฑ์ ํฉ๋๋ค. ์ด ๋ฐฑ์ ์ ์ํ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณต์ํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
- Vault์์ ์ด์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด, ์ญํ , ์ ์ฑ ์ ์ญ์ ํฉ๋๋ค.
๋ฉํฐ ๋ฆฌ์ ์ค์
๋ฉํฐ ๋ฆฌ์ ์ค์ ์ ์ฐจ๋ ์ฒซ ๋ฒ์งธ ๋ฆฌ์ ์ค์ ๊ณผ ๋จ์ ๋ฆฌ์ ์ค์ ์ ๋ ์น์ ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- ํ์ ๋ฆฌ์ ์ ์์ํ๊ธฐ ์ ์ ์ฒซ ๋ฒ์งธ ๋ฆฌ์ ์์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
-
์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ํด
APIGEE_NAMESPACE
๋ค์์คํ์ด์ค์ ์๋ก์ดSecretProviderClass
Kubernetes ๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ฌ์ฉํ ํ ํ๋ฆฟ์ Hashicorp Vault์ Cassandra ๋ณด์ ๋น๋ฐ ์ ์ฅ์ ์ฐธ์กฐํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด Vault ์ญํ ์ด Kubernetes ๋ค์์คํ์ด์ค ๋ด์ ๋ณด์ ๋น๋ฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. -
๋ค์ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์
SecretRotation
์ปค์คํ ๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค.# rotation.yaml apiVersion: apigee.cloud.google.com/v1alpha1 kind: SecretRotation metadata: name: ROTATION_PROCESS_NAME namespace: APIGEE_NAMESPACE spec: organizationId: ORG_NAME rotationId: ROTATION_ID timeoutMinutes: -1 # this value is required and should not be changed. precheck: true cassandra: oldSecretProviderClass: OLD_SPC_NAME newSecretProviderClass: NEW_SPC_NAME jobType: ROTATE
- ROTATION_PROCESS_NAME: ์ํ ์์
์ ๊ณ ์ ์ด๋ฆ์
๋๋ค. ์ํ ์ฌ์ ํ์ธ ์์
๋ฐ ์ํ ์์
์ ๋ํด
metadata.name
์ ๊ณ ์ ํ ๊ฐ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ดsr-1-precheck
๋ค์์sr-1
๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค. - ROTATION_ID:
spec.rotationId
๋ฅผ ์ปค์คํ ์๋ณ์(์:rotation-1-precheck
)๋ก ์ค์ ํฉ๋๋ค. - NEW_SPC_NAME:
spec.cassandra.newSecretProviderClass
๋ฅผ ์ด์ ๋จ๊ณ์์ ๋ง๋ ์๋ก์ด ๋ณด์ ๋น๋ฐ ์ ๊ณต์ ํด๋์ค ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค. - OLD_SPC_NAME:
spec.cassandra.oldSecretProviderClass
๋ฅผApigeeDatastore
์์ ํ์ฌ ์ฌ์ฉ ์ค์ธ SPC ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค.
- ROTATION_PROCESS_NAME: ์ํ ์์
์ ๊ณ ์ ์ด๋ฆ์
๋๋ค. ์ํ ์ฌ์ ํ์ธ ์์
๋ฐ ์ํ ์์
์ ๋ํด
-
rotation.yaml
ํ์ผ์ ์ ์ฉํ์ฌ ์ํ ์ฌ์ ํ์ธ ์์ ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
-
์ฌ์ ํ์ธ ์์
์ด ์๋ฃ๋์์ ๋ ํ์ธํ ์์
์ํ๋ฅผ ํ์ธํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
-
์ํ ์ฌ์ ํ์ธ ์์
์ด ์๋ฃ๋ ํ ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
metadata.name
๊ฐ์ ๋ณ๊ฒฝํฉ๋๋ค(์:sr-1-precheck
์์sr-1
๋ก).spec.precheck
๋ฅผfalse
๋ก ์ค์ ํ์ฌ ์ฌ์ ํ์ธ์ ์ฌ์ฉ ์ค์งํ๊ณ ์ํ์ ์คํํฉ๋๋ค.spec.rotationId
๋ฅผ ์ ์๋ณ์๋ก ์ค์ ํฉ๋๋ค(์:rotation-1
).
-
ํ์ผ์ ๋ค์ ์ ์ฉํ์ฌ ์ํ์ ์ํํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
-
SecretRotation
์ํ๋ฅผ ํ์ธํ๊ณcomplete
๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.kubectl -n APIGEE_NAMESPACE get sr SR_NAME
-
์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ํด
-
์ดํ ๊ฐ ๋ฆฌ์ ์์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
- ์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ํด Apigee ๋ค์์คํ์ด์ค์ ์๋ก์ด
SecretProviderClass
Kubernetes ๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ฌ์ฉํ ํ ํ๋ฆฟ์ Hashicorp Vault์ Cassandra ๋ณด์ ๋น๋ฐ ์ ์ฅ์ ์ฐธ์กฐํ์ธ์. 1a๋จ๊ณ์ ๋์ผํ ์ ์์ฌ์ผ ํฉ๋๋ค. overrides.yaml
์ ์ ๋ฐ์ดํธํ๊ณrotation.yaml
ํ์ผ์spec.cassandra.newSecretProviderClass
๊ฐ๊ณผ ์ผ์นํ๋๋กcassandra.auth.secretProviderClass
๋ฅผ ์ค์ ํฉ๋๋ค.cassandra: auth: secretProviderClass: NEW_SPC_NAME
- ์ฐ์ฐ์ ์ฐจํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
helm upgrade operator apigee-operator/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f OVERRIDES_FILE
-
์
ReplicaSet
๊ฐ ์์ฑ๋ฉ๋๋ค. ์ ์ปจํธ๋กค๋ฌ ๊ด๋ฆฌ์ ํฌ๋๊ฐ ์ SPC๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํฉ๋๋ค.export POD=NEW_CONTROLLER_MANAGER_POD_NAME
kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
๊ฒฐ๊ณผ๋
rotation.yaml
์์spec.cassandra.newSecretProviderClass
์ ์ค์ ํ ๊ฐ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
my-new-spc - ๋ฐ์ดํฐ ์คํ ์ด ์ฐจํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
helm upgrade datastore apigee-datastore/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f OVERRIDES_FILE
- ๋ฐ์ดํฐ ์คํ ์ด๊ฐ ์ถ์ ์ํ๋ก ์ ํ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์คํ ์ด์ ์ถ์๊ฐ ์๋ฃ๋๊ณ ์คํ ์ํ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
kubectl -n APIGEE_NAMESPACE get apigeedatastore DATASTORE_NAME
๋๋ถ๋ถ์ ์ค์น์์ DATASTORE_NAME์
default
์ ๋๋ค. - ์ ๋ฐ์ดํฐ ์คํ ์ด ํฌ๋์์ ์ SPC๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํฉ๋๋ค.
export POD=NEW_DATASTORE_POD_NAME
kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
๊ฒฐ๊ณผ๋
rotation.yaml
์์spec.cassandra.newSecretProviderClass
์ ์ค์ ํ ๊ฐ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
my-new-spc - ์กฐ์ง ๋ฐ ํ๊ฒฝ ์ถ์๊ฐ ์๋ฃ๋๊ณ ์คํ ์ค ์ํ๋ก ๋์๊ฐ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
kubectl -n APIGEE_NAMESPACE get apigeeorg ORG_NAME
kubectl -n APIGEE_NAMESPACE get apigeeenv ENV_NAME
- ์ MART, ๋ฐํ์, ๋๊ธฐํ๊ธฐ ํฌ๋๊ฐ ์ SPC๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํฉ๋๋ค.
export POD=NEW_MART_POD_NAME
kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
export POD=NEW_RUNTIME_POD_NAME
kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
export POD=NEW_SYNCHRONIZER_POD_NAME
kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
๊ฒฐ๊ณผ๋
rotation.yaml
์์spec.cassandra.newSecretProviderClass
์ ์ค์ ํ ๊ฐ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
my-new-spc
- ์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ํด Apigee ๋ค์์คํ์ด์ค์ ์๋ก์ด
-
๋ชจ๋ ๋ฆฌ์ ์ ๋จ๊ณ๋ฅผ ์๋ฃํ๊ณ ํธ๋ํฝ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ ํ ๋ค์ ๋ ๋จ๊ณ์ ๋ฐ๋ผ ์ฒซ ๋ฒ์งธ ๋ฆฌ์ ์์ ํ๋ก์ธ์ค๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
-
์ฒซ ๋ฒ์งธ ๋ฆฌ์ ์์
metadata.name
๊ฐ์ ์ ๋ฐ์ดํธํ๊ณspec.cassandra.jobType
์CLEANUP
์ผ๋ก ์ค์ ํฉ๋๋ค. -
ํ์ผ์ ์ ์ฉํ์ฌ ์ ๋ฆฌ ์์
์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
- ์์ ์ํ๋ฅผ ํ์ธํ๊ณ ์์ ๋ก๊ทธ๋ฅผ ํตํด ์ ๋ฆฌ ์์ ์ด ์๋ฃ๋์๋์ง ํ์ธํฉ๋๋ค.
์ ๋ฆฌ ์์ ์ด ๋๋๋ฉด ์ํ ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋ฉ๋๋ค.
-
์ฒซ ๋ฒ์งธ ๋ฆฌ์ ์์
-
์ฌ์ ์ ํ์ผ์ ์
๋ฐ์ดํธํ๊ณ
cassandra.auth.secretProviderClass
๋ฅผ ์ ๋ณด์ ๋น๋ฐ ์ ๊ณต์ ํด๋์ค(newSecretProviderClass
)๋ก ์ค์ ํฉ๋๋ค.cassandra: auth: secretProviderClass: NEW_SPC_NAME
- Cassandra ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐฑ์ ํฉ๋๋ค. ์ด ๋ฐฑ์ ์ ์ํ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณต์ํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
- Vault์์ ์ด์ Cassandra ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด, ์ญํ , ์ ์ฑ ์ ์ญ์ ํฉ๋๋ค.
์ํ ๋กค๋ฐฑ
๋ฉํฐ ๋ฆฌ์ ์ ๊ฒฝ์ฐ ๊ฐ ๋ฆฌ์ ์์ ๋กค๋ฐฑ์ ์ํํฉ๋๋ค.
-
๋ค์ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์ SecretRotation ์ปค์คํ
๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค.
# rollback-rotation.yaml apiVersion: apigee.cloud.google.com/v1alpha1 kind: SecretRotation metadata: name: ROLLBACK_NAME namespace: APIGEE_NAMESPACE spec: organizationId: APIGEE_ORG rotationId: ROTATION_ID # match the current rotation. timeoutMinutes: TIMEOUT_MINUTES # optional. precheck: false cassandra: oldSecretProviderClass: OLD_SPC_NAME # Must match the previous oldSecretProviderClass. newSecretProviderClass: NEW_SPC_NAME # Must match the previous newSecretProviderClass. jobType: ROLLBACK
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ROLLBACK_NAME: ๋กค๋ฐฑ ์์
์ ์ด๋ฆ์
๋๋ค(์:
sr-1-rollback
). - APIGEE_NAMESPACE: Apigee ๋ค์์คํ์ด์ค์ ๋๋ค.
- APIGEE_ORG: Apigee ์กฐ์ง ID์ ๋๋ค.
- ROTATION_ID: ๋กค๋ฐฑ ์ค์ธ ํ์ฌ ์ํ์ ID์
๋๋ค(์:
rot-1
). - TIMEOUT_MINUTES: ์ ํ์ฌํญ. ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ ์ํฉ๋๋ค(480m == 8์๊ฐ). <=0์ ๋ฌดํ ์ ํ ์๊ฐ์ ์๋ฏธํฉ๋๋ค.
- OLD_SPC_NAME: ๋จ์ผ ๋ฆฌ์ ์ค์ ๋๋ ๋ฉํฐ ๋ฆฌ์ ์ค์ ํ๋ฌ์์ ์์ ์ฌ์ฉํ ์ํ YAML ํ์ผ์
oldSecretProviderClass:
๋ณด์ ๋น๋ฐ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. - NEW_SPC_NAME: ๋จ์ผ ๋ฆฌ์ ์ค์ ๋๋ ๋ฉํฐ ๋ฆฌ์ ์ค์ ํ๋ฌ์์ ์์ ์ฌ์ฉํ ์ํ YAML ํ์ผ์
newSecretProviderClass:
๋ณด์ ๋น๋ฐ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
- ROLLBACK_NAME: ๋กค๋ฐฑ ์์
์ ์ด๋ฆ์
๋๋ค(์:
-
๋กค๋ฐฑ์ ์ ์ฉํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE apply -f ROLLBACK_YAML_FILE
-
์์
์ํ๋ฅผ ํ์ธํ๊ณ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
- ๋กค๋ฐฑ์ด ์๋ฃ๋๋ฉด ํธ๋ํฝ์ด ๊ณ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ฅด๋์ง ํ์ธํฉ๋๋ค.
- ๋ฉํฐ ๋ฆฌ์ ์ค์น์ ๊ฒฝ์ฐ ํธ๋ํฝ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ฅด๋ฉด ๊ฐ ๋ฆฌ์ ์์ ๋กค๋ฐฑ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
-
๋กค๋ฐฑ์ ์๋ฃํ๊ณ ๋ชจ๋ ๋ฆฌ์ ์์ ํธ๋ํฝ์ด ๊ณ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ฅด๋์ง ํ์ธํ ํ ์ญ์ ํ๋ก์ธ์ค๋ฅผ ์์ํฉ๋๋ค.
์ํ YAML ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํฉ๋๋ค.
metadata.name
์ ์ ๋ฆฌ ์์ ์์ ๋ํ๋ด๋ ์ด๋ฆ(์:sr-1-cleanup-rollback
)์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.spec.cassandra.jobType
๋ฅผCLEANUP_ROLLBACK
๋ก ๋ณ๊ฒฝํฉ๋๋ค.
-
ํ์ผ์ ์ ์ฉํ์ฌ ์ ๋ฆฌ ์์
์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
-
์์
์ํ๋ฅผ ํ์ธํ๊ณ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
์ ๋ฆฌ ์์ ์ด ๋๋๋ฉด ์ํ ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋ฉ๋๋ค.
-
์ฌ์ ์ ํ์ผ์ ์
๋ฐ์ดํธํ๊ณ
cassandra.auth.secretProviderClass
๋ฅผ ์ด์ ๋ณด์ ๋น๋ฐ ์ ๊ณต์ ํด๋์ค(oldSecretProviderClass
)๋ก ์ค์ ํฉ๋๋ค.cassandra: auth: secretProviderClass: OLD_SPC_NAME