Dailymotion ã§ã® Kubernetes ã®äœ¿çšæ¹æ³: ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã¡ã³ã
ç§ãã¡ Dailymotion 㯠3 幎åã«éçšç°å¢ã§ Kubernetes ã®äœ¿çšãéå§ããŸããã ããããè€æ°ã®ã¯ã©ã¹ã¿ãŒã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããã®ã¯æ¥œããã®ã§ãããæ°å¹Žãç§ãã¡ã¯ããŒã«ãšã¯ãŒã¯ãããŒã®æ¹åã«åªããŠããŸããã
ã©ãããå§ãŸã£ãã®ã§ãã
ããã§ã¯ãäžçäžã®è€æ°ã® Kubernetes ã¯ã©ã¹ã¿ãŒã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
è€æ°ã® Kubernetes ãªããžã§ã¯ããäžåºŠã«ãããã€ããã«ã¯ã次ã䜿çšããŸãã
ãŸããHelm äžã«å°ã㪠Python ã¹ã¯ãªãããäœæããŠããã§ãã¯ãå®è¡ããã°ã©ããäœæããã·ãŒã¯ã¬ãããè¿œå ããã¢ããªã±ãŒã·ã§ã³ããããã€ããŸããã ããããã¹ãŠã®ã¿ã¹ã¯ã¯ãDocker ã€ã¡ãŒãžã䜿çšããŠäžå€®ã® CI ãã©ãããã©ãŒã ã§å®è¡ãããŸãã
æ¬é¡ã«å ¥ããŸãããã
泚èšã ãããèªãã§ããæç¹ã§ãHelm 3 ã®æåã®ãªãªãŒã¹åè£ã¯ãã§ã«çºè¡šãããŠããŸãã ã¡ã€ã³ ããŒãžã§ã³ã«ã¯ãéå»ã«çºçããåé¡ã®ããã€ãã«å¯ŸåŠããããã®å€æ°ã®æ¹åãå«ãŸããŠããŸãã
ãã£ãŒãéçºã¯ãŒã¯ãããŒ
ç§ãã¡ã¯ã¢ããªã±ãŒã·ã§ã³ã«åå²ã䜿çšããŠããŸãããåãã¢ãããŒãããã£ãŒãã«ãé©çšããããšã«ããŸããã
- æ¯åº devã® éçºã¯ã©ã¹ã¿ãŒã§ãã¹ãããããã£ãŒããäœæããããã«äœ¿çšãããŸãã
- ãã«ãªã¯ãšã¹ããéä¿¡ããããšã ãã¹ã¿ãŒãã¹ããŒãžã³ã°ã§ãã§ãã¯ãããŸãã
- æåŸã«ããã« ãªã¯ãšã¹ããäœæããŠãã©ã³ãã«å€æŽãã³ãããããŸãã çªã ãããŠããããæ¬çªç°å¢ã«é©çšããŸãã
åç°å¢ã«ã¯ãã£ãŒããä¿åããç¬èªã®ãã©ã€ããŒã ãªããžããªãããã
ããŸããŸãªç°å¢ã®ã°ã©ã ãªããžããª
éçºè ã dev ãã©ã³ããããã·ã¥ãããšããã£ãŒãã®ããŒãžã§ã³ãèªåçã« dev Chartmuseum ã«ããã·ã¥ãããããšã«æ³šæããŠãã ããã ãããã£ãŠããã¹ãŠã®éçºè ãåãéçºãªããžããªã䜿çšãããããä»ã®äººã®å€æŽã誀ã£ãŠäœ¿çšããªãããã«ããã£ãŒãã®ããŒãžã§ã³ãæ éã«æå®ããå¿ èŠããããŸãã
ããã«ãç§ãã¡ã®å°ã㪠Python ã¹ã¯ãªããã¯ã次ã䜿çšã㊠Kubernetes OpenAPI ä»æ§ã«å¯Ÿã㊠Kubernetes ãªããžã§ã¯ããæ€èšŒããŸãã
ãã£ãŒãéçºã¯ãŒã¯ãããŒã®äžè¬çãªèª¬æ
- ä»æ§ã«åŸã£ãŠãã€ãã©ã€ã³ã¿ã¹ã¯ãèšå®ãã
ã¬ãºãªãª å質管ç (lintãåäœãã¹ã) çšã - ã¢ããªã±ãŒã·ã§ã³ããããã€ãã Python ããŒã«ã䜿çšã㊠Docker ã€ã¡ãŒãžãããã·ã¥ããŸãã
- ãã©ã³ãåã«ããç°å¢ã®ã»ããã¢ããã
- Kubeval ã䜿çšãã Kubernetes yaml ãã¡ã€ã«ã®æ€èšŒã
- ãã£ãŒããšãã®èŠªãã£ãŒã (å€æŽããããã£ãŒãã«äŸåãããã£ãŒã) ã®ããŒãžã§ã³ãèªåçã«äžããŸãã
- ç°å¢ã«äžèŽãããã£ãŒããã¥ãŒãžã¢ã ã«ãã£ãŒããéä¿¡ãã
ã¯ã©ã¹ã¿ãŒéã®å·®ç°ã®ç®¡ç
ã¯ã©ã¹ã¿ãŒã®é£å
䜿ã£ãŠããææããããŸãã
ãã®åé¡ã解決ããããã«ãã¯ã©ã¹ã¿ãŒãåå¥ã«ç®¡çããããã«ãªããããã»ã¹ãå€§å¹ ã«ç°¡çŽ åãããŸãã (ãã§ãã¬ãŒã·ã§ã³ã®æåã®ããŒãžã§ã³ã䜿çšããŸããããXNUMX çªç®ã®ããŒãžã§ã³ã§ã¯äœããå€æŽãããŠããå¯èœæ§ããããŸã)ã
å°ççã«åæ£ããããã©ãããã©ãŒã
åœç€Ÿã®ãã©ãããã©ãŒã ã¯çŸåšã6 ã€ã®ãªãŒãžã§ã³ (ããŒã«ã«ã« 3 ã€ãã¯ã©ãŠãã« 3 ã€) ã«åæ£ãããŠããŸãã
ã°ããŒãã« Helm å€
4 ã€ã®ã°ããŒãã« Helm å€ã«ãããã¯ã©ã¹ã¿ãŒéã®éããèå¥ã§ããŸãã ãã¹ãŠã®ãã£ãŒãã«ã¯ããã©ã«ãã®æå°å€ããããŸãã
global:
cloud: True
env: staging
region: us-central1
clusterName: staging-us-central1
ã°ããŒãã«ãªäŸ¡å€èŠ³
ãããã®å€ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ããå®çŸ©ããã®ã«åœ¹ç«ã¡ãç£èŠããã¬ãŒã¹ããã®ã³ã°ãå€éšåŒã³åºããã¹ã±ãŒãªã³ã°ãªã©ã®ããŸããŸãªç®çã«äœ¿çšãããŸãã
- ãã¯ã©ãŠãã: ãã€ããªãã Kubernetes ãã©ãããã©ãŒã ããããŸãã ããšãã°ãåœç€Ÿã® API 㯠GCP ãŸãŒã³ãšããŒã¿ã»ã³ã¿ãŒã«ãããã€ãããŠããŸãã
- ãenvã: éæ¬çªç°å¢ã§ã¯äžéšã®å€ãå€æŽãããå¯èœæ§ããããŸãã ããšãã°ããªãœãŒã¹å®çŸ©ãèªåã¹ã±ãŒãªã³ã°æ§æãªã©ã§ãã
- ãregionã: ãã®æ å ±ã¯ã¯ã©ã¹ã¿ãŒã®å Žæãç¹å®ããã®ã«åœ¹ç«ã¡ãå€éšãµãŒãã¹ã®è¿ãã®ãšã³ããã€ã³ããç¹å®ããããã«äœ¿çšã§ããŸãã
- "clusterName": åã ã®ã¯ã©ã¹ã¿ãŒã®å€ãå®çŸ©ããå Žåã
å ·äœçãªäŸã次ã«ç€ºããŸãã
{{/* Returns Horizontal Pod Autoscaler replicas for GraphQL*/}}
{{- define "graphql.hpaReplicas" -}}
{{- if eq .Values.global.env "prod" }}
{{- if eq .Values.global.region "europe-west1" }}
minReplicas: 40
{{- else }}
minReplicas: 150
{{- end }}
maxReplicas: 1400
{{- else }}
minReplicas: 4
maxReplicas: 20
{{- end }}
{{- end -}}
Helm ãã³ãã¬ãŒãã®äŸ
ãã®ããžãã¯ã¯ãKubernetes YAML ã®ç ©éããé¿ããããã«ãã«ã㌠ãã³ãã¬ãŒãã§å®çŸ©ãããŠããŸãã
ç³è«ã®ãç¥ãã
åœç€Ÿã®å±éããŒã«ã¯è€æ°ã® YAML ãã¡ã€ã«ã«åºã¥ããŠããŸãã 以äžã¯ãã¯ã©ã¹ã¿ãŒå ã§ãµãŒãã¹ãšãã®ã¹ã±ãŒãªã³ã° ããããž (ã¬ããªã«ã®æ°) ã宣èšããæ¹æ³ã®äŸã§ãã
releases:
- foo.world
foo.world: # Release name
services: # List of dailymotion's apps/projects
foobar:
chart_name: foo-foobar
repo: [email protected]:dailymotion/foobar
contexts:
prod-europe-west1:
deployments:
- name: foo-bar-baz
replicas: 18
- name: another-deployment
replicas: 3
ãµãŒãã¹å®çŸ©
ããã¯ãå±éã¯ãŒã¯ãããŒãå®çŸ©ãããã¹ãŠã®æé ã®æŠèŠã§ãã æåŸã®ã¹ãããã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®ã¯ãŒã«ãŒ ã¯ã©ã¹ã¿ãŒã«åæã«ãããã€ããŸãã
ç§å¯ã«ã€ããŠã¯ã©ãã§ããïŒ
ã»ãã¥ãªãã£ã«é¢ããŠã¯ãããŸããŸãªå Žæãããã¹ãŠã®ç§å¯ã远跡ããç¬èªã®ä¿ç®¡åº«ã«ä¿ç®¡ããŸãã
åœç€Ÿã®ãããã€ã¡ã³ã ããŒã«ã¯ãVault ããã·ãŒã¯ã¬ããå€ãæœåºãããããã€ã¡ã³ãææãæ¥ããšããããã Helm ã«æ¿å ¥ããŸãã
ãããè¡ãããã«ãVault å ã®ã·ãŒã¯ã¬ãããšã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªã·ãŒã¯ã¬ããã®éã®ãããã³ã°ãå®çŸ©ããŸããã
secrets:
- secret_id: "stack1-app1-password"
contexts:
- name: "default"
vaultPath: "/kv/dev/stack1/app1/test"
vaultKey: "password"
- name: "cluster1"
vaultPath: "/kv/dev/stack1/app1/test"
vaultKey: "password"
- Vault ã«ã·ãŒã¯ã¬ãããèšé²ãããšãã«åŸãã¹ãäžè¬çãªã«ãŒã«ãå®çŸ©ããŸããã
- ã·ãŒã¯ã¬ãããåœãŠã¯ãŸãå Žå ç¹å®ã®ã³ã³ããã¹ããŸãã¯ã¯ã©ã¹ã¿ãŒãžã®ãç¹å®ã®ãšã³ããªãè¿œå ããå¿ èŠããããŸãã (ããã§ã¯ãã³ã³ããã¹ãcluster1ã«ã·ãŒã¯ã¬ããstack-app1-passwordã®ç¬èªã®å€ããããŸã)ã
- ãã以å€ã®å Žåã¯å€ã䜿çšãããŸã ããã©ã«ãã§.
- ãã®ãªã¹ãã®åé ç®ã«ã€ããŠã Kubernetesã®ç§å¯ ããŒãšå€ã®ãã¢ãæ¿å ¥ãããŸãã ãããã£ãŠããã£ãŒãã®ã·ãŒã¯ã¬ãã ãã³ãã¬ãŒãã¯éåžžã«ã·ã³ãã«ã§ãã
apiVersion: v1
data:
{{- range $key,$value := .Values.secrets }}
{{ $key }}: {{ $value | b64enc | quote }}
{{ end }}
kind: Secret
metadata:
name: "{{ .Chart.Name }}"
labels:
chartVersion: "{{ .Chart.Version }}"
tillerVersion: "{{ .Capabilities.TillerVersion.SemVer }}"
type: Opaque
課é¡ãšå¶é
è€æ°ã®ãªããžããªã®æäœ
çŸåšããã£ãŒããšã¢ããªã±ãŒã·ã§ã³ã®éçºãåé¢ããŠããŸãã ããã¯ãéçºè ã 2 ã€ã® git ãªããžããªã§äœæ¥ããå¿ èŠãããããšãæå³ããŸãã2 ã€ã¯ã¢ããªã±ãŒã·ã§ã³çšã§ããã XNUMX ã€ã¯ã¢ããªã±ãŒã·ã§ã³ã® Kubernetes ãžã®ãããã€ã¡ã³ããå®çŸ©ããããã§ãã XNUMX ã€ã® git ãªããžããªã¯ XNUMX ã€ã®ã¯ãŒã¯ãããŒãæå³ãããããåå¿è ã¯æ··ä¹±ããããã§ãã
äžè¬åãããã°ã©ãã®ç®¡çã¯é¢åã§ã
ãã§ã«è¿°ã¹ãããã«ãæ±çšãã£ãŒãã¯äŸåé¢ä¿ãç¹å®ããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãè¿
éã«ãããã€ããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã ããããç§ãã¡ã¯äœ¿çšããŸã --reuse-values
ãã®äžè¬åããããã£ãŒãã®äžéšã§ããã¢ããªã±ãŒã·ã§ã³ããããã€ãããã³ã«ãã¹ãŠã®å€ãæž¡ãããšãé¿ããããã§ãã
ç¶ç¶çããªããªãŒ ã¯ãŒã¯ãããŒã§ã¯ãå®æçã«å€æŽãããå€ã¯ãã¬ããªã«ã®æ°ãšã€ã¡ãŒãž ã¿ã° (ããŒãžã§ã³) ã® XNUMX ã€ã ãã§ãã ãã®ä»ãããå®å®ããå€ã¯æåã§å€æŽããŸãããããã¯ããªãå°é£ã§ãã ããã«ãç§ãã¡èªèº«ã®çµéšãããããããã«ãäžè¬åããããã£ãŒãã®å±éã«ãã㊠XNUMX ã€ã®ééããé倧ãªå€±æã«ã€ãªããå¯èœæ§ããããŸãã
è€æ°ã®èšå®ãã¡ã€ã«ã®æŽæ°
éçºè ãæ°ããã¢ããªã±ãŒã·ã§ã³ãè¿œå ããå Žåãã¢ããªã±ãŒã·ã§ã³ã®å®£èšãã·ãŒã¯ã¬ããã®ãªã¹ããäžè¬åããããã£ãŒãã«ã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠããå Žåã¯äŸåé¢ä¿ãšããŠã¢ããªã±ãŒã·ã§ã³ãè¿œå ãããªã©ãããã€ãã®ãã¡ã€ã«ãå€æŽããå¿ èŠããããŸãã
Jenkins æš©éã Vault ã§æ¡åŒµãããããŠããŸã
ä»ã§ã¯ XNUMX ã€ãããŸã
ããŒã«ããã¯ããã»ã¹ã¯èªååãããŠããŸãã
ããŒã«ããã¯ããã«ã¯ãè€æ°ã®ã¯ã©ã¹ã¿ãŒã§ã³ãã³ããå®è¡ããå¿ èŠããããŸãããããã«ã¯ãšã©ãŒãå€ãçºçããŸãã æ£ããããŒãžã§ã³ ID ãæå®ãããŠããããšã確èªããããã«ããã®æäœãæåã§å®è¡ããŸãã
GitOps ã«åããŠç§»è¡äž
ç§ãã¡ã®ç®ç
ãã£ãŒããããããã€ãããŠããã¢ããªã±ãŒã·ã§ã³ã®ãªããžããªã«è¿ããããšèããŠããŸãã
ã¯ãŒã¯ãããŒã¯éçºæãšåãã«ãªããŸãã ããšãã°ããã©ã³ãããã¹ã¿ãŒã«ããã·ã¥ããããšããããã€ã¡ã³ããèªåçã«ããªã¬ãŒãããŸãã ãã®ã¢ãããŒããšçŸåšã®ã¯ãŒã¯ãããŒã®äž»ãªéãã¯æ¬¡ã®ãšããã§ãã ãã¹ãŠã¯ git ã§ç®¡çãããŸã (ã¢ããªã±ãŒã·ã§ã³èªäœãšãããã Kubernetes ã«ãããã€ãããæ¹æ³)ã
ããã€ãã®å©ç¹ããããŸãã
- å€ãã® ããæ確㪠éçºè ã«ãšã£ãŠã ããŒã«ã« ãã£ãŒãã«å€æŽãé©çšããæ¹æ³ãåŠã¶æ¹ãç°¡åã§ãã
- ãµãŒãã¹ãããã€ã¡ã³ãå®çŸ©ãæå®ã§ããŸã ã³ãŒããšåãå Žæ ãµãŒãã¹ã
- äžè¬åãããã°ã©ãã®åé€ã®ç®¡çã ãã®ãµãŒãã¹ã«ã¯ç¬èªã® Helm ãªãªãŒã¹ãååšããŸãã ããã«ãããä»ã®ãµãŒãã¹ã«åœ±é¿ãäžããªãããã«ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã« (ããŒã«ããã¯ãã¢ããã°ã¬ãŒã) ãæå°ã¬ãã«ã§ç®¡çã§ããããã«ãªããŸãã
- git ã®å©ç¹ ãã£ãŒã管ççš: å€æŽã®åãæ¶ããç£æ»ãã°ãªã©ããã£ãŒããžã®å€æŽãåãæ¶ãå¿ èŠãããå Žåã¯ãgit ã䜿çšããŠãããè¡ãããšãã§ããŸãã ãããã€ã¡ã³ãã¯èªåçã«éå§ãããŸãã
- 次ã®ãããªããŒã«ã䜿çšããŠéçºã¯ãŒã¯ãããŒãæ¹åããããšãæ€èšããŠãã ããã è¶³å Žã䜿çšãããšãéçºè ã¯éçšç°å¢ã«è¿ãã³ã³ããã¹ãã§å€æŽããã¹ãã§ããŸãã
XNUMX 段éã®ç§»è¡
åœç€Ÿã®éçºè
ã¯ãã®ã¯ãŒã¯ãããŒã 2 幎é䜿çšããŠããããã移è¡ãã§ããã ãç°¡åã«ããããšèããŠããŸãã ããã§ããŽãŒã«ã«åããéäžã«äžéã¹ããããè¿œå ããããšã«ããŸããã
æåã®æ®µéã¯åçŽã§ãã
- ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã¡ã³ããèšå®ããããã«åæ§ã®æ§é ãç¶æããŸãããDailymotionRelease ãšããåäžã®ãªããžã§ã¯ãå ã«ãããŸãã
apiVersion: "v1"
kind: "DailymotionRelease"
metadata:
name: "app1.ns1"
environment: "dev"
branch: "mybranch"
spec:
slack_channel: "#admin"
chart_name: "app1"
scaling:
- context: "dev-us-central1-0"
replicas:
- name: "hermes"
count: 2
- context: "dev-europe-west1-0"
replicas:
- name: "app1-deploy"
count: 2
secrets:
- secret_id: "app1"
contexts:
- name: "default"
vaultPath: "/kv/dev/ns1/app1/test"
vaultKey: "password"
- name: "dev-europe-west1-0"
vaultPath: "/kv/dev/ns1/app1/test"
vaultKey: "password"
- ã¢ããªã±ãŒã·ã§ã³ããšã« 1 ã€ã®ãªãªãŒã¹ (äžè¬åããããã£ãŒããªã)ã
- ã¢ããªã±ãŒã·ã§ã³ã® git ãªããžããªå ã®ã°ã©ãã
ãã¹ãŠã®éçºè
ãšè©±ãåããè¡ã£ãã®ã§ã移è¡ããã»ã¹ã¯ãã§ã«å§ãŸã£ãŠããŸãã æåã®ã¹ããŒãžã¯åŒãç¶ã CI ãã©ãããã©ãŒã ã䜿çšããŠå¶åŸ¡ãããŸãã ãã§ãŒãº XNUMX: GitOps ã¯ãŒã¯ãããŒã«ã©ã®ããã«ç§»è¡ãããã«ã€ããŠã¯ãããã«å¥ã®èšäºãæžãäºå®ã§ãã
ããã§ã¯ãGitOps ã¢ãããŒãã«ã€ããŠã®èå¯ã«ã€ãªãããéå»æ°å¹Žéã®ã¢ããªã±ãŒã·ã§ã³ ãããã€ã¡ã³ã ã¯ãŒã¯ãããŒã®é²æ©ã«ã€ããŠèª¬æããããšããŸããã ãŸã ç®æšã«ã¯å°éããŠããããçµæã«ã€ããŠã¯ä»åŸå ±åããŸããããã¹ãŠãç°¡çŽ åããéçºè ã®ç¿æ £ã«è¿ã¥ãããšãã決æããããšããä»ã§ã¯æ£ããããšããããšç¢ºä¿¡ããŠããŸãã
åºæïŒ habr.com