Shakr에서 기존 인프라스트럭쳐를 어떻게 Container Engine으로 이전했는지, 새로운 서비스를 빠르게 Container Engine에 배포할 수 있었는지를 소개합니다.
Harder, better, faster, strongerwith Google Container EngineҳӖஶపցূਸࢎਊೠࡅܰҊউੋࢲ࠺झѐߊ߂ߓನCTOMINKU LEE
View Slide
v⿏࠺٣য়ҟҊContainer icon by Dominic Plag from the Noun Project֥ۄب۽рױೠ࠺٣য়ઁݧ࠺٣য়٣ੋೠоٙ
Shakr Infrastructure⿏֙ஶపցӝ߈ইఃఫ۽ജ⿏֙($1ࢎਊद⿏֙ࠗ࠙ஹೊझషܻਗਸ($1۽ $POUBJOFS&OHJOFदद⿏അࠗ࠙ۄ٘ஹೊসਸ $POUBJOFS&OHJOFীࢲҳز
TopicsKubernetes Container Engine Case Studies
Kubernetes
Why Container?⿏زੌೞ٘ਝয7.ղীࢲࠁਬোೞѱܻࣗझܳҙܻೡࣻ⿏য٣ࢲաഅоמೠগܻா࣌ҳزജ҃⿏7.࠺য়ߡ٘۽ೠѺܻࢿઁҕ١Container icon by Dominic Plag from the Noun Project
Kubernetes⿏ஶపցӝ߈গܻா࣌ਸߓನೞҊ ഛೞҊ ҙܻ೧חदझమ⿏ҳӖࢎਊೞחஶపցҙܻदझమ ই٣য৬֢ೞܳ҅थೠ۽ં⿏ܻӝসইצ-JOVY'PVOEBUJPOীࢲೞח $MPVE/BUJWF$PNQVUJOH'PVOEBUJPOীࢲ۽ંܳҙܻ
Kubernetes⿏ஶపցӝ߈গܻா࣌झாે݂⿏ࢲ࠺झ٣झழߡܻ⿏۽٘ߖ۠य⿏ࢸ߂࠺ࠁҙܻ⿏٣झҙܻ⿏١١
࠺तೠࣗਝয⿏%PDLFS4XBSN⿏"NB[PO&$4⿏.FTPTQIFSF "QBDIF.FTPT⿏)BTIJ$PSQ/PNBE
࠺तೠࣗਝয࠺ъ⿏ஶపցझாે݂ࠗఠ۽٘ߖ۠य ࢸ ٣झҙܻө ߹ببҳহ೧Ѿоמ⿏($1ղীࢲݻߣܼਵ۽औѱ۞झఠࢤࢿоמ⿏ৈ۞ۄ٘ઁҕ৬߬যݫఎࢲߡܳഒೞৈ ۞झఠܳҳ୷ೡࣻ $MVTUFS'FEFSBUJPO⿏4UBUFMFTTೠগܻா࣌ࡺ݅ইצ4UBUFGVMগܻா࣌بҳزೡࣻח١ৈ۞दաܻয়ীೠ
Kubernetes ҳࢿਃࣗ⿏1PE⿏%FQMPZNFOU⿏4FSWJDF⿏*OHSFTT⿏%BFNPO4FU⿏4FDSFU⿏$POGJH.BQ⿏4UBUFGVM4FU⿏3FQMJDB4FU⿏$SPO+PC⿏+PC⿏1FSTJTUFOU7PMVNF⿏1FSTJTUFOU7PMVNF$MBJN⿏FUDj
Case Study: Shakrӝઓੋۄܳ$POUBJOFS&OHJOFਵ۽ೞӝ
ӝઓইఃఫRedisTask QueueFastlyCDNOriginal Media FilesCloud StorageProcessed Media FilesCloud StorageStorageUser UploadsCloud StorageRendered SegmentsCloud StorageCDNInterconnectUpload Processing WorkerCompute EngineMultiple InstancesVideo Processing WorkerCompute EngineMultiple InstancesImage Processing WorkerCompute EngineMultiple InstancesVideo Rendering WorkerCompute EngineMultiple InstancesVideo DesignProcessing WorkerCompute EngineMultiple InstancesComputePapertrailLoggingDatadogMonitoring
೧ѾೞҊर؍⿏ਬোೞޅೠஹೊਗഝਊ ೠੋझఢझӒܛ$16ࢎਊܫੌٸҗࠗೞ࢚కੋܲੋझఢझӒܛܳഝਊೡࣻহਸө ⿏ߓನରߣѢ۽ "QQ&OHJOFա)FSPLVэ1BB4ۢಞܻೞѱߓನೡࣻחহਸө ⿏ৈ۞ҳࢿਃࣗܳ߹ѐ۽ҙܻ೧ঠೣ झ ۽Ӓझܻ߁җэҳࢿਃࣗܳಞܻೞѱࢸೡࣻחহਸө
Compute Engine ীࢲContainer Engine ਵ۽⿏$POUBJOFS&OHJOF۞झఠࢤࢿ⿏%FQMPZNFOU4QFDࢿ⿏ߓನ߂܀݂সؘ⿏/PEF1PPM୶о߂ઁ⿏%BUBEPH"HFOUܳాೠݽפఠ݂⿏۽Ӓझܻ߁߂
Container Engine ۞झఠ ࢤࢿ
Google Container EngineKubernetes as a Service
Google Container Engine⿏,VCFSOFUFTOPEF৬FUDEੋझఢझܳ(PPHMFҙܻ⿏زਵ۽(PPHMF$PNQVUF&OHJOFੋझఢझࢤࢿ߂ࢸ⿏زਵ۽ߑച߷ࢸ⿏زਵ۽۽٘ߖ۠यࢸ
۞झఠࢤࢿ⿏ਬোೞޅೠஹೊਗഝਊ ೠੋझఢझӒܛ$16ࢎਊܫੌٸҗࠗೞ࢚కੋܲੋझఢझӒܛܳഝਊೡࣻহਸө ⿏ߓನରߣѢ۽ "QQ&OHJOFա)FSPLVэ1BB4ۢಞܻೞѱߓನೡࣻਸө ⿏ৈ۞ҳࢿਃࣗܳ߹ѐ۽ҙܻ೧ঠೣ ۽٘ߖ۠ࢲ झ ۽Ӓझܻ߁җэҳࢿਃࣗܳಞܻೞѱࢸೡࣻחহਸө
۞झఠࢤࢿ$ gcloud container clusters create my-awesome-cluster \--zone asia-northeast1-a \--enable-cloud-logging --enable-cloud-monitoring \--machine-type n1-standard-4 \—-num-nodes 3Bash
$ gcloud container clusters get-credentials \my-awesome-cluster --zone asia-northeast1-aFetching cluster endpoint and auth data.kubeconfig entry generated for my-awesome-cluster.$ kubectl proxyStarting to serve on 127.0.0.1:8001BashKubernetes Dashboard
Kubernetes Dashboard
Deployment Spec ࢿ
Pod↟ оஹೊਬ↟ ೞաৈ۞ѐஶపց۽ҳࢿ↟ 1PEউஶపցחҕрҗஶఫझܳҕਬ↟ ൃߊࢿઙܐदݽؘٚఠਬप↟ ਃद($4ա1FSTJTUFOU7PMVNFਸࢎਊೞৈؘఠܳࠁઓ
Deployment⿏ৈ۞ѐ1PEਸߓನೞҊҙܻೞחܻࣗझ⿏1PEіࣻ SFQMJDBܳ೧ݶ೧іࣻ݅ఀ زਵ۽୶о߂ઁ⿏܀݂সؘ৬܀ߔҳഅ 3FQMJDB4FU
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deployment
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deploymentspec:replicas: 3
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deploymentspec:replicas: 3template:metadata:labels:app: myappspec:containers:- name: myappimage: gcr.io/my-project/myapp:3.0.0resources:requests:cpu: 200mmemory: 100Milimits:cpu: "4"memory: 8Gi
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deploymentspec:replicas: 3template:metadata:labels:app: myappspec:containers:- name: myappimage: gcr.io/my-project/myapp:3.0.0resources:requests:cpu: 200mmemory: 100Milimits:cpu: "4"memory: 8GilivenessProbe:httpGet:path: /port: 80readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 3
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deploymentspec:replicas: 3template:metadata:labels:app: myappspec:containers:- name: myappimage: gcr.io/my-project/myapp:3.0.0resources:requests:cpu: 200mmemory: 100Milimits:cpu: "4"memory: 8GilivenessProbe:httpGet:path: /port: 80readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 3env:- name: RACK_ENVvalue: production- name: PORTvalue: 80volumeMounts:- name: tmpmountPath: /tmpvolumes:- name: tmpemptyDir: {}
ߓನ
Deployment ߓನೞӝBash# Get credentials$ gcloud container clusters get-credentials my-awesome-clusterFetching cluster endpoint and auth data.kubeconfig entry generated for my-awesome-cluster.
Deployment ߓನೞӝBash# Get credentials$ gcloud container clusters get-credentials my-awesome-clusterFetching cluster endpoint and auth data.kubeconfig entry generated for my-awesome-cluster.# Deploy!$ kubectl apply -f path/to/deployment.ymldeployment "myapp-deployment" created
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deploymentspec:replicas: 30template:metadata:labels:app: myappspec:containers:- name: myappimage: gcr.io/my-project/myapp:3.0.0resources:requests:cpu: 200mmemory: 100Milimits:cpu: "4"memory: 8GilivenessProbe:httpGet:path: /port: 80readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 3env:- name: RACK_ENVvalue: production- name: PORTvalue: 80volumeMounts:- name: tmpmountPath: /tmpvolumes:- name: tmpemptyDir: {}
yamldeployment.ymlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: myapp-deploymentspec:replicas: 30template:metadata:labels:app: myappspec:containers:- name: myappimage: gcr.io/my-project/myapp:3.1.0resources:requests:cpu: 200mmemory: 100Milimits:cpu: "4"memory: 8GilivenessProbe:httpGet:path: /port: 80readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 3env:- name: RACK_ENVvalue: production- name: PORTvalue: 80volumeMounts:- name: tmpmountPath: /tmpvolumes:- name: tmpemptyDir: {}
Deployment ܀݂সؘBashkubectl apply -f path/to/deployment.ymldeployment "myapp-deployment" updated
Node Pool୶о߂ઁ
Node Pool୶о߂ઁ⿏ਬোೞޅೠஹೊਗഝਊ ೠੋझఢझӒܛ$16ࢎਊܫੌٸҗࠗೞ࢚కੋܲੋझఢझӒܛܳഝਊೡࣻহਸө ⿏ߓನରߣѢ۽ "QQ&OHJOFա)FSPLVэ1BB4ۢಞܻೞѱߓನೡࣻਸө ⿏ৈ۞ҳࢿਃࣗܳ߹ѐ۽ҙܻ೧ঠೣ ۽٘ߖ۠ࢲ झ ۽Ӓझܻ߁җэҳࢿਃࣗܳಞܻೞѱࢸೡࣻחহਸө
Node Pool୶о߂ઁ$ gcloud container node-pools create my-new-nodepool \--cluster my-awesome-cluster \--machine-type n1-standard-16 \--num-nodes 5Bash
Preemptible Node Pool
Preemptible VM (PVM)
Preemptible Node Pool$ gcloud beta container node-pools create my-new-nodepool \--cluster my-awesome-cluster \--machine-type n1-standard-16 \--num-nodes 5 \--preemptibleBashBETA
PVM with nodeSelectorapiVersion: v1kind: Podspec:nodeSelector:!cloud.google.com/gke-preemptibleyaml
PVM with nodeAffinityapiVersion: v1kind: Podspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: cloud.google.com/gke-preemptibleoperator: DoesNotExistyamlBETA
Datadog Agentܳాೠݽפఠ݂
Datadog Agentࢸ$ kubectl create -f dd-agent.yamldaemonset "dd-agent" createdBash
ChatOps োز
۽Ӓझܻ߁߂
۞झఠࢸ$ gcloud container clusters create my-awesome-cluster \--zone asia-northeast1-a \--enable-cloud-logging --enable-cloud-monitoring \--machine-type n1-standard-4 \—-num-nodes 3Bash
۽Ӓী
Stackdriver Logging⿏$POUBJOFS&OHJOFਸॵݶਗܼࢸоמ⿏ఫझ+40/ನݘਗ⿏पदр۽Ӓझܻ߁⿏ޖܐ౭যઁҕ ۽ંೠ׳(# ੌਬ⿏"84ܻࣗझبݽפఠ݂оמ⿏$MPVE4UPSBHF #JH2VFSZ 1VC4VCਵ۽۽ӒFYQPSUоמ
Stackdriver Logging
BigQuery Export
റ⿏ ೠੋझఢझӒܛ$16ࢎਊܫੌٸҗࠗೞ࢚కੋܲੋझఢझӒܛܳഝਊೡࣻহਸө ªৈਗ୭ࣗച⿏ "QQ&OHJOFա)FSPLVэ1BB4ۢಞܻೞѱߓನೡࣻחহਸө ªLVCFDUMழݔ٘ۄੋبҳ۽एߓನزച⿏ झ ۽Ӓझܻ߁җэҳࢿਃࣗܳಞܻೞѱࢸೡࣻחহਸө ªࠗ࠙ੋۄҳࢿਃࣗܳऔѱࢸоמ
Case Study: StoriesAds࢜۽ࢲ࠺झܳ$POUBJOFS&OHJOFী۠டೞӝ
Make Instagram Stories Ads for your brand.
ScheduleApril 201729162330310172441118255121926613202771421288152229
ScheduleApril 201729162330310172441118255121926613202771421288152229 ൞ݎ۠டੌ
ScheduleApril 201729162330310172441118255121926613202771421288152229۽షఋೝ۽ંࣇস൞ݎ۠டੌ
ScheduleApril 201729162330310172441118255121926613202771421288152229۽షఋೝ۽ંࣇস൞ݎ۠டੌߔূ٘ۿূ٘ѐߊ$*ജ҃ࣇস
ScheduleApril 201729162330310172441118255121926613202771421288152229۽షఋೝ۽ંࣇস൞ݎ۠டੌߔূ٘ۿূ٘ѐߊ$*ജ҃ࣇস۽؋࣌ജ҃ҳ୷
Challenges⿏ઁೠػੌ ࢜۽بҳٜܳ݅ӝਤ೧ӝഥ࠺ਊਸऔࢎܻೡࣻহח࢚ട⿏ࣁ҅ࢎਊ࢚ܳਵ۽ೠࢲ࠺झ %BZࠗఠࣁ҅ࢎਊীѱೠࣘبܳઁҕ೧যঠೠ⿏ஏೞӝ൨ٚߑޙࣻ ѱࢎਊೡٸח҃ઁਵ۽ೞҊ ࢎਊоૐоೣীٮۄਬোೞѱഛೡࣻযঠೠ
ChallengesContainer Engine
ইఃఫContainer EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancing
Container BuilderContainer EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancing
Container Builder⿏$MPVE4PVSDF3FQPTJUPSZ (JU)VC #JUCVDLFUਗ⿏࠳ےաకӒоੌઑѤীݏਵݶ࠽٘प೯⿏۽Ӓपदрഛੋоמ⿏ޖܐ౭যઁҕ ۽ંೞܖ࠙࠽٘दрઁҕ⿏ৈ۞ஶపց߽ܳ۳۽ҳزоמ⿏ݒפ٘ࢲ࠺झ
yamlcloudbuild.yamlsteps:- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn']id: 'install-packages'
yamlcloudbuild.yamlsteps:- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn']id: 'install-packages'- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn', 'run', 'build']env:- 'BACKEND=staging'- 'COMMIT_SHA=$COMMIT_SHA'waitFor: ['install-packages']id: 'staging'- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn', 'run', 'build']env:- 'BACKEND=production'- 'COMMIT_SHA=$COMMIT_SHA'waitFor: ['install-packages']id: 'production'
yamlcloudbuild.yamlsteps:- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn']id: 'install-packages'- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn', 'run', 'build']env:- 'BACKEND=staging'- 'COMMIT_SHA=$COMMIT_SHA'waitFor: ['install-packages']id: 'staging'- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn', 'run', 'build']env:- 'BACKEND=production'- 'COMMIT_SHA=$COMMIT_SHA'waitFor: ['install-packages']id: 'production'- name: 'gcr.io/cloud-builders/docker'args: ['build', '-t','gcr.io/$PROJECT_ID/frontend:staging-$COMMIT_SHA','--build-arg', 'backend=staging', '.']waitFor: ['staging']- name: 'gcr.io/cloud-builders/docker'args: ['build', '-t','gcr.io/$PROJECT_ID/frontend:production-$COMMIT_SHA','--build-arg', 'backend=production', '.']waitFor: ['production']
yamlcloudbuild.yamlsteps:- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn']id: 'install-packages'- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn', 'run', 'build']env:- 'BACKEND=staging'- 'COMMIT_SHA=$COMMIT_SHA'waitFor: ['install-packages']id: 'staging'- name: 'gcr.io/keynote-demo-project/node:7.9.0'args: ['yarn', 'run', 'build']env:- 'BACKEND=production'- 'COMMIT_SHA=$COMMIT_SHA'waitFor: ['install-packages']id: 'production'- name: 'gcr.io/cloud-builders/docker'args: ['build', '-t','gcr.io/$PROJECT_ID/frontend:staging-$COMMIT_SHA','--build-arg', 'backend=staging', '.']waitFor: ['staging']- name: 'gcr.io/cloud-builders/docker'args: ['build', '-t','gcr.io/$PROJECT_ID/frontend:production-$COMMIT_SHA','--build-arg', 'backend=production', '.']waitFor: ['production']images: ['gcr.io/$PROJECT_ID/frontend:staging-$COMMIT_SHA','gcr.io/$PROJECT_ID/frontend:production-$COMMIT_SHA']
DeploymentContainer EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancing
yamldeployment-frontend.yamlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: frontend-deploymentspec:replicas: 2template:metadata:labels:app: frontendspec:containers:- name: frontendimage: gcr.io/project/frontend:staging-v01resources:requests:memory: 100Miports:- containerPort: 80
yamldeployment-api.yamlapiVersion: apps/v1beta1kind: Deploymentmetadata:name: api-deploymentspec:replicas: 3template:metadata:labels:app: apispec:containers:- name: apiimage: gcr.io/project/api:v01resources:requests:memory: 100Miports:- containerPort: 80env:- name: RAILS_ENVvalue: production- name: RAILS_LOG_TO_STDOUTvalue: "true"- name: CONFIG_KEYvalueFrom:configMapKeyRef:name: my-configskey: CONFIG_KEY- name: SECRET_KEYvalueFrom:secretKeyRef:name: my-secretskey: SECRET_KEY
secret.yamlapiVersion: v1kind: Secretmetadata:name: my-secretstype: Opaquedata:SECRET_KEY: config_map.yamlapiVersion: v1kind: ConfigMapmetadata:name: my-configstype: Opaquedata:CONFIG_KEY:
Container EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancingCloud Datastore
0 6 /0 7/20 17, 14 *4 5P ag e 1 of 1https://cloud.google.com/storage-options/
Cloud Datastore⿏#JH5BCMFীӝ߈ਸك/P42-ؘఠ߬झ⿏ࢥ٬ TIBSEJOHҗࠂઁ SFQMJDBUJPOਸزਵ۽ҙܻೞৈਬোೠഛоמ⿏ੋؙझਗ زࢤࢿ߂ࣻزࢤࢿ⿏ੋझఢझҗӘইצҗয়ಌۨ࣌җӘ⿏ޖܐ౭যઁҕ⿏/JBOUJD 1PL䟖NPO(Pѐߊࢎীࢲࢎਊ
https://cloudplatform.googleblog.com/2016/09/bringing-Pokemon-GO-to-life-on-Google-Cloud.html
ServiceContainer EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancing
Service⿏-BZFS5$16%1-PBE#BMBODJOH⿏ౠ1PEٜਸ,VCFSOFUFT۞झఠղীࢲ যڌѱӔ೧ঠೞח⿏,VCFSOFUFTղ4FSWJDF%JTDPWFSZ۽ 1PEղীࢲ4FSWJDFӔоמ
Service Discovery$ kubectl exec -ti debug-pod -- bashroot@debug-pod:/# curl -I http://api-serviceHTTP/1.1 200 OKX-Frame-Options: SAMEORIGINX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniffContent-Type: text/htmlX-Request-Id: 7b194765-ixz8-1qke-9572-0fa67509e500X-Runtime: 0.001207Bash
service-frontend.yamlapiVersion: v1kind: Servicemetadata:name: frontend-servicelabels:app: frontendspec:ports:- port: 80protocol: TCPname: httpselector:app: frontendtype: NodePortservice-api.yamlapiVersion: v1kind: Servicemetadata:name: api-servicelabels:app: apispec:ports:- port: 80protocol: TCPname: httpselector:app: apitype: NodePort
IngressContainer EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancing
Ingress⿏-BZFS)551 4-PBE#BMBODJOH⿏ഐझܴ߂҃۽ীٮۄౠߔূ٘۽ਃۄоמ⿏5-45FSNJOBUJPOਗ⿏(,&ীࢲח$MPVE)551 4-PBE#BMBODFSܳزਵ۽ࢤࢿ⿏ఋࢎ-#৬ܰѱQSFXBSNJOHࠛਃ⿏ਗܼਵ۽$MPVE$%/ࢸоמBETA
yamlingress.ymlapiVersion: extensions/v1beta1kind: Ingressmetadata:name: storiesads-com-ingressannotations:kubernetes.io/ingress.global-static-ip-name: "storiesads-com"spec:tls:- secretName: tls-certificaterules:- http:paths:- path: /api/*backend:serviceName: api-serviceservicePort: 80- path: /*backend:serviceName: frontend-serviceservicePort: 80
Cloud Load Balancing & CDNContainer EngineRedisTask QueueStackdriverLoggingCloudCDNContainer BuilderDocker image buildsFrontendk8s DeploymentMultiple PodsBackendk8s DeploymentMultiple PodsWorkerk8s DeploymentMultiple PodsDatadogMonitoringCloudDatastoreFrontendk8s ServiceBackendk8s ServiceStoriesAdsk8s IngressGitHubSource RepositoryTravis CIContinuous IntegrationCloud LoadBalancing
റӝ⿏ಞܻೠदࠁ٘৬LVCFDUM$-*بҳܳࢎਊೞৈݒࡅܲߓನоמ⿏ևߧਤदաܻয়ীоמೠনೠܻࣗझઓ⿏(PPHMF$MPVE1MBUGPSNղܻܲࣗझ৬ো҅оਊ
ਬೡ⿏۽؋࣌ജ҃ীӂغחੌܻࠗࣗझоই("оইצ߬ఋ࢚క⿏"84١ৈ۞ۄ٘ܳযݣ౭ۄ٘۞झఠܳೞҊೡٸח FUDE৬NBTUFS XPSLFS֢٘ܳࢸ೧ঠೣ⿏.JDSPTPGU"[VSFח,VCFSOFUFT֎౭࠳ਗ⿏$PSF04৬эসী࠺ਊਸࠛೞҊ"84ա߬যݫఎীࢲݒפ٘۽оמ⿏ӏݽоݒࢲ࠺झ҃ ࢚ݫݽܻয়ߡ٘١ਸҊ۰೮ਸٸࠗೡࣻ
We're Hiring!careers.shakr.com࠺٣য়݃ாېܳэٜ݅যоप࠙ਸणפ
Thank you!Any questions?MINKU LEE with Shakr dev team