2017.10.27 広島Javaユーザーグループ で行ったKubernetes ハンズオン資料です。
Kubernetes with JavaKubernetes Java #hirojug
View Slide
1- -$! +#&(# -,%+&",Java),,*,%'*Twitter-@7richi
25:)Oracle Code Japan Tour in Hiroshima*;)Cloud Native JavaEE*LMJRT7KubernetesD14SFPIVNETHNQD56&,4.UUUKubernetes:%16+=@ .-544>'3;7.CB4-+=@7/6,9-54;.-54(W?>X307'Kubernetes:%2A 9;8 ;OTKGTD"16Kubernetes$;
1.
4■Kubernetes.+CE7A-Kubernetes5%)Spring Boot*%'REST API5%)9D=?6E8<>BE;@D5&4■:EA– Kubernetes.– CE7A0Kubernetes.#43"-,4– Kubernetes5%',9D=?6E8<>BE;@D.■%,!$+– 9D=?(Docker)-&4– Spring Boot. .– REST API-(!) .+:EA$$%,!+12/Java+/,!.*/
5-2/=5■Kubernetes&■<>1;&■8=30=– Pod#&69<.– Replica Set+69<.– Deployment+69<.– Service&– Service+Blue/Green Deployment■ – 0>9=4:7>2018?■ – *# )!$(%– "',
2. Kubernetes
7■miniKube– Windows exe (minikube-windows-amd64.exe)https://github.com/kubernetes/minikube/releases
8mOp_uZzizJn[xFDockerNG=L[\bo{YxbeUzX\dvz[rxazu|1GoogleA-/+:M@5LYxbeWs\_[\bo2Borg3AFgShSN/;@-:M>1GApachesQ]x\A,:M@5LUzlx^z\^kdSTOA4L1nQWwZzj\NEclwQ0O`lczd=L$B;@0YxbeFUzd\Xzu0 Blue Green Deployment 0 Rolling Update DCF$N7@5L1?DHE2Kubernetes3G0Vt[q(A2%F!32 #y,#3B56 94LB:M12k8s3B:M'*:ML9 51{8GK8KsF.FN&;@5L|)HG2WzmzfPb\3J2WRifPb\3}KubernetesBG
9■2014 66■2015 76.5*141.0335+■2015 76Linux Foundation&Cloud Native Computing Foundation(CNCF)%(AT&TCiscoCoreOSDockerIBMIntelMicrosoftRed HatVMware$#&% ()■2017 86AWSCNCF%04.5&/2,-" )'!& $
10]udh+O NQR4Wlq\v_ouOeltXP%N>4)%N*;SQ:NMGF5A@CIHO^vj`KAIBS-=8S5w!NmX[t^vj`%MWltvbJPxE?J]udh0O.= KMR2O&ML/$3U(AF 4,]udhU'#BS_`dn=-KMGF56AWS76Microsoft Azure76Google Cloud Platform76IBM Bluemix7MLO-[pYgltiXav=CNCFONMGFNQR4"OK?T]udhZv\`fsv_oucvrKAIKubernetesPekV[fK9;SNMRHH8S■KubernetesOZv\`fsv_oucvrDocker Swarm4Amazon EC2 Container ServiceML=8SMD]udhZv\`fsv_oucvr=-NMGFO<
11■1%PGOCa frgp}– dy%YGCPAAWSLBJKXk8s_;GK7A='H]M(RUM`N)&GOC■jru2PGOCjru1%– jru2%Q8PZ\Open Container InitiativeEru#LB^SDockerQjru2LXZC■3zmtPjru_syc– NQzmtPNQjru_>H]D_@0■jru?Qvqt g,$ 6!XV– k xmsbmew +Q-■jruQ"*5– jruE`I[Ajru_.L4:■jruQ9/– -Q3jruTQagnmwlh-■jruQo mai l~– jru PCPUo mY{| o mQ-KubernetesR_GKF^]QD
12■ %#Ingress$Kubernetes ClusterNodePod" !ServiceIngressinternetNodePod" !NodePod" !Service
13■Node/ClusterNode^cIk8sbvnpVlYgbVM`KT24w bR^Jk8sn94Vl=dIxN) Vl\bvNRmjNode]@SmlJNodebHnCliuter^e■Podk8s]bpb,!JPodcbvbH]INodea"FSmlk8s-b0$JPodb3#c&TYvc\+aUNodeapSmlJRmaik<VlA*b{zv]1%SmYZbouy]LKnBZQhVPTZbH^T\p/l zry^ouyIouyb^ sq`_b:W– Pod bvclocalhost;6]D]Ol– EMj8(Podfcos{zc/`K– Label:k8s]94Sm\Kl|zc>a[O?7a.IpSmlNXbGa~`N?7a'jmlIXmjnBZQhVPVlYgPoda T\}tnVlR^N/lKubernetesb5C[1/3]
14■Service$Pod?8;IPK]hVJG;Hk8s@"<.!?ServiceB@KRWV3Pod?G 5FIH@#1/k8s– Service@ -■ ClusterIP:ReVY)?Tk`VJ*8C9/6@J(9H=.ReVY2F@DTk`V?KRWV<4C9([aPg\)■ NodePort:^k]IP?+>ck\lJ%9H6=?EG.ReVY2FNodePortTk`V?KRWV<4C9■ LoadBalancer:ReN]bi_MZ@ik]_ejTJ8;)?Tk`VJ*8C9(minikubeA,)■ ExternalName:DNS@CNAMEhSk]J&9H6=?EG.ReVY) 5@OMfKVJ9H/6I?A_kUdj1.7@kube-dns3%Kubernetes@'[2/3]
15■IngressIngressYServiceW[]ICAdServiceW{joNaDHTTPvx|nW-MR8LbREa,CL7SXURLyqW_a~sfl^SSL43 /VUX<]7FaD\PCIngressYk8sH2MREa0W_QR*6T8HGcaCGCPSYGCPXCAWSSYAWSX0W QPS{joH Lba■Replica SetPodX{}i$PodXmsw$d5!/=Na*6DmswH"MP{}i$_`]VE Y%PWmswd?MCFNJRa YmswdBM{}i$d5!Na■DeploymentPod^Replication SetsX:er{tu*6d#DDeploymenthzpgkuS(Na.d;@NbZDeployment ControllerH9+MP.W&MRKbaOXW]Kubernetes'X)C1>H$NaKubernetesX1>[3/3]
3.
17Minikube"k8s)#& %'8=.=!$ ;=*:7/=<!VM k8+901!,<24) '$!-=6(Kubernetes Master)5=3!k8s+901)('>Minikube " Ingress"?Minikube";=*:7/=<(Linux,Mac OS,Windows)VM(VirtualMachine)Kubernetes(minikube)Kubernetes MasterNode(1!#)
18■– virtualBox 4Q■minikube-=@B3@H– miniKube-?5QPRC■ Windows - exe (minikube-windows-amd64.exe)https://github.com/kubernetes/minikube/releases– minikube-■ minikube-windows-amd64.exe2minikube.exe *NDRJ$(F<-'&G7O?,!■ AG7OB- vm driver 2 VirtualBox ,%0&.-9IQC– kubectl 4Q– #1&URL / kubectl.exe 2?5QPRC$(F<-'&G7O?,– vm driver 2 VirtualBox ,%0&.9IQC2%0■Kubernetes8M<>-– -9IQC)8M<>2%0– -9IQC):RERER;LQ2 &/Windows,kubernetes2%0$ minikube config set vm-driver virtualbox$ minikube start$ minikube version
4.
20/8*#8 Docker6()-4Spring BootREST APIDocker"29(! Kubernetes&8+.#9%)-69'38!■Docker6()-4– docker.io/uls555/getting-started-k8s-with-java■,07"/8*#8Docker Hub79$51'98Docker Image REST APIminikubepushpull
21REST APIREST APIDocker Hub Docker Image REST APIminikube
22/%-Pod,6 4+Pod,@EL86#'04J>M< -GCD9■Pod, ) – ,(pod.yaml6 – Pod6 ■Pod,– ",Pod-:I,EI8FMAIP7BK<#!&'*,(!3-7:=<*– Dashboard(1#'02NURL:http://192.168.99.100:30000OPod(,@EL8[1/2]apiVersion: v1kind: Podmetadata:name: rest-apispec:containers:- image: docker.io/uls555/getting-started-k8s-with-java:v1imagePullPolicy: Alwaysname: rest-api$ kubectl create -f pod.yaml$ kubectl get podsNAME READY STATUS RESTARTS AGErest-api 0/1 ContainerCreating 0 1m8HM;,
23nPodPod [2/2]$ kubectl delete pod rest-api
24Pod/ "$Pod "$+, /%$+*) !.*Replica Set/"&+Pod/ #-■Replica Set+( – +'replicaset.yaml/ – Replica Set/ Replica Set/"$1230[1/2]apiVersion: extensions/v1beta1kind: ReplicaSetmetadata:name: rest-api-rsspec:replicas: 3template:metadata:labels:app: my-rest-apispec:containers:- image: docker.io/uls555/getting-started-k8s-with-java:v1imagePullPolicy: Alwaysname: rest-api$ kubectl create -f replicaset.yaml #-Pod+Pod+
25■Pod ■Pod Replica SetPod " Pod"Pod– Pod■Replica SetReplica Set"$%[2/2]$ kubectl get podNAME READY STATUS RESTARTS AGErest-api-rs-6xpqf 1/1 Running 0 1mrest-api-rs-m1x43 1/1 Running 0 1mrest-api-rs-pbsmk 1/1 Running 0 1m$ kubectl delete pod rest-api-rs-m1x43$ kubectl get podNAME READY STATUS RESTARTS AGErest-api-rs-6xpqf 1/1 Running 0 4mrest-api-rs-m1x43 1/1 Terminating 0 4mrest-api-rs-n92wz 0/1 ContainerCreating 0 5srest-api-rs-pbsmk 1/1 Running 0 4m!Pod!Pod$ kubectl delete replicaset rest-api-rs
26Replica Set0!/$ k8s&-%Deployment0!/$&,.6;?2' k8s&/"+'9A4=@&&/$/■Deployment'$6;?2– '#deployment.yaml0– 6;?2Deployment0 "6;?2[1/3]apiVersion: apps/v1beta1kind: Deploymentmetadata:name: rest-api-depspec:replicas: 3template:metadata:labels:app: my-rest-apispec:containers:- image: docker.io/uls555/getting-started-k8s-with-java:v1imagePullPolicy: Alwaysname: rest-api<8:357:12>(RepulicsSet$)*$ kubectl create -f deployment.yaml
27■Pod■Deployment– Replicas4Deployment [2/3]$ kubectl get podsNAME READY STATUS RESTARTS AGErest-api-rs-6xpqf 1/1 Running 1 9hrest-api-rs-n92wz 1/1 Running 1 9hrest-api-rs-pbsmk 1/1 Running 1 9hapiVersion: apps/v1beta1kind: Deploymentmetadata:name: rest-api-depspec:replicas: 4template:metadata:labels:app: my-rest-apispec:containers:- image: docker.io/uls555/getting-started-k8s-with-java:v1imagePullPolicy: Alwaysname: rest-apireplica4
28■Deployment– Deployment ■Pod – Pod14 Deployment[3/3]$ kubectl get podsNAME READY STATUS RESTARTS AGErest-api-rs-6xpqf 1/1 Running 1 9hrest-api-rs-9b0sl 1/1 Running 0 10srest-api-rs-fbcdf 0/1 ContainerCreating 0 10srest-api-rs-pbsmk 1/1 Running 1 9h$ kubectl apply -f deployment.yaml
29Service7 (,&62- (*Pod7+0/(*8=;975..3/#407Pod/)5■Service0 . – 0-service.yaml7 – Service7 ■Service0Service0 [1/3]kind: ServiceapiVersion: v1metadata:name: rest-api-servicespec:type: NodePortselector:app: my-rest-apiports:- port: 8080targetPort: 8080$ kubectl create -f service.yamlService01Nodeport7)5minikube-1LoadBalancer1Pod0Lavel/ app:my-rest-api!$'6,"5Pod7%5)5Service0<=:.Pod0<=:7%5$ kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.0.0.1 443/TCP 11hrest-api-service 10.0.0.51 8080:31372/TCP 1m
30■ Service – Node IP– ■Deployment – v2Service [2/3]$ minikube ip192.168.99.100http://192.168.99.100:31372apiVersion: apps/v1beta1kind: Deploymentmetadata:name: rest-api-depspec:replicas: 4template:metadata:labels:app: my-rest-apispec:containers:- image: docker.io/uls555/getting-started-k8s-with-java:v2imagePullPolicy: Alwaysname: rest-apiv2
31■Deployment– ■ Deployment&)-'!"%+ #/$*&0'.0,/ $*&0' – ■Deployment.0-($– .0-($– Service[3/3]$ kubectl apply -f deployment.yamldeployment "rest-api-dep" replaced$ curl 192.168.99.100:31372{"message":"Hello World!","version":"v2"}$ kubectl rollout undo deployment/rest-api-depdeployment "rest-api-dep" rolled back$ curl 192.168.99.100:31372{"message":"Hello World!","version":"v1"}
32Deployment0#.!'&:<9;31586<7+% )-,/( Blue/Green Deployment*(0-+Service0"-. .■)Deployment0 – *&deployment-v3.yaml0 – 68:2Service0"$Blue/Green Deployment[1/2]apiVersion: apps/v1beta1kind: Deploymentmetadata:name: rest-api-dep-v3spec:replicas: 3template:metadata:labels:app: my-rest-api-v3spec:containers:- image: docker.io/uls555/getting-started-k8s-with-java:v1imagePullPolicy: Alwaysname: rest-apiDeployment* '430v3)$ kubectl create –f deployment-v3.yaml
33– Deployment■Service– ServicePod selector– ServiceBlue/Green Deployment[2/2]$ kubectl get deploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGErest-api-dep 4 4 4 4 3hrest-api-dep-v3 4 4 4 4 23mkind: ServiceapiVersion: v1metadata:name: rest-api-servicespec:type: NodePortselector:app: my-rest-api-v3ports:- port: 8080targetPort: 8080PodLavel app:my-rest-api-v3Pod $ kubectl apply -f service.yamlservice "rest-api-service" configured$ curl 192.168.99.100:31372{"message":"Hello World!","version":"v3"}
5.
35■minikube start%*– Node– ”.minikube”!("&minikube"%#'$* )$ minikube stop$ minikube delete$ minikube start
36>■ WEB1-5– Using Kubernetes on Google Container Enginehttps://www.slideshare.net/enakai/using-kubernetes-on-google-container-engine– Docker& %$2 @Kubernetes@https://oss.sios.com/yorozu-blog/yorozu-20151216– Docker0=46, )!(Kuberneteshttp://tech.uzabase.com/entry/2015/02/13/180743– minikube Windows " Kubernetes ,)http://takaya030.hatenablog.com/entry/2017/04/30/191727– kubernetes +)23-; 9-.<1?72'!&'!http://sssslide.com/speakerdeck.com/sgeengineer/kubernetesdebian-warukai-fa-sutairu-maikurosabisuziyanakutemoiiziyanai– Kubernetes +*)http://qiita.com/t-yotsu/items/f565b2d788a3b98fe762■ – 8– WEB+DB-PRESS Vol.99