$30 off During Our Annual Pro Sale. View Details »

Kubernetes超入門 with java

Kubernetes超入門 with java

2017.10.27 広島Javaユーザーグループ で行ったKubernetes ハンズオン資料です。

Yasunari Tanaka

October 27, 2017
Tweet

More Decks by Yasunari Tanaka

Other Decks in Technology

Transcript

  1. Kubernetes with Java
    Kubernetes

    Java
    #hirojug

    View Slide

  2. 1
    -
    -
    $! +#
    &(#
    -
    ,%+&",
    Java),,*,%
    '*

    Twitter-@7richi

    View Slide

  3. 2
    5:)Oracle Code Japan Tour in Hiroshima*;)Cloud Native Java
    EE*LMJRT7KubernetesD14SFPIVNETHNQD56&,4
    .UUU
    Kubernetes:%16+=@ .-544>'3;
    7.CB4-+
    =@7/6,9-54;.-54(W?>X
    307'Kubernetes:%2A 9;8 ;OTKGTD
    "16Kubernetes$;

    View Slide

  4. 1.

    View Slide

  5. 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+/
    ,!.*/

    View Slide

  6. 5
    -2/=5
    ■Kubernetes&
    ■<>1;
    &
    ■8=30=
    – Pod#&69<.
    – Replica Set+69<.
    – Deployment+69<.
    – Service&
    – Service+Blue/Green Deployment

    – 0>9=4:7>2018?

    – *# )!$(%
    – "',

    View Slide

  7. 2. Kubernetes

    View Slide

  8. 7
    ■miniKube
    – Windows exe (minikube-windows-amd64.exe)
    https://github.com/kubernetes/minikube/releases


    View Slide

  9. 8
    mOp_uZzizJn[xFDockerNG=L[\bo{YxbeUzX\dvz[rxazu|1
    GoogleA-/+:M@5LYxbeWs\_[\bo2Borg3AF
    gShSN/;@-:M>1GApachesQ]x\A,:M@5L
    Uzlx^z\^kdSTOA4L1
    nQWwZzj\NEclwQ0O`lczd=L$B;@0YxbeF
    Uzd\Xzu0 Blue Green Deployment 0 Rolling Update DCF$
    N7@5L1
    ?DHE2Kubernetes3G0Vt[q(A2%F!32 #y,#3B56
    94LB:M12k8s3B:M'*:ML9 51
    {8GK8KsF.F
    N&;@5L|
    )HG2WzmzfPb\3J2WRifPb\3}
    KubernetesBG

    View Slide

  10. 9
    ■2014 66
    ■2015 76.5*141.0335+
    ■2015 76Linux Foundation&Cloud Native Computing Fou
    ndation(CNCF)%
    (AT&TCiscoCoreOSDockerIBMIntelMicrosoftRed HatVM
    ware$#&%
    ()
    ■2017 86AWSCNCF%04.5&/2,-"

    )'!& $

    View Slide

  11. 10
    ]udh+O NQR4Wlq\v_ouOeltXP%N>4)

    %N*;SQ:NMGF5A@
    CIHO^vj`KAIBS-=8S5w!NmX[t^vj`%MW
    ltvbJPxE?J]udh0O.= KMR2O&ML/$3
    U(AF 4,]udhU'#BS_`dn=-KMGF5
    6AWS76Microsoft Azure76Google Cloud Platform76IBM Bluemix7ML
    O-[pYgltiXav=CNCFONMGFNQR4"OK?T]u
    dhZv\`fsv_oucvrKAIKubernetesPekV[fK9;SN
    MRHH8S
    ■KubernetesOZv\`fsv_oucvr
    Docker Swarm4Amazon EC2 Container ServiceML=8S
    MD]udhZv\`fsv_oucvr=-NMGFO<

    View Slide

  12. 11
    ■1%PGOCa…frgp}
    – d„y%YGCPAAWSLBJKXk8s_;GK7A='H]M(RUM
    `N)&GOC
    ■j„ru2PGOCj„ru1%
    – j„ru2%Q8PZ\Open Container InitiativeEru#LB^SDockerQj„ru2LXZC
    ■3zmtPj„ru_sy‚c
    – NQzmtPNQj„ru_>H]D_@0
    ■j„ru?Qvqtƒ…g,$† 6!XV‡
    – k…xmsbmew€…+Q-
    ■j„ruQ"*5
    – j„ruE`I[Aj„ru_.L4:
    ■j„ruQ9/
    – -Q3j„ruTQagnmw„l„h-
    ■j„ruQ€o…ma‚i…l~„
    – j„ru PCPU€o…mY{|€…€o…mQ
    -
    KubernetesR_GKF^]QD

    View Slide

  13. 12

    %

    #Ingress$
    Kubernetes

    Cluster
    Node
    Pod
    " !
    Service
    Ingress
    internet
    Node
    Pod
    " !
    Node
    Pod
    " !
    Service

    View Slide

  14. 13
    ■Node/Cluster
    Node^cIk8sbv€„n‡ŽpVlYgbVM`KT24w…bR^J
    k8sn94Vl‰=dIŠxN) Vl\bv€„NRmj
    Node]@SmlJNodebHnCliuter^e
    ■Pod
    k8s]b‡Žpb,!JPodc“bv€„bH]INode
    a"FSmlk8s-b0$J
    Podb3#c&TYv€„c\+aUNodea‡ŽpSmlJRm
    aik<VlA*b‡Ž{z‘v€„’]1%SmY“Zbo‡uy‹
    ]LKnBZQhVPT“ZbH^T\‡Žp/l
    ‘”…z‡Žry^o‡uy‹Io‡uy‹b†Ž‚^…sq
    ƒ`_b:W’
    – Pod bv€„clocalhost;6]D
    ]Ol
    – EMj8(Podfcos{zc/`K
    – Label:k8s]94Sm\Kl|zc>a[O?7a.I‡ŽpS
    mlNXbGaŒ~ˆ`N?7a'jmlIXmjnBZQhVPVlY
    gPoda T\}tnVlR^N/l
    Kubernetesb5C[1/3]

    View Slide

  15. 14
    ■Service
    $Pod?8;IPK]hVJ
    G;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@OM
    fKVJ9H/6I?A_kUdj1.7@kube-dns3%
    Kubernetes@'[2/3]

    View Slide

  16. 15
    ■Ingress
    IngressYServiceW[]ICAdServiceW{€joNaDHTTP
    €‚vx|nW-MR8LbREa,CL7SXURLyq‚W_a~‚
    sfl^SSL43 /VUX<]7FaD\PCIngressYk8sH2M
    REa0W_QR*6T8HGcaCGCPSYGCPXCAWSSYAWS
    X0W QPS{€joH Lba
    ■Replica Set
    PodX{}i$ƒPodXmsw$„d5!/=Na*6DmswH"
    MP{}i$_`]VE Y%PWmswd?MCFNJRa
    Ymswd
    BM{}i$d5!Na
    ■Deployment
    Pod^Replication SetsX:er{t‚u*6d#DDeploymenth
    zpgkuS(Na.d;@NbZDeployment ControllerH9+M
    P.W&MRKba
    OXW]Kubernetes'X)C1>H$Na
    KubernetesX1>[3/3]

    View Slide

  17. 3.

    View Slide

  18. 17
    Minikube"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 Master
    Node
    (1!#)

    View Slide

  19. 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<-'&G7
    O?,!
    ■ 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,kubernetes
    2%0
    $ minikube config set vm-driver virtualbox
    $ minikube start
    $ minikube version

    View Slide

  20. 4.

    View Slide

  21. 20
    /8*#8 Docker6()-4
    Spring Boot
    REST APIDocker"29(! Kubernetes&8+.#9%)-
    69'38!
    ■Docker6()-4
    – docker.io/uls555/getting-started-k8s-with-java
    ■,07"
    /8*#8
    Docker Hub
    79$51'98
    Docker Image

    REST API
    minikube
    push
    pull



    View Slide

  22. 21

    REST API
    REST API
    Docker Hub

    Docker Image

    REST API
    minikube

    View Slide

  23. 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:30000O
    Pod(,@EL8[1/2]
    apiVersion: v1
    kind: Pod
    metadata:
    name: rest-api
    spec:
    containers:
    - image: docker.io/uls555/getting-started-k8s-with-java:v1
    imagePullPolicy: Always
    name: rest-api
    $ kubectl create -f pod.yaml
    $ kubectl get pods
    NAME READY STATUS RESTARTS AGE
    rest-api 0/1 ContainerCreating 0 1m
    8HM;,

    View Slide

  24. 23
    nPod
    Pod
    [2/2]
    $ kubectl delete pod rest-api

    View Slide

  25. 24
    Pod/ "$Pod "$+,
    /%$
    +*) !.*Replica Set/"&+Pod/ #-
    ■Replica Set+
    (
    – +'replicaset.yaml/
    – Replica Set/
    Replica Set/"$1230[1/2]
    apiVersion: extensions/v1beta1
    kind: ReplicaSet
    metadata:
    name: rest-api-rs
    spec:
    replicas: 3
    template:
    metadata:
    labels:
    app: my-rest-api
    spec:
    containers:
    - image: docker.io/uls555/getting-started-k8s-with-java:v1
    imagePullPolicy: Always
    name: rest-api
    $ kubectl create -f replicaset.yaml
    #-Pod+
    Pod+

    View Slide

  26. 25
    ■Pod
    ■Pod
    Replica SetPod " Pod"
    Pod
    – Pod
    ■Replica Set
    Replica Set"$%[2/2]
    $ kubectl get pod
    NAME READY STATUS RESTARTS AGE
    rest-api-rs-6xpqf 1/1 Running 0 1m
    rest-api-rs-m1x43 1/1 Running 0 1m
    rest-api-rs-pbsmk 1/1 Running 0 1m
    $ kubectl delete pod rest-api-rs-m1x43
    $ kubectl get pod
    NAME READY STATUS RESTARTS AGE
    rest-api-rs-6xpqf 1/1 Running 0 4m
    rest-api-rs-m1x43 1/1 Terminating 0 4m
    rest-api-rs-n92wz 0/1 ContainerCreating 0 5s
    rest-api-rs-pbsmk 1/1 Running 0 4m
    !Pod

    !Pod
    $ kubectl delete replicaset rest-api-rs

    View Slide

  27. 26
    Replica Set0!/$ k8s&-%Deployment0
    !/$&,.6;?2' k8s&/"+'9A4=@&
    &
    /$/
    ■Deployment'$6;?2
    – '#deployment.yaml0
    – 6;?2
    Deployment0 "6;?2[1/3]
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
    name: rest-api-dep
    spec:
    replicas: 3
    template:
    metadata:
    labels:
    app: my-rest-api
    spec:
    containers:
    - image: docker.io/uls555/getting-started-k8s-with-java:v1
    imagePullPolicy: Always
    name: rest-api
    <8:357:12>(
    RepulicsSet$)*
    $ kubectl create -f deployment.yaml

    View Slide

  28. 27
    ■Pod
    ■Deployment
    – Replicas4

    Deployment [2/3]
    $ kubectl get pods
    NAME READY STATUS RESTARTS AGE
    rest-api-rs-6xpqf 1/1 Running 1 9h
    rest-api-rs-n92wz 1/1 Running 1 9h
    rest-api-rs-pbsmk 1/1 Running 1 9h
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
    name: rest-api-dep
    spec:
    replicas: 4
    template:
    metadata:
    labels:
    app: my-rest-api
    spec:
    containers:
    - image: docker.io/uls555/getting-started-k8s-with-java:v1
    imagePullPolicy: Always
    name: rest-api
    replica4

    View Slide

  29. 28
    ■Deployment
    – Deployment
    ■Pod
    – Pod14
    Deployment
    [3/3]
    $ kubectl get pods
    NAME READY STATUS RESTARTS AGE
    rest-api-rs-6xpqf 1/1 Running 1 9h
    rest-api-rs-9b0sl 1/1 Running 0 10s
    rest-api-rs-fbcdf 0/1 ContainerCreating 0 10s
    rest-api-rs-pbsmk 1/1 Running 1 9h
    $ kubectl apply -f deployment.yaml

    View Slide

  30. 29
    Service7 (,&62- (*Pod7+0/(*8=;97
    5..3/#407Pod/)5
    ■Service0 .
    – 0
    -service.yaml7
    – Service7
    ■Service0
    Service0 [1/3]
    kind: Service
    apiVersion: v1
    metadata:
    name: rest-api-service
    spec:
    type: NodePort
    selector:
    app: my-rest-api
    ports:
    - port: 8080
    targetPort: 8080
    $ kubectl create -f service.yaml
    Service01Nodeport7)5
    minikube-1LoadBalancer1
    Pod0Lavel/ app:my-rest-api!$
    '6,"5Pod7%5
    )5Service0<=:.Pod0<=:7
    %5
    $ kubectl get services
    NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes 10.0.0.1 443/TCP 11h
    rest-api-service 10.0.0.51 8080:31372/TCP 1m

    View Slide

  31. 30

    Service
    – Node IP


    ■Deployment
    – v2
    Service [2/3]
    $ minikube ip
    192.168.99.100
    http://192.168.99.100:31372
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
    name: rest-api-dep
    spec:
    replicas: 4
    template:
    metadata:
    labels:
    app: my-rest-api
    spec:
    containers:
    - image: docker.io/uls555/getting-started-k8s-with-java:v2
    imagePullPolicy: Always
    name: rest-api
    v2

    View Slide

  32. 31
    ■Deployment

    ■ Deployment
    &)-'!"%+ #/$*&0'
    .0,/ $*&0'

    ■Deployment.0-($
    – .0-($

    Service[3/3]
    $ kubectl apply -f deployment.yaml
    deployment "rest-api-dep" replaced
    $ curl 192.168.99.100:31372
    {"message":"Hello World!","version":"v2"}
    $ kubectl rollout undo deployment/rest-api-dep
    deployment "rest-api-dep" rolled back
    $ curl 192.168.99.100:31372
    {"message":"Hello World!","version":"v1"}

    View Slide

  33. 32
    Deployment0#.!'&:<9;31586<7+% )-
    ,/( Blue/Green Deployment*(0-
    +Service
    0"-. .
    ■)Deployment0
    – *&deployment-v3.yaml0
    – 68:2
    Service0"$Blue/Green Deployment[1/2]
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
    name: rest-api-dep-v3
    spec:
    replicas: 3
    template:
    metadata:
    labels:
    app: my-rest-api-v3
    spec:
    containers:
    - image: docker.io/uls555/getting-started-k8s-with-java:v1
    imagePullPolicy: Always
    name: rest-api
    Deployment* '4
    30v3)
    $ kubectl create –f deployment-v3.yaml

    View Slide

  34. 33
    – Deployment
    ■Service
    – ServicePod
    selector


    ServiceBlue/Green Deployment[2/2]
    $ kubectl get deployment
    NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
    rest-api-dep 4 4 4 4 3h
    rest-api-dep-v3 4 4 4 4 23m
    kind: Service
    apiVersion: v1
    metadata:
    name: rest-api-service
    spec:
    type: NodePort
    selector:
    app: my-rest-api-v3
    ports:
    - port: 8080
    targetPort: 8080
    PodLavel app:my-rest-api-v3
    Pod
    $ kubectl apply -f service.yaml
    service "rest-api-service" configured
    $ curl 192.168.99.100:31372
    {"message":"Hello World!","version":"v3"}

    View Slide

  35. 5.

    View Slide

  36. 35
    ■minikube start%*
    – Node

    ”.minikube”!("&minikube

    "%#'$* )
    $ minikube stop
    $ minikube delete
    $ minikube start

    View Slide

  37. 36
    >

    ■ WEB1-5
    – Using Kubernetes on Google Container Engine
    https://www.slideshare.net/enakai/using-kubernetes-on-google-container-engine
    – Docker& %$2 @Kubernetes@
    https://oss.sios.com/yorozu-blog/yorozu-20151216
    – Docker0=46, )!(Kubernetes
    http://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

    View Slide