
ãã®èšäºã§ã¯ãBaseCRM Kubernetesã€ã³ãã©ã¹ãã©ã¯ãã£ã§ã·ãŒã¯ã¬ããã管çããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ç§ãã¡ã®ç®æšã¯ãæå°éã®åŽåã§BaseCRM Kubernetesã¯ã©ã¹ã¿ãŒã§Helm Chartsã䜿çšããããšã§ããããã«ã¯ããã©ã¡ãŒã¿ãŒå€ãšã·ãŒã¯ã¬ããã®ç®¡çã®ã¿ãå«ãŸããŸãã HelmãŸãã¯Kubernetesã«ã¯å ¬åŒã®ç§å¯ç®¡çããŒã«ããªããããä¿®æ£ããããšã«ããŸããã
ã¯ããã«
Kubernetesã¯ãGoogleã«ãã£ãŠéçºããããã©ãããã©ãŒã ã§ãããã¯ã©ã¹ã¿ãŒå ã®ã³ã³ããåãããã¢ããªã±ãŒã·ã§ã³ã®å±éãšã¹ã±ãŒãªã³ã°ãèªååããããã®ã³ãã¥ããã£ãµããŒããå å®ããŠããŸãã ããã¯ã次äžä»£ã®PaaSã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ããããã«èšèšããããããŒã¿ãã«ã§ä¿¡é Œæ§ã®é«ãèªå·±ä¿®åŸ©ã·ã¹ãã ã§ãã
Kubernetesã«å ããŠãKubernetesã®å ¬åŒããã±ãŒãžãããŒãžã£ãŒã§ããHelmã䜿çšããŸãã Charts察å¿ã®ãã³ãã¬ãŒãã·ã¹ãã ã«ãããKubernetesã§å®è¡ãããŠããããŸããŸãªçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã®ç®¡çã«åœ¹ç«ã¡ãŸãã
Helm Chartsã¯ãKubernetesã¯ã©ã¹ã¿ãŒå ã®åå©çšå¯èœãªã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒãïŒè€æ°ã®ãµããã£ãŒããæã€æãè€éãªãã³ãã¬ãŒããå«ãïŒãèå¥ãã€ã³ã¹ããŒã«ãããã³æŽæ°ããããã«å¿ èŠã§ãã Helm Chartsã䜿çšãããšãè€æ°ã®ããŒãžã§ã³ã®ãã£ãŒããç°¡åã«ç®¡çã§ããã ãã§ãªããçŽæ¥çãªãããã§ã¹ãã䜿çšããŠããããåæ¢ã§ããŸãã
Helmã䜿çšãããšãè€æ°ã®ã¯ã©ã¹ã¿ãŒã§ã®Kubernetes PaaSå±éã§ã®åå©çšã«é©ããè€éãªã¢ããªã±ãŒã·ã§ã³ãã£ãŒãã§ãã£ãŒããã³ãã¬ãŒãã®äžéšã䜿çšã§ããŸãã CI / CDã䜿çšãããšãKubernetesã¯ã©ã¹ã¿ãŒã«ã¢ããªã±ãŒã·ã§ã³ã¹ã¿ãã¯ãç°¡åã«å±éããããHelmãæåã§èµ·åããŠå šäžçããŒãããå±éãããã§ããŸãã
ã©ã®ãããªåé¡ã解決ããããšããŠããŸããïŒ
ã€ã³ãã©ã¹ãã©ã¯ãã£ã»ãã¥ãªãã£ã«ã¯ããã¹ã¯ãŒããšã¢ã¯ã»ã¹ããŒã¯ã³ãå¿ èŠã§ãã åæã«ãæ確ãªã«ãŒã«ã«åŸã£ãŠã€ã³ãã©ã¹ãã©ã¯ãã£ã«ç°¡åã«ã¢ã¯ã»ã¹ããåæ£ããå¿ èŠããããŸãã ãŸããå€æŽã®ãã®ã³ã°ãã·ãŒã¯ã¬ããã®ããŒãžã§ã³ç®¡çããã®ã³ã°ãããã«ã¯ã·ãŒã¯ã¬ããã®å€ã®å€æŽã«é¢ããèŠåã§ããå¹²æžããŸããã åæã«ãKubernetesã¯ã©ã¹ã¿ãŒãåäœæã§ããããã«ãããã®ã§ãããå€æŽããå¿ èŠã®ãªãè³æ Œæ å ±ããããŸãã
è€æ°ã®ã³ããŒãæå·åãããŠããªããã£ã¹ã¯ãã·ãŒã¯ã¬ããã®ããŒããŒã·ã§ã³ã§åé¡ãçºçããäžæ¹ã§ãVPNã®Gitã«ã·ãŒã¯ã¬ãããä¿æãã人ãããŸãã ä»ã®äººã¯ããããã¯ã©ã¹ã¿ã«çŽæ¥ç»é²ããäœããèµ·ãã£ããšãã«ãã®ããŒã¿ãã¯ã©ã¹ã¿ã§å€±ããŸãã
äžæ¹ãKubernetesãç§å¯ã®ãªããžããªã§ããHashicorp VaultãµãŒãã¹ãšçµ±åããããšã¯å¯èœã§ãã ãã®å Žåãã¯ã©ã¹ã¿ãŒã¯Kubernetesã·ãŒã¯ã¬ããã®åä¿¡æã«ãã®ãµãŒãã¹ãåç §ããŸãã
VaultãµãŒãã¹ã䜿çšããã«Kubernetesã¯ã©ã¹ã¿ãŒã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããŸããããã¯ãã»ãã¥ãªãã£äžã®çç±ããKubernetesã¯ã©ã¹ã¿ãŒã®äžéšã§ãã£ãŠã¯ãªããŸããã Vaultã€ã³ãã©ã¹ãã©ã¯ãã£ãå¿ èŠãšããã«ãããŒã«ã«ã§äœæ¥ããã¢ã€ãã«å®è¡ãå®è¡ããæ©èœãå¿ èŠã§ãã
ãããã©ããã£ãŠããã®ïŒ
Baseã®åºç€ãããç§ãã¡ã¯Ansibleã䜿çšããŠããŸãã ãŸããHelmã䜿çšããŠKubernetesã¯ã©ã¹ã¿ãŒãå±éããããšã決å®ããŸããïŒãã®ãããã¯ã¯ããããå¥ã®èšäºã«å€ããã§ãããïŒã ç§å¯ã®ç®¡çã®åé¡ã«çŽé¢ããŠãAnsible vaultã«ãã䌌ãhelm-secretsãã©ã°ã€ã³ãæãã€ããŸããã åœæãç§ãã¡ã¯PGPã䜿çšããŠãç§å¯ãã¡ã€ã«å šäœãæå·åããŸããã
ããã¯åçŽãªæ±ºå®ã§ããããæåããæçµçãªãã®ã§ã¯ãªãããšã¯æããã§ããã ããã«ãåYAMLã·ãŒã¯ã¬ããã®åå¥ç®¡çã«åãæ¿ããããšã«ããŸããã
ãŸããèŠä»¶ã®ãªã¹ããäœæããèŠä»¶ãæºããããŒã«ãæ€çŽ¢ããŸããã Mozilla SOPSãèŠã€ããããšãã§ããŸãã ããã®æ©èœã¯ããã©ã°ã€ã³ã®ç§å¯ç®¡çã·ã¹ãã ã®ããã¯ãšã³ããšããŠé©åã§ããã
æ®ãããã®ã¯ããã«ã ã·ãŒã¯ã¬ããã®æåã®ããŒãžã§ã³ã䜿çšããŠãSOPSããã¯ãšã³ããšHelmããã³ããšã³ãã®éã«ã·ã³ãã«ãªã¬ã€ã€ãŒãæžãããšã ãã§ããã
ããã¯ãŸãã«ç§ãã¡ããã£ãããšã§ãããåæã«ç§ãã¡ã®ä»äºã®çµæãå ¬è¡ãšå ±æããããšã決å®ããŸããã helm-secretsãã©ã°ã€ã³ã®ãªãªãŒã¹ãã芧ãã ãã ã
以äžã«ãã®æ©èœã®ãªã¹ãã瀺ããŸãïŒããã«ãªã¹ããããŠãããããããã«å€ãã®æ©èœããããŸãïŒã
- helmãã©ã°ã€ã³ãšã®ç°¡åãªçµ±åãšã€ã³ã¹ããŒã«ã
- Helm YAMLæ§é ã®æå·åãµããŒãã
- åã ã®å€ã®æå·å-ããã«ãããæå·åããããã¡ã€ã«ã§ãdiffã䜿çšã§ããŸãã
- git diffã®å Žåããªã³ã¶ãã©ã€åŸ©å·åãæäŸãããŸãã
- helm install / upgrade / rollbackã³ãã³ãã®å Žåãhelm-wrapperã³ãã³ãã¯ãªã³ã¶ãã©ã€ã®åŸ©å·åãšã¯ãªãŒã³ã¢ãããæäŸããŸãã
- PGPãAWS KMSãªã©ã®è€æ°ããŒç®¡çãœãªã¥ãŒã·ã§ã³ã¯ãåãã·ãŒã¯ã¬ãããã¡ã€ã«ã§åæã«äœ¿çšã§ããŸãã
- æå·åããããã¡ã€ã«ã®å ŽåãåçŽãªããŒã®è¿œå /åé€ããµããŒããããŠããŸãã
- AWS KMSããŒã®ã¢ã¯ã»ã¹èš±å¯ç®¡çã·ã¹ãã ãšã®é£æºã¯ãæå·åãå¿ èŠãšããã«ãµããŒããããŸãã
- .sops.yamlãã¡ã€ã«ã®ååž°çæ€çŽ¢ã䜿çšããŠãç§å¯ãã¡ã€ã«ãä¿åããããã«ãã£ã¬ã¯ããªããªãŒãããŒãã£ã·ã§ã³åå²ããŸãã
- æå·åããããã¡ã€ã«æ§é ããåã ã®èŠçŽ ãæœåºããŸãã
- ãã¡ã€ã«ã®äžéšã®æå·åã
ã·ã¹ãã ã¯CI / CDã®ãã¬ãŒã ã¯ãŒã¯å ã§æ©èœããGitãªããžããªã®ç¹å®ã®ãµããã£ã¬ã¯ããªãžã®éé¢ãããã¢ã¯ã»ã¹ãæã€è€æ°ã®éçºããŒã ã«ãµãŒãã¹ãæäŸããŸãã ç°ãªãKMSããŒãšPGPãã¹ã¿ãŒããŒãäºåãšããŠäœ¿çšããŠãç§å¯ãæå·åããŸãã
ã¿ã¹ã¯ã®å®è¡ãèªååããã³é«éåããããã«ãMakefileã¯å éšãã£ãŒããªããžããªã§äœ¿çšãããŸãã
ä»çµã¿
ãã«ã ã®ã€ã³ã¹ããŒã«
ãã«ã ãããžã§ã¯ãããŒãžã®æ瀺ã«åŸããŸã ã
helm-secretsãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«
helm plugin install https://github.com/futuresimple/helm-secrets
䜿çšäŸ
helm-secretsãªããžããªã¯ããã®ãã©ã°ã€ã³ã®äœ¿çšäŸãšããã«ã ãã£ãŒãå€ãä¿åããããã®å¯Ÿå¿ãããã£ã¬ã¯ããªæ§é ãæäŸããŸãã kubernetesãã£ãŒããåæ§ã®æ§é ãããŠããŸãã
ãã®äŸã§ã¯ãhelm-secretsãªããžããªãŒã®test.sh
ãã¡ã€ã«ã䜿çšãããŸãã
example/helm_vars/ âââ .sops.yaml âââ projectX â âââ .sops.yaml â âââ production â â âââ us-east-1 â â âââ java-app â â âââ secrets.yaml â â âââ value.yaml â âââ sandbox â âââ us-east-1 â âââ java-app â âââ secrets.yaml â âââ value.yaml âââ projectY â âââ .sops.yaml â âââ production â â âââ us-east-1 â â âââ java-app â â âââ secrets.yaml â â âââ value.yaml â âââ sandbox â âââ us-east-1 â âââ java-app â âââ secrets.yaml â âââ value.yaml âââ secrets.yaml âââ values.yaml
ãã®äŸãèŠãŠã¿ãŸãããã
- 2ã€ã®PGPããŒããããŸãïŒKMSããŒã䜿çšã§ããŸãïŒã
- projectxçšã
- ãããžã§ã¯ãã£çšã®å¥ã®ã
- ä»ã®ãã¹ãŠã®ç§å¯ã¯ãããžã§ã¯ãå ã§ç®¡çããããããžã§ã¯ãããšã«1ã€ã®ããŒã䜿çšãããŸãã
- ããŒã¯äºãã«åé¢ãããŠããããããã®ããŒã®ããããã«ãã£ãŠåŸ©å·åã§ããã®ã¯ãhelm_varsã®ã«ãŒãã«ããã°ããŒãã«secrets.yamlãã¡ã€ã«ã®ã¿ã§ãã
- æå·å/埩å·åã®å垰深床ã«ãŒã«ã¯ãã¹ãŠã.sops.yamlãã¡ã€ã«ã«ãããŸãã
æå·åã埩å·åãªã©
æå·ååã®äŸ/ helm_vars / secrets.yaml
global_secret: global_bar
æå·åïŒ
helm-wrapper secrets enc example/helm_vars/secrets.yaml
ãã®çµæãæå·åãããŠããªãããŒãšæå·åãããå€ãæã€ãã¡ã€ã«ãååŸããŸãã
ããŒãå«ãã»ã¯ã·ã§ã³ã®åŸã«ã¯ãç§å¯ã®æ§é ãæå·åãŸãã¯åŸ©å·åããããã«å¿ èŠãªsopsããŒã¿ããããŸãã
sopsããŒãžã§ã³ãlastmodifiedãŸãã¯unencrypted_suffixãªã©ã®ã¡ã¿ããŒã¿ããããŸãã Mozilla SOPSãããžã§ã¯ãã®Webãµã€ã㧠sopsãã¡ã€ã«åœ¢åŒã«ã€ããŠèªãããšãã§ããŸãã
global_secret: ENC[AES256_GCM,data:pTyPdC6YA+z84Q==,iv:aF5hb9CS8Au0B3RWADPtP8fXYzYakU7JJ8ZxzJgHRF0=,tag:c3pCyOf0NpQU7VPL/72XPg==,type:str] sops: .⊠âŠ. âŠ. unencrypted_suffix: _unencrypted version: 2.0.9
ä»åŸ©å·åïŒ
helm-wrapper secrets dec example/helm_vars/secrets.yaml
ãããŠçµæïŒ
global_secret: global_bar
ããã§ãããšãã°ãè€æ°ã®ç§å¯ãã¡ã€ã«ã§ããŒãæ€çŽ¢ããå Žåãªã©ã埩å·åããã«ãã®ãããªãã¡ã€ã«ãæäœã§ããŸãã git diff configã䜿çšããŠããããå³åº§ã«åŸ©å·åããããšãã§ããŸããããã«ãããç¹ã«ãã®æ©èœããµããŒãããŠããªãã¢ããªã±ãŒã·ã§ã³ãšæ¯èŒããŠãäœæ¥ãããã«å¿«é©ã«ãªããŸãã
ãŸããããé«åºŠãªAWS KMSã®ãããã§ãã·ãŒã¯ã¬ããã®ã¢ã¯ã»ã¹èš±å¯ãããæè»ã«ç®¡çã§ããŸãã
ããã«ãåçŽãªãã©ã°ã€ã³ã³ãã³ãã䜿çšããŠã·ãŒã¯ã¬ããã衚瀺ããã³ç·šéãããšãæ¯æ¥ã®äœæ¥ãç°¡åã«ãªããŸãã
helm-wrapper secrets view example/helm_vars/secrets.yaml
埩å·ååŸãç§å¯ãã¡ã€ã«ã¯æšæºåºåã«è¡šç€ºãããŸãã
helm-wrapper secrets edit example/helm_vars/secrets.yaml
edit
ã³ãã³ãã§ã埩å·åããããã¡ã€ã«ããšãã£ã¿ãŒã§éããå€æŽãæå·åããã圢åŒã§èªåçã«ä¿åãããŸãã
ãããã®æ©èœã¯ãã»ãšãã©ãã¹ãŠã®ã·ããªãªã§æå·åãããããŒã¿ã®åŠçãå€§å¹ ã«ä¿é²ããŸãã
ãã«ã ã®äŸ
Kubernetesã¯ã©ã¹ã¿ãŒã«äœãããããã€ããŸãããã
ããã»ã¹ãç°¡çŽ åããããéæã«ããããã«ããã«ã ã©ãããŒãäœæããŸããã ãã®ãã«ã çšã®bashã§äœæããããã€ã³ãã£ã³ã°ã¯ãæå®ããããã¹ãŠã®ã·ãŒã¯ã¬ãããèªåçã«åŸ©å·åãã埩å·åãããããŒã¿ã䜿çšããŠãã«ã ã䜿çšããå±éæé ãå®äºããŸãã ãšã©ãŒãçºçããå ŽåããŸãã¯æé ãæ£åžžã«å®äºããå Žåãã·ãŒã¯ã¬ãããå«ããã¹ãŠã®äžæããŒã¿ãåé€ãããŸãã
helloworldã®ãããªã¢ããªã±ãŒã·ã§ã³ã®å®éã®äŸïŒ
AWS_PROFILE=production helm-secrets upgrade --install --timeout 600 --wait helloworld stable/java-app --kube-context=production --namespace=projectx --set global.app_version=bff8fc4 -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/values.yaml -f helm_vars/secrets.yaml -f helm_vars/values.yaml >>>>>> Decrypt Decrypting helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml >>>>>> Decrypt Decrypting helm_vars/secrets.yaml Release "helloworld" has been upgraded. Happy Helming! LAST DEPLOYED: Fri May 5 13:27:01 2017 NAMESPACE: projectx STATUS: DEPLOYED RESOURCES: ==> extensions/v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE helloworld 3 3 3 2 1h ==> v1/Secret NAME TYPE DATA AGE helloworld Opaque 10 1h ==> v1/ConfigMap NAME DATA AGE helloworld 2 1h ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE helloworld 100.65.221.245 8080/TCP 1h NOTES: Deploy success helloworld-bff8fc4 in namespace projectx >>>>>> Cleanup helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml.dec helm_vars/secrets.yaml.dec
ãªã¹ããããããããã«ãCIåŽã§å®è¡ããŠã¢ããªã±ãŒã·ã§ã³ããããã€ããç¹å¥ãªããŒã ããããŸãã ãã®äŸã§ã¯ãJavaã¢ããªã±ãŒã·ã§ã³çšã®å éšãŠãããŒãµã«ãã£ãŒãã䜿çšããŸããããã«ã¯ãæ§æããããã·ãŒã¯ã¬ããããµãŒãã¹ãããã³ãããã€ã¡ã³ãã®ãã³ãã¬ãŒããå«ãŸããŠããŸãã
ããã¯ãã¹ãŠãhelmã³ãã³ãã®-fãªãã·ã§ã³ã䜿çšããŠæå®ããããã¡ã€ã«ã®å€ããçæãããŸãã æå·åãããã·ãŒã¯ã¬ããããã®ãããªãã¡ã€ã«ã§èŠã€ãã£ãå Žåãã¹ã¯ãªããã¯ãã®å Žã§æå·åã解é€ãããã«ã ã¯äœãèªèããŸããã
AWS KMSã䜿çšããå ŽåãAWS_PROFILEãšããååãæå®ããå¿ èŠããããŸãã
ãšã©ãŒãçºçããå Žåãã¯ãªãŒãã³ã°ãå®è¡ãããŸãã
AWS_PROFILE=production helm-wrapper upgrade --install --timeout 600 --wait helloworld stable/java-app --kube-context=wrongcontext --namespace=projectx --set global.app_version=bff8fc4 -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/values.yaml -f helm_vars/secrets.yaml -f helm_vars/values.yaml >>>>>> Decrypt Decrypting helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml >>>>>> Decrypt Decrypting helm_vars/secrets.yaml Error: could not get kubernetes config for context 'wrongcontext': context "wrongcontext" does not exist >>>>>> Cleanup helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml.dec helm_vars/secrets.yaml.dec
ãã®ã¢ãããŒãã¯ãç§å¯ãå®éã«äœ¿çšããå Žåãæé«ã¬ãã«ã®ã»ãã¥ãªãã£ãç¶æããªããåŽåãæå°éã«æããŸãã
gitã§å®å šã«äœ¿çšãã
ã·ãŒã¯ã¬ããã埩å·åããå ŽåïŒæåã§åŸ©å·åããå ŽåïŒããŸã 2ã€ã®ã¬ãã«ã®ã»ãã¥ãªãã£ããããŸãïŒ.gitignoreã䜿çšãã埩å·åãã¡ã€ã«ã®é€å€ãšãã³ããããã¡ã€ã«ãSOPSã䜿çšããŠæå·åãããŠãããã©ããã確èªããããã¯ã®è¿œå
ããã¯ãã¹ãŠããã«ã ã·ãŒã¯ã¬ããããã¥ã¡ã³ãã«ãå«ãŸããŠãããCI / CDããã»ã¹ã«ãã£ãŠæ€èšŒãããŸãã
ãããã«
Helm-secretsã¯ãSOPSããã¯ãšã³ãã®åãªãã©ãããŒã§ããããã®ãã©ã°ã€ã³ã®ã³ãã³ãã¯ä»ã®ããŒã«ã«çœ®ãæããããšãã§ããŸãã
ãŸãããã®ãã©ã°ã€ã³ã䜿çšããŠãå ¬égitãªããžããªãä»ããŠã·ãŒã¯ã¬ãããé åžããKubernetesã«çµ±åãããVaultingãµãŒãã¹ãã·ãŒã¯ã¬ããã®åŠçããã»ã¹ã«è¿œå ããŠããœãªã¥ãŒã·ã§ã³ãå®æãããŸãã
å°èŠæš¡ãªã€ã³ãã©ã¹ãã©ã¯ãã£ã®å Žåãhelm-secretsãã©ã°ã€ã³ã§ååã§ãã ãã²ã楜ãã¿ãã ããã
ãããžã§ã¯ãã«æ©èœãè¿œå ããããåã«è°è«ããå Žåã¯ã httpsïŒ//github.com/futuresimple/helm-secretsã«ã¢ã¯ã»ã¹ããŠãã ãã ã
åç §ïŒ
- åæïŒ HELM SECRETS-A MISSING PIECE IN KUBERNETES ã