Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Docker Compose利用者から見た Kubernetes 開発環境構築入門 / int...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kou
September 15, 2018
Programming
11k
19
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Docker Compose利用者から見た Kubernetes 開発環境構築入門 / introduction to kubernetes for docker compose user
Kou
September 15, 2018
More Decks by Kou
See All by Kou
デザインを見ながらフロントエンドコーディングをするときの考え方 / design-coding
kkoudev
2
1.7k
React Nativeで作るiOSアプリケーションの環境構築設計 / react native env for ios
kkoudev
1
2.5k
フロントエンドコーディングにおけるPageSpeed Insights対策 / frontend pagespeed insights-
kkoudev
7
7.2k
フロントエンドデザイン・開発におけるマークアップ設計の基礎 / frontend markup design basics
kkoudev
4
2.9k
Dockerを利用したローカル環境から本番環境までの構築設計 / Project structure design for docker application
kkoudev
0
360
Other Decks in Programming
See All in Programming
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
510
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
160
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
330
OSもどきOS
arkw
0
560
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
170
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
680
Lessons from Spec-Driven Development
simas
PRO
0
190
ふつうのFeature Flag実践入門
irof
7
3.9k
AIで効率化できた業務・日常
ochtum
0
130
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
250
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
The Curious Case for Waylosing
cassininazir
1
390
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
How STYLIGHT went responsive
nonsquared
100
6.2k
We Are The Robots
honzajavorek
0
250
Transcript
Docker Composeར༻ऀ ͔ΒݟͨKubernetes ։ൃڥߏஙೖ WEBΤϯδχΞษڧձ #09 Koichi Nagaoka
ࣗݾհ Ԭ ߒҰ (@kkoudev) גࣜձࣾϛΫγΟͰΤϯδχΞͬͯ·͢ɻ ͖ͳΤσΟλVSCode
ࠓճͷςʔϚͰ͋Δ Kubernetesͷલʹ… Dockerʹ͍ͭͯ
DockerΛ͍࢝ΊͯɺDocker ComposeʹΑΔӡ༻Λ͋Δఔ ߦ͍ͬͯΔͱɺ͍͔ͭ͘ ͕ݟ͖͑ͯ·͢ɻ
Docker ComposeͷΈͷӡ༻ʹΑΔ ओͳ ϗετΛԽ͢Δʹ͋ͨͬͯͦ͜ ·Ͱ͘͠ͳ͍͕ɺϗετ͝ͱʹΞ ϓϦέʔγϣϯΛσϓϩΠͨ͠Γɺσ ϓϩΠ࣌ʹϩʔυόϥϯαʔ͔Βͷ Γ͠Λߦ͏ͳͲΛࣗ࡞͢Δඞཁ͕ग़ ͯ͘Δɻ 1.
ϗετͷԽ ྫ͑σϓϩΠʹࣦഊͯ͠ଈΓ͠ Λ͍ͨ͠ͱ͍ͬͨέʔεʹ͓͍ͯɺ Docker Compose୯ମͰಛผͳػೳ͕ ఏڙ͞Ε͍ͯΔΘ͚Ͱͳ͍ͷͰࣗ ͰͦͷΛ࡞Δඞཁ͕͋Δɻ (Ϗϧυͨ͠Πϝʔδͷλάཧɺλά Λࢦఆͯ͠ͷσϓϩΠͳͲ) 2. ίϯςφͷόʔδϣϯཧ ίϯςφͷࢮ׆ࢹো࣌ͷ෮چʹ ͍ͭͯखಈͩͬͨΓࣗ࡞͢Δ෦͕ ଟ͍ɻ 3. ࢮ׆ࢹো͔Βͷ෮چ
Docker ComposeΛ͏͜ͱͰϗε τͷҧ͍ʹΑΔڥࠩҟ໘ͳη οτΞοϓΛ΄΅ແ͘͢͜ͱ͕ग़དྷ ΔΑ͏ʹͳ͕ͬͨɺϗετؒͷ࿈ ܞߏ࣌ͷӡ༻ͳͲɺΠϯϑ ϥཁૉ͕ؔ࿈͢Δ෦ʹ͍ͭͯࣗ ࡞෦͕ଟͯ͘ख͕͔͔ؒΔ
ͦ͜ͰKubernetes
Kubernetesͱ DockerίϯςφͷΫϥελཧΛ࢝Ίͱ͠ ͨΦʔέετϨʔγϣϯΛߦ͏αʔϏεͰ ͢ɻϗετؒͷ࿈ܞσϓϩΠʹ͍ͭͯ૯ ׅతʹཧͰ͖ΔΑ͏ʹͳΓ·͢ɻ (໊শ͕͍ͷͰ k8s ͱུ͞Ε·͢) ※DockerެࣜͷΦʔέετϨʔγϣϯπʔϧͱͯ͠ Docker
Swarmͱ͍͏ͷ͋Γ·͕͢ɺk8s͕ੈͷதతʹ ΄΅σϑΝΫτελϯμʔυͱͳ͍ͬͯ·͢
ࠓ͓͢Δ͜ͱ • Kubernetesͷ֓೦ͱ֤Ϧιʔεͷׂʹ͍ͭͯ • KubernetesΛͬͨ։ൃڥͷγεςϜߏஙखॱ • Docker Compose͔ΒͷҠߦํ๏ • Kubernetesͷྑ͍ϙΠϯτͱগ͠ਏ͍ϙΠϯτ
Kubernetesͷ֓೦ͱ Ϧιʔεʹ͍ͭͯ
KubernetesͷϦιʔεͱ KubernetesෳͷϦιʔεͱݺΕΔ୯Ґ͕ڠ ௐ͠߹͏͜ͱͰߏ͞Ε͍ͯ·͢ɻΈΛཧղ ͢Δ্Ͱ·ͣϦιʔεʹ͍ͭͯཧղ͢Δඞཁ ͕͋Γ·͢ɻ
Nodeʹ͍ͭͯ • NodeͱDockerϗετΛࢦ͢Ϧιʔε • ཁ͢Δʹίϯςφ͕ಈ࡞͢Δαʔόͷ͜ͱΛࢦ͢ɻϩʔΧϧڥ Ͱ͋ΕɺNodeৗʹ1ͭͱͳΔ • NodeʹKubernetesΫϥελͷશNodeΛཧ͢ΔMaster (Master Node)ͱɺͦΕҎ֎ͷ֤ϦιʔεΛಈ͔͢Node
(Worker Node)ʹ͔ΕΔ
NodeͷΠϝʔδ
Podʹ͍ͭͯ • PodͱNodeʹஔ͢ΔίϯςφΛಈ͔ͨ͢ΊͷϦιʔεɻؔ ࿈ੑͷ͋ΔDockerίϯςφͷू·ΓΛ1ͭͱͨ͠୯ҐͱͳΔ • ྫ͑NginxΛϑϩϯταʔόͱͨ͠RubyΞϓϦέʔγϣϯ͕͋ Δ߹ɺNginxͷίϯςφͱRubyΞϓϦέʔγϣϯͷίϯςφΛ1 ͭͷ·ͱ·Γͱ͍ͨ͠߹͕͋ΔɻͦͷΑ͏ͳ߹ɺ1ͭͷPodͱ ͯ͠ߏ͢Δ
PodͷΠϝʔδ
PodͱReplicaSetʹ͍ͭͯ • PodReplicaSetͱ͍͏ϦιʔεͰରPodͷΫϥελશମʹ͓͚ ΔෳΛఆ͓ٛͯ͘͜͠ͱ͕Ͱ͖Δ • PodͷෳΛࢦఆ͓ͯ͘͜͠ͱͰɺPod͕ԿΒ͔ͷཧ༝Ͱڧ੍ऴ ྃͨ͠߹ͰෳΛҡ࣋͢ΔͨΊʹηϧϑώʔϦϯάΛߦ͏ ͜ͱ͕ՄೳʹͳΔ
PodͱReplicaSetͷΠϝʔδ
ReplicaSetͱDeploymentʹ͍ͭͯ • ReplicaSetDeploymentͱ͍͏ϦιʔεͰཧ͞ΕΔ • ReplicaSetPodͷෳɾҡ࣋ͷͨΊͷཧΛ୲͍ͬͯΔ͕ɺ DeploymentReplicaSetͷ࡞ɾҡ࣋ͷͨΊͷཧΛ୲͍ͬͯΔ • DeploymentσϓϩΠ࣌ʹ৽͍༷͠ͷReplicaSetΛ࡞͠ɺچ ReplicaSet͕ཧ͍ͯ͠ΔچPodͱͷΛௐ͠ͳ͕Β৽PodΛ૿ ͍͖ͯ͠ɺ࠷ऴతʹReplicaSet͝ͱ৽͍༷͠ʹஔ͖͑ΔΑ
͏ʹͳ͍ͬͯΔɻ·ͨɺϦϏδϣϯཧ͓ͯ͠Γɺ৽όʔδϣ ϯʹ͕͋ͬͨࡍʹچόʔδϣϯ͢͜ͱՄೳͰ͋Δ
ReplicaSetͱDeploymentͷΠϝʔδ
Serviceʹ͍ͭͯ • ServiceͱPodͷΞΫηεܦ࿏Λఏڙ͢ΔϦιʔεͰ͋Δ • ओʹPodʹ͚ͭͨϥϕϧΛݩʹɺͲͷϥϕϧ͕͍ͭͨPodΞΫη ε͢Δ͔Λܾఆ͢Δ • Ϋϥελ෦ͷΈͰར༻Ͱ͖ΔService(ClusterIP)ɺΫϥελ֎ ෦͔ΒΞΫηεՄೳͳService(NodePort)ͳͲͷServiceΛ࡞͢Δ ͜ͱ͕ՄೳͰ͋Δ
• AWSΛ͍ͬͯΔ߹ɺLoad Balancerͱͯ͠CLBɾNLBΛׂΓ ͯΔ͜ͱՄೳ
ServiceͷΠϝʔδ
ͦͷଞϦιʔεʹ͍ͭͯ • ֓೦Λઆ໌͢Δ্ͰදతͳϦιʔεʹ͍ͭͯհ͠·ͨ͠ ͕ɺͦͷଞΑ͘͏Ϧιʔεʹ͍ͭͯհ͍ͯ͠·͢ɻ
Ingress Serviceͷ্ҐϦιʔεɻServiceOSIࢀরϞσϧͰ͍͏ͱ͜ΖͷL4·Ͱͷ ੍ޚ͔͠ग़དྷͳ͍(※)͕ɺIngressΛ͏͜ͱͰL7ϨϕϧͷύεϕʔεͷৼΓ͚ ϗετ໊ʹΑΔৼΓ͚ͳͲ͕ग़དྷΔΑ͏ʹͳΔɻ AWSͰ͍͏ͱ͜ΖͷALBͱࢥͬͯΒ͑ΕΑ͍͔ͱࢥ͍·͢ɻ (※কདྷతʹ L7 ·ͰServiceͰѻ͑ΔΑ͏ʹ͢Δ༧ఆ͕͋ΔΒ͍͠)
ConfigMap ڥมͷΑ͏ͳઃఆɺ·ͨઃఆϑΝΠϧใͦͷͷΛ ཧ͢ΔͨΊͷϦιʔεɻKey-ValueܗࣜͰఆٛ͞ΕΔɻ Secret ઃఆͷதͰύεϫʔυͷΑ͏ͳൿಗใΛѻ͏ࡍʹར༻͢Δɻ ઃఆϑΝΠϧ্Base64ܗࣜͱͯ͠Λอ࣋͢Δͱ͍͏Ҏ֎ ConfigMapͱ΄΅มΘΒͳ͍ɻ
PersistentVolume ϘϦϡʔϜྖҬΛఆٛ͢ΔϦιʔεɻ EBSNFSͷΑ͏ͳ֎෦ετϨʔδΛఆٛ͢Δ͜ͱՄೳ PersistentVolumeClaim ར༻͢ΔϘϦϡʔϜྖҬͷཁٻΛఆٛ͢ΔϦιʔεɻ PersistentVolumeͱPodΛඥ͚ΔͨΊʹར༻͢Δɻ
Docker Composeར༻࣌ಈ࡞ͤ͞Δίϯς φΛҙࣝ͢Δ͚ͩͰຆͲࣄΓ͍ͯ·͕ͨ͠ɺ KubernetesͰͦΕʹՃ͑ͯಈ࡞ͤ͞Δϗε τ(Node)ίϯςφͷάϧʔϓԽ(Pod)ɺͦͷ ෳ(ReplicaSet)ͱެ։(ServiceɺIngress)ͱ ͍ͬͨΠϯϑϥϨϕϧͰҙ͍ࣝͯͨ͜͠ͱશ ͯKubernetesͷઃఆͷ̍ͭͱͯ͠ཧग़དྷΔ Α͏ʹͳΓ·͢ɻ “
KubernetesΛͬͨ ։ൃڥͷߏங
ͦΕͰɺ࣮ࡍʹ։ൃڥΛߏங ͍͖ͯ͠·͢
ࠓճߏங͢ΔγεςϜͷΠϝʔδ ※WEBΤϯδχΞษڧձ #05 Ͱ Dockerʹ͍ͭͯൃදͨ͠ͱ͖ͱશ͘ಉ͡ߏ
ࠓճߏங͢ΔγεςϜͷ֓ཁ • NginxΛϑϩϯτΤϯυͱͨ͠DjangoΞϓϦέʔγϣϯ • RedisΛΩϟογϡαʔόͱͯ͠ར༻ • ఆظతʹεέδϡʔϦϯά͞Εͨόον͕ಈ࡞͢Δ • DBʹMySQLΛ༻
KubernetesͰڥΛߏங͢Δʹ • KubernetesͰDocker Composeಉ༷ʹYAMLܗࣜͷϑΝΠϧΛѻ ֤ͬͯϦιʔεͷઃఆΛهड़͢Δ͜ͱͰڥΛߏங͍͖ͯ͠· ͢ɻઃఆ༰͓͓ͬ͟ͺʹ࣍ͷΑ͏ͳϑΥʔϚοτʹͳͬͯ ͍·͢ • ϩʔΧϧڥͷߏஙʹ͍ͭͯҰੲલ minikube
Λͬͯߏங͠ ͍ͯ·͕ͨ͠ɺݱࡏ Docker for Mac/Win Ͱਖ਼ࣜαϙʔτ͞Ε ͍ͯ·͢ɻ(σϑΥϧτͰ༗ޮʹͳ͍ͬͯͳ͍ͷͰ༗ޮԽ͢Δඞཁ ͕͋Γ·͢)
ओͳKubernetesͷઃఆϑΝΠϧ߲ apiVersion: ϦιʔεͰར༻͢ΔAPIͷόʔδϣϯΛهࡌɻϦιʔε͝ͱʹҟͳΔ kind: ϦιʔεͷछผΛهड़ɻ (ex: Deployment, Service) metadata: Ϧιʔε༩Մೳͳϝλσʔλɻओʹ໊শϥϕϧΛ༩͢Δͷʹ༻
spec: Ϧιʔεݻ༗ͷઃఆΛهड़͢Δ data: ConfigMapSecretΛ࢝Ίͱͨ͠ઃఆσʔλΛهड़͢ΔϦιʔεͰར༻͞ΕΔ
1. DeploymentͷઃఆΛ࡞͢Δ
Deploymentͷઃఆ • NginxΛϑϩϯτͱͨ͠DjangoΞϓϦέʔγϣϯ ↑·ͣ͜ͷ෦͔Β࡞͠·͢
ConfigMapͷ४උ Docker Composeͷઃఆͱൺͯେ͖͘ҟͳΔͷ͕ nginx.conf ͷΑ ͏ͳઃఆϑΝΠϧͷѻ͍Ͱ͢ɻDocker Composeͷ߹ϗετଆͷ ಛఆͷσΟϨΫτϦʹઃఆϑΝΠϧΛஔ͠ɺͦΕΛίϯςφ Ϛϯτͯ͠ѻ͏ྫ͕ଟ͔͔ͬͨͱࢥ͍·͕͢ɺKubernetesͰ ClusterશମͰѻ͑ΔΑ͏ʹɺConfigMapͷϦιʔεͱͯ͠YAMLϑΝ
ΠϧʹઃఆϑΝΠϧͷ༰Λهड़͢Δํ๏ΛऔΓ·͢ɻ
1. ਤͷΑ͏ͳNginxͷઃఆϑΝΠϧΛஔ ͨ͠σΟϨΫτϦΛ༻ҙ͓ͯ͘͠ 2. nginxσΟϨΫτϦͷ1্ͭʹҠಈͯ͠Ҏ ԼͷίϚϯυͰConfigMapΛ࡞͢Δ kubectl create configmap nginx-config-common
-—from-file=nginx/etc/common ConfigMapͷ࡞ྫ 3. ͜ΕΛඞཁͳ͚ͩߦ͏ɻ※αϒσΟϨΫτϦ·Ͱ ݟͯ͘Εͳ͍ͷͰσΟϨΫτϦߏʹҙ
࡞ͨ͠ConfigMapͷ༰ΛkubectlͰ֬ೝ͢ΔͱҎԼͷΑ͏ʹͳ͍ͬͯΔ $ kubectl get configmap nginx-config-common -o yaml ——————————————————————— apiVersion:
v1 data: nginx.conf: | user daemon daemon; daemon off; error_log /var/opt/nginx/log/error.log; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 4000; use epoll; multi_accept on; } ɾɾɾɾ(͍ͷͰলུ) kind: ConfigMap metadata: creationTimestamp: 2018-09-12T12:47:51Z name: nginx-config-common namespace: default resourceVersion: "121247" selfLink: /api/v1/namespaces/default/configmaps/nginx-config-common uid: 0fae62dd-b68a-11e8-bbb2-025000000001
DeploymentͷઃఆΛهड़ ࡞ͨ͠ConfigMapΛNginxίϯςφͰಡΈࠐΉΑ͏ʹઃఆͯ͠Έ· ͢ɻ
࡞ͨ͠ConfigMapͷ༰ΛಡΈࠐΜͰ͍ΔDeploymentઃఆྫ apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas:
2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: library/nginx:latest ports: - containerPort: 8080 - containerPort: 8443 volumeMounts: - name: v-nginx-config mountPath: /etc/nginx volumes: - name: v-nginx-config-common configMap: name: nginx-config-common volumesʹ࡞ͨ͠ConfigMap໊Λࢦఆͯ͠ɺ ίϯςφͷvolumeMounts ͷઃఆͰ Ϛϯτ͍ͨ͠ύεΛهड़͢Δ
Deploymentͷઃఆͷهड़·ͱΊ Nginxͷઃఆྫ·Ͱհ͠·͕ͨ͠ɺಉ༷ʹDjangoΞϓϦέʔγϣ ϯͷઃఆʹ͍ͭͯίϯςφઃఆΛDeploymentՃ͢ΕOKͰ ͢ɻ͜͜ͰDjangoΞϓϦέʔγϣϯͷઃఆʹ͍ͭͯ·Ͱࡉ͔͘ ৮Ε·ͤΜ͕ɺConfigMapͷઃఆͱDeployment (Pod) ͷඥ͚ํ ๏ʹ͍ͭͯ͜ΕͰΠϝʔδ͕͍͔ͭͨͱࢥ͍·͢ɻ
Deploymentͷ࡞ ྫͱͯ͠ɺ࡞ͨ͠DeploymentͷઃఆΛ nginx-django- deployment.yaml ͱ͍͏ϑΝΠϧ໊Ͱอଘ͠·͢ɻ ͦͷޙɺҎԼͷίϚϯυͰ Deployment ͷ࡞Λߦ͍·͢ɻ kubectl apply
-f nginx-django-deployment.yaml kubectl create Ͱ࡞ՄೳͰ͕͢ɺapply࡞͓Αͼߋ৽ͷ྆ ํʹରԠ͍ͯ͠·͢ɻ(createطʹ࡞͞Ε͍ͯΔͱΤϥʔʹͳΔ) ͦͷͨΊɺσϓϩΠ࣌ͷมߋөͰ͜ͷίϚϯυΛར༻͢Δέʔ ε͕ଟ͍Ͱ͢ɻ
2. ServiceͱIngressͷ ઃఆΛ࡞͢Δ
Serviceͷઃఆ PodΞΫηεՄೳʹ͢ΔͨΊʹServiceΛఆٛͯ͠ɺެ։ϙʔτΛ هड़͠·͢ɻ
Serviceͷઃఆྫ kind: Service apiVersion: v1 metadata: name: nginx-service spec: type:
NodePort selector: app: nginx ports: - name: http protocol: TCP port: 8080 targetPort: 8080 - name: https protocol: TCP port: 8443 targetPort: 8443 selectorʹରPodͷϥϕϧʹఆٛͨ͠Λࢦ ఆͯ͠Serviceͱඥ͚Δ
IngressͷઃఆͱΠϯετʔϧ IngressΛ͑AWSͰ͋ΕALBΛׂΓͯΔ͜ͱՄೳͳͷͰ͢ ͕ɺएׯઃఆ͕໘ͳͷͰࠓճ Nginx Ingress Controller Λར༻͠· ͢ɻ(ALBͷׂΓͯʹ͍ͭͯؾʹͳΔํ alb-ingress-controller, kube-aws-ingress-controller
͋ͨΓΛௐͯΈ͍ͯͩ͘͞) Nginx Ingress Controllerʹ͍ͭͯ helm ͱ͍͏Kubernetesͷύοέ ʔδϚωʔδϟʔΛͬͯҎԼͷΑ͏ʹΠϯετʔϧ͠·͢ɻ helm install stable/nginx-ingress
Ingress (Nginx Ingress Controller)ͷઃఆྫ apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations:
kubernetes.io/ingress.class: nginx name: example-lb spec: rules: - host: www.example.com http: paths: - backend: serviceName: nginx-service servicePort: 8080 path: / tls: - hosts: - www.example.com secretName: example-tls selectorʹରPodͷϥϕϧʹఆٛͨ͠Λࢦ ఆͯ͠Serviceͱඥ͚ΔɻservicePortʹ serviceͰࢦఆ͞Εͨ port ·ͨ targetPort Λ ࢦఆ͢ΔɻHTTPSͷઃఆΛߦ͏߹ tls ͱ͍ ͏߲ʹূ໌ॻͷઃఆ͕ඞཁʹͳΓɺSecret ʹূ໌ॻΛొͯͦ͠ΕΛࢦఆ͢Δඞཁ͕͋Δɻ
ServiceͱIngressͷઃఆ·ͱΊ ServiceʹAWSͰCLBNLBΛׂΓͯΔ͜ͱ͕ՄೳͰ͕͢ɺ L7Ϩϕϧͷ੍ޚ͍ͨ͠ˍHTTP2ରԠͨ͠HTTPαʔόΛ͍͍ͨ ͱ͍͏έʔεʹ͓͍ͯIngressΛ͏͜ͱ͕͓͢͢ΊͰ͢ɻ ͳ͓ɺIngressͷIPΛRoute53ͳͲͷDNSొ͢ΔͨΊʹ external-dns ΛΠϯετʔϧˍઃఆ͢Δ͜ͱͰࣗಈԽՄೳͰ͢ɻ(ઃ ఆʹ͍ͭͯ͜͜Ͱհ͠·ͤΜͷͰɺڵຯͷ͋ΔํௐͯΈͯ ͍ͩ͘͞)
3. όονΛ࡞͢Δ
Kubernetesʹ͓͚Δόον KubernetesͰ Job ͱ͍͏ϦιʔεΛͬͯɺ୯ҰίϚϯυͷ࣮ߦΛ ߦ͏PodΛఆٛ͢Δ͜ͱ͕ՄೳͰ͢ɻྫ͑DBͷϚΠάϨʔγϣϯͷ Α͏ͳॲཧΛఆٛ͢Δͷʹ͍͍ͯ·͢ɻ ·ͨɺఆظతʹॲཧΛ܁Γฦ࣮͠ߦ͍ͨ͠߹ CronJob Ϧιʔε Λར༻͠·͢ɻ
Jobͷઃఆྫ apiVersion: batch/v1 kind: Job metadata: name: db-migrate spec: backoffLimit:
1 parallelism: 1 completions: 1 template: spec: containers: - name: job-sleep image: debian:stretch-slim command: ["migrate", "up"] restartPolicy: Never backoffLimitͷΛมߋ͢Δ͜ͱͰࣦഊ࣌ͷ࠶ ࢼߦճͳͲఆٛ͢Δ͜ͱͰ͖Δɻ restartPolicy͕Neverʹઃఆ͞Εͨδϣϒ͕Ұ ਖ਼ৗྃ͢Δͱɺdelete͞ΕΔ·Ͱ࠶࣮ߦ͞Ε Δ͜ͱͳ͘ͳΔɻ
CronJobͷઃఆྫ apiVersion: batch/v1beta1 kind: CronJob metadata: name: cron-job spec: schedule:
"*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: job-sleep image: debian:stretch-slim imagePullPolicy: Always command: ["echo", "test"] restartPolicy: Never scheduleʹcronܗࣜͰ࣮ߦ࣌ؒΛࢦఆ͢Δ͜ͱ ͕ग़དྷΔ
4. RedisͱDBΛ࡞͢Δ
Kubernetesʹ͓͚ΔΩϟογϡ ͱDBͷѻ͍ ϩʔΧϧ։ൃڥͰRedis/MySQLίϯςφΛಈ͔ͯ͠Α͍ͷͰ ͕͢ɺAWSΛར༻͍ͯ͠Δέʔεͩͱຊ൪ڥͰElastiCache RDSΛ͍ͨ͘ͳΔ͔ͱࢥ͍·͢ɻ͜ͷ߹ɺKubernetes୯ମ (kubectl)Ͱ؆୯ʹ੍ޚ͕Ͱ͖ͳ͍ͨΊɺଞͷϓϩϏδϣχϯάπʔ ϧͰ͋Δ kops Terraform
ΛΈ߹Θͤͯߏங͢Δ͜ͱʹͳΓ· ͢ɻ·ͨɺKubernetes on AWSͱͯ͠ EKS ͱ͍͏Ϛωʔδυαʔ Ϗε͋Γɺ20189݄ݱࡏ౦ژϦʔδϣϯͰ·ͩ͑·ͤΜ ͕ɺ౦ژϦʔδϣϯʹରԠͨ͠ࠒʹͪ͜ΒΛར༻͢Δͷྑ͍͔ͱ ࢥ͍·͢ɻ
Ҏ্Ͱߏங͢Δ্Ͱͷ͍͍ͩͨͷϙΠϯτΛ հ͍͖ͤͯͨͩ͞·ͨ͠ɻ KubernetesΦʔέετϨʔγϣϯπʔϧͱ ͍͏ಛੑ্ɺߟྀ͖͢ϙΠϯτઃఆ͕ଟ͍ ͨΊʹDocker Composeʹ׳ΕͨํͰ࠷ॳ ͱʹ͔͘ϋϚΔ͜ͱ͕ଟ͍Ͱ͕͢ɺ͍͜ͳ ͤΔΑ͏ʹͳΔͱແఀࢭσϓϩΠোൃੜ࣌ ͷΦʔτώʔϦϯά͕ൺֱత؆୯ʹߦ͑ΔΑ͏ ʹͳΔͨΊɺੋඇಋೖͯ͠ΈΔ͜ͱΛ͓͢͢Ί
͠·͢ɻ “
Docker Compose ͔ΒͷҠߦํ๏
Docker Compose͔ΒҠߦ͍ͨ͠ kompose ͱ͍͏πʔϧΛ͏͜ͱͰɺdocker-compose.yaml ͔Β Kubernetes ͷϦιʔεͱࣗಈมͯ͘͠Ε·͢ɻͨͩ͠Kubernetes ͱDocker ComposeͰϘϦϡʔϜͷѻ͍ํ͕ҟͳΔͨΊɺͦͷʹ ͍ͭͯগ͠ॻ͖͢ඞཁ͕͋Γ·͢ɻͦͷͨΊɺθϩ͔Βهड़͢Δ
ΑΓϚγ͘Β͍ͷೝࣝͰ͏ʹɺ݁ߏख͕ؒল͚ͯศརͳͷͰ ͓͢͢ΊͰ͢ɻ
kompose ࣮ߦྫ 1. HomebrewͰΠϯετʔϧ brew install kompose 2. ݩͱͳΔ docker-compose.yaml
Λࢦఆ͢Δ kompose convert -f docker-compose.yaml -o (ग़ྗઌσΟϨΫτϦ) volumeʹ͍ͭͯσϑΥϧτͩͱPersistentVolumeClaimม͞Ε·͕͢ɺ ͜Εʹ͍ͭͯ --volumes Φϓγϣϯʹͯ hostPath ͱͯ͠ίϯόʔτ͢Δ͜ͱՄ ೳͰ͢ɻDocker ComposeͰϗετྖҬΛϚϯτͯ͠ར༻͍ͯ͠Δέʔε͕ଟ͍ ͱࢥ͏ͷͰɺ࠷ॳ hostPath ࢦఆͰίϯόʔτ͢Δํ͕ྑ͍͔Ε·ͤΜɻ (ͪΖΜޙ͔Βॻ͖͢લఏʹͳΓ·͢)
Kubernetesͷྑ͍ͱ ͜Ζͱগ͠ਏ͍ͱ͜ Ζͷ·ͱΊ
Kubernetesͷྑ͍ͱ͜ΖͳΜͱ ͳ͘Θ͔͖͔ͬͯͨͱࢥ͍·͢ɻ࠷ ޙʹɺྑ͍ͱࢥͬͨϙΠϯτͱɺ· ͩ·ͩগʑਏ͍ϙΠϯτΛ·ͱΊͯ Έ·ͨ͠ͷͰհ͠·͢ɻ
Kubernetesͷྑ͍ϙΠϯτ
1. σϓϩΠ͕ൺֱత؆୯ kubectl apply ίϚϯυ͚ͩͰࠩݕͯ͠چ༷ͷPodͱ৽༷ͷPodͷೖΕସ͑Λ ߦ͑Δͱ͍͏ͷඇৗʹ؆୯Ͱ͢ɻ(ͪΖΜͦΕ͚ͩͰग़དྷͳ͍έʔε͋Γ· ͕͢) PodͷRollingUpdateͷઃఆΛҙࣝͯ͠ઃఆ͢Δ͜ͱͰແఀࢭσϓϩΠ͕؆ ୯ʹ࣮ݱͰ͖ΔͷΓڧ͘ɺKubernetesಋೖΛܾఆ͚ΔϙΠϯτͷ̍ͭʹͳ Δ͔ͱࢥ͍·͢ɻ
2. ΫϥελߏஙͷͨΊͷपลπʔϧ͕๛ kops kube-aws ͳͲɺΫϥελߏஙΛίϚϯυ࣮ߦ͢Δ͚ͩͰ؆୯ʹ༻ҙͯ͠ ͘ΕΔपลπʔϧ͕͋ΔͨΊɺҰ͔ΒVPCαϒωοτͷઃܭΛࡉ͔͘Terraformͳ ͲͰ࡞͍ͬͯ͘ඞཁগͳ͍Ͱ͢ɻ·ͨɺࡉ੍͔͍ޚΛ͍ͨ͠߹Ͱ kops ͕
TerraformͷtfϑΝΠϧΛग़ྗͰ͖ΔͷͰͦͷΑ͏ͳέʔεʹରԠ͕ग़དྷ·͢ɻ
Kubernetesͷਏ͍ϙΠϯτ
1. ൿಗใΛϦϙδτϦʹͦͷ··ίϛοτ͠ਏ͍ KubernetesͰSecretϦιʔεΛ͏͜ͱͰൿಗใΛѻ͍͘͢ͳΓ·͕͢ɺઃ ఆϑΝΠϧ্ΛBase64Τϯίʔυͯ͠ه͍ͯ͠Δ͚ͩʹա͗ͳ͍ͨΊɺ؆୯ ʹσίʔυͰ͖·͢ɻͦͷͨΊɺ͜ΕΛͦͷ·· git ϦϙδτϦίϛοτ͢Δͷ ጨΒΕͯ͠·͍·͢ɻྫ͑ΔͳΒ Rails 5.2ͷCredentialsʹ૬͢Δػೳ͕ݸਓతʹ
͋Ε͍͍ͳͱࢥ͍ͬͯ·͕͢ɺͦͷΑ͏ͳػೳඪ४Ͱଘࡏ͠ͳ͍༷Ͱ ͢ɻͰ͕͢ɺ͜Εʹ͍ͭͯ bitnami-labs/sealed-secrets ΛΠϯετʔϧͯ͠ SealedSecretϦιʔεΛՃ͢Δ͜ͱͰ࣮ݱՄೳͷΑ͏Ͱ͢ɻ ʻࢀߟαΠτʼ https://engineering.bitnami.com/articles/sealed-secrets.html
2. ڥมΛઃఆϑΝΠϧͰࢀরͰ͖ͳ͍ Docker ComposeͷΑ͏ʹίϚϯυ࣮ߦ࣌ʹڥมΛ༩͑ɺͦΕΛઃఆϑΝΠϧ Ͱࢀর͢Δͱ͍ͬͨػೳݱঢ়αϙʔτ͞Ε͍ͯͳ͍Α͏Ͱ͢ɻDocker Composeͷ ͱ͖͜ΕͰϏϧυͨ͠λάͷόʔδϣϯΛΓସ͍͑ͯͨͨΊɺগʑࠔΓ·͠ ͨɻ( $(pwd) ͷΑ͏ʹΧϨϯτσΟϨΫτϦΛࢦఆ͢Δ͜ͱग़དྷ·ͤΜ)
ͨͩɺ͜Εʹ͍ͭͯճආࣗମՄೳͰɺͲ͏ͯͦ͠ͷΑ͏ͳ͍ํΛ͍ͨ͠ ߹ envsubst ίϚϯυΛ࣮͑ݱՄೳʹͳΓ·͢ɻ
·ͱΊ
KubernetesDocker for Mac/Win͕ωΠςΟ ϒͰαϙʔτ͢ΔΑ͏ʹͳͬͨӨڹAWSͰ EKS͕ొͨ͠ྲྀΕ͋Γɺࠓޙ༻ࣄྫ ͕૿͍͔͑ͯ͘ͱࢥ͍·͢ɻ ͦͷͨΊ͜Ε͔Β৽͍͠αʔϏεΛߏங͠Α͏ ͱ͍ͯ͠ΔํɺDockerΛ͍ͬͯΔͷͷ ΠϯϑϥσϓϩΠ·ΘΓͷߏཧʹΜͰ ͍ΔํɺੋඇಋೖΛݕ౼ͯ͠ΈΔ͜ͱΛ͓͢
͢Ί͍ͨ͠·͢ɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠