https://hatena.co.jp/recruit/intern/2022
ハンズオンで利用した Kubernetes 環境は https://github.com/hatena/Hatena-Intern-Kubernetes-Microservice にあります。
Kubernetes#hatenaintern
View Slide
׆ס铺紶ך㰢؆ךַ׆כKubernetes KubernetesKubernetes
Kuberneteskubernetes, k sAWS EKS, Google Cloud GKE, Azure AKS
עיםכؤ٤طػk s ( AWSECS)k sAWS EKSGoogle Cloud GKEAWS ECS
Kubernetes 1kubernetes
Kubernetes 23k s Cloud Native Computing Foundation(CNCF)kuberneteskubernetes
Kubernetes鎋碷ע䏲鳭(Infrastructure as Code)/
Kubernetes
Cluster˝ ُتذ٭ؿ٭غכ٠٭٭ؿ٭غך啶䡗˝ ُتذ٭ؿ٭غ˝ ؤ٤عٞ٭ٜوٝ٭٤˝ ؠٚتذס畘杼䥵䎎˝ قهٛشؠؠٚؗغךעُؾ٭ةغמ䬠❠˝ ٠٭٭ؿ٭غ˝ ظ٭ذوٝ٭٤˝ ؤ٤طػ㲔车ג״סؤ٤مٖ٭طؔ٤ءٛخ٭تסױ˝ 鎋碷ע䏲鳭
PodPod 1
ئؕغ٭قذ٭٤pod( ) Proxy, ,
٠٭٭ؿ٭غPod( )orkubeletAPI
Kubernetes
ٛخ٭تסطإٛWorkloadsServiceCon g StorageClusterMetadataNamespace
Workloadsؤ٤طػס㲔车מ꞊ٛخ٭تPodPod IPReplicasetPod Pod ()Pod
WorkloadsDeploymentReplicaset
Workloads♓┖յ☪㍑סـ٤ث؛٤ךע⮵榫םJobCronJobjob
ServicePodServiceLIngressL
kubernetesPod localhostPod Pod IPpod IP IPPod IP Pod IPPodpod
ServicePod ( )1 pod 2 podpodIPClusterIP ( )NodePort ( )LoadBalancer( )etc
ServicePodDNSDNSaccount account.hatena-intern-2022.svc.cluster.localDNS Aaccount(service ).hatena-intern- (namespace ).svc()
IngressIngressL(AWS ALB, Google Cloud GCLB,Nginx)IngressHTTPS
ٛخ٭ت畘杼מחַי
ManifestYAMLkubectl apply -f k sk s
ٛخ٭ت⯆Pod CPUPod
ىٜتزؘشؠPodLiveness ProbePodReadiness ProbePod
⺎榫䓪כ䦡䍖䓪מחַי
⺎榫䓪ReplicasetManifestNode Pod Node
靷蕔מ㵚䦡䍖䓪Horizontal Pod Autoscaler (HPA)CPU PodVertical Pod Autoscaler (VPA)CPU,
ـ٤ث؛٤ך⮵榫ص٭ٜ磆☭
Minikubekuberneteshttps://minikube.sigs.k s.io/docs/start/kuberneteskind
Kustomizehttps://github.com/kubernetes-sigs/kustomizek sDev, Stg, Prd Manifestkustomization.yaml secretcon g
Ska oldhttps://ska old.dev/k sskaffold.yaml docker
Kubernetes
ؓةؘ٤رHatena-Intern-
瑬┉鼧Hatena-Intern-
׆ס侇ꝴעـ٤ث؛٤ךKubenetescodespaces
ئ٭لتס啶䡗
ُؼنؘتعס啶䡗k8s├── account│ ├── app.yaml│ ├── config│ │ └── schema.sql│ ├── db.yaml│ ├── kustomization.yaml│ ├── secret│ │ └── ecdsa-private.pem│ └── test.yaml├── blog│ ├── app.yaml│ ├── config│ │ └── schema.sql│ ├── db.yaml│ ├── kustomization.yaml│ ├── secret│ │ └── account-ecdsa-public.pem│ └── test.yaml├── kustomization.yaml├── namespace.yaml├── renderer-go│ ├── app.yaml│ └── kustomization.yaml└── system└── sa.yamlk8saccount/blog/renderer-gokustomization.yaml kustomize
k s/blog/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- app.yaml- db.yaml- test.yamlsecretGenerator:- name: blog-app-secretfiles:- secret/account-ecdsa-public.pemconfigMapGenerator:- name: blog-app-env-varsliterals:# (snip)- name: blog-db-schema-configfiles:- config/schema.sql
澬鏀% make up8080% kubectl port-forward service/blog 8080:8080 # ϩʔΧϧͷ8080ϙʔτͷ௨৴Λblog service ͔Βෛՙࢄ͞Ε͍ͯΔpodͷ8080ϙʔτʹసૹ͢ΔPodvscode terminal PORTS 8080
ئ٭لتֿ颯Ⳃיַ׆כ澬鏀context% kubectl config use-context hatena-intern-2022% kubectl get pods
Podservices/blog/templates/index.htmlPod% kubectl get pods -w% kubectl describe pods
ظفشء# Podͷৄࡉใͷදࣔɻpod͕ىಈ͠ͳ͍߹ಛʹ"Events:"ཝʹ% kubectl describe pod blog# ωʔϜεϖʔε্ʹ͋ΔϦιʔεͷใΛදࣔ% kubectl get all# ىಈ͍ͯ͠ΔPodͰγΣϧΛىಈ͢Δ% kubectl exec -it svc/account -c account !" /bin/sh!psblog!wget -q -O - blog:8080!nslookup blog
瑬◅鼧鋗嫎㚺䬵ئ٭لتס鴑ⱶ
rendererservices/renderer-ts k sservices/renderer-gok8s/renderer-go k8s/renderer-ts
ُؼنؘتع˝ 鴑ⱶُؼنؘتع˝ k8s/renderer-ts/kustomization.yaml˝ k8s/renderer-ts/app.yaml˝ 稴ُؼنؘتع˝ skaffold.yaml˝ k8s/kustomization.yaml˝ k8s/blog/kustomization.yaml
ُؼنؘتعס鴑ⱶ% cp -R k8s/renderer-go k8s/renderer-ts% sed -i -e 's/renderer-go/renderer-ts/g' k8s/renderer-ts/*.yamlk8s/renderer-go k8s/renderer-tsrenderer-go renderer-ts
ُؼنؘتعס稴ska old.yamlapiVersion: skaffold/v2beta5kind: Configmetadata:name: hatena-intern-2021build:artifacts:# (snip)- image: hatena-intern-2021-renderer-gocontext: services/renderer-go- image: hatena-intern-2021-renderer-ts #!context: services/renderer-ts #!local:# (snip)services/renderer-ts docker k s
ُؼنؘتعס稴k s/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationnamespace: hatena-intern-2021resources:- namespace.yaml- account- blog- renderer-go- renderer-ts #!
ُؼنؘتعס稴k s/blog/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization# (snip)configMapGenerator:- name: blog-app-env-varsliterals:- MODE=development- DATABASE_DSN=root@(blog-db:3306)/intern_2021_blog?time_zone=UTC&parseTime=true&loc=UTC- ACCOUNT_ADDR=account:50051- RENDERER_ADDR=renderer-ts:50051 #!- name: blog-test-env-vars# (snip)blog renderer-go renderer-ts
Podkubectl get pods Podkubectl describe pod renderer-ts
renderer-tskubectl get pods Podrenderer-ts
pushpushtypescriptuse-renderer-ts-dekokun pushts renderer-ts% git switch -c use-renderer-ts-dekokun% git add k8s/ skaffold.yaml% git commit -m'rendererΛtypescript࣮ʹมߋ'% git push origin use-renderer-ts-dekokun
ظ٭ذي٭ت釳ַיײֹֽױׄؤ٭ػ٭նؓوٛآ٭ب٘٤ꝧ氦מ䏔מ玮חכ䓙ַױն% mysql -u root -h 127.0.0.1 -P 3306 intern_2022_blogMySQL [intern_2022_blog]> show tables;+----------------------------+| Tables_in_intern_2022_blog |+----------------------------+| blogs || entries || sessions || users |+----------------------------+MySQL [intern_2022_blog]> select count(*) from blogs;+----------+| count(*) |+----------+| 0 |+----------+䫘禈ך׀םַ㕙⺬յَ٭عס鬇鴜ֿך׀יַםַ⺎耆䓪ֵֿױն♓┖סؤُ٤غךَ٭عنؚ٠٭غיׂדַ# ϙʔτͷసૹ% kubectl port-forward svc/blog-db 3306:3306
ױכ״kuberneteskuberneteskubernetesManifest