CloudNative Buildpacksで創る、CloudNativeな開発体験

CloudNative Buildpacksで創る、CloudNativeな開発体験

CloudNative Buildpacks(CNB)はCNCF Sandboxとして開発が行われているプロジェクトです。 CNBを利用するとアプリケーションのコードを元に意思決定を行い、OCI Image Format specに準拠したイメージを作成することができます。

話し手の所属する企業は複数のプログラミング言語やバージョンが散在するサービスを開発、運用しており、複雑化する開発環境構築、デプロイ手順の煩雑化が課題としてありました。話し手はそういった課題をCNBとKubernetesを利用したパイプラインによって、なめらかに開発環境をコンテナ化し、Telepresenseを用いて共有、専有を組み合わせた開発環境を実現しました。

本セッションでは多くの開発環境を抱える企業においてCNBとKubernatesを組み合わせ、CloudNativeな開発環境構築、デプロイフローを構築したノウハウ、実例をご紹介します

1b838da2065660793d5b26f2cdc32de7?s=128

Kazuhiko Yamashita

November 28, 2019
Tweet

Transcript

  1. 4.
  2. 6.
  3. 7.
  4. 28.

    CNBΛ༻͍ͨίϯςφϏϧυ PSHBQJ QIQ PSHXXX 1)1 PSHJOGSB 1)1 PSHCMPH 1)1 %

    pack build <image name> --builder xxxx/tech-php-builder:0.0.1 ΞϓϦέʔγϣϯίʔυͷϦϙδτϦͰίϚϯυΛଧ͚ͭͩͰ ͦͷΞϓϦέʔγϣϯ͕ಈ͘ίϯςφΠϝʔδ͕ੜ੒͞ΕΔ
  5. 31.

    build #!/bin/sh apt install ruby if [ $openssl = "1.1"

    ]then; apt install opnessl-1.1 else apt install openssl fi bundle install • detectϑΣʔζͰར༻͢Δͱ൑ఆ͞Εͨ CNBͷbuild͕ݺͼग़͞ΕΔ • buildϑΣʔζͰ͸ίϯςφʹඞཁͳࢿ࢈ͷ ΠϯετʔϧͳͲΛϓϥΨϒϧʹఆٛ͢Δ ͜ͱ͕Ͱ͖Δ
  6. 32.

    CNBͷ࣮ߦ֓ཁ ruby-cnb bin/detect bin/build php-cnb bin/detect bin/build node-cnb bin/detect bin/build

    lifecycle Ruby͸Πϯετʔϧ͢Δʁ PHPίϯύΠϧ͠·͢Ͷ lifecycleͱ͍͏CNBͷSpec࣮૷͕ɺͦΕͧΕͷCNBͷґଘղܾΛ ͠ͳ͕ΒͦΕͧΕͷϑΣʔζΛ࣮ߦ
  7. 38.

    CNBΛ༻͍ͨίϯςφϏϧυ(࠶ܝ) PSHBQJ QIQ PSHXXX 1)1 PSHJOGSB 1)1 PSHCMPH 1)1 %

    pack build <image name> --builder xxxx/tech-php-builder:0.0.1 Ϗϧυ༻ͷϓϩάϥϜ CVJMEFSJNBHF Λߋ৽ͯ͠΍Ε͹ ͋ͱ͸͢΂ͯϓϥΨϒϧʹॲཧ͞ΕΔ
  8. 39.

    ҙࢥܾఆλΠϛϯά͕ܾఆతʹҧ͏ Dockerfile CNB DockerfileʹOpenSSL1.0Λ࢖͏ͱॻ͘ docker build ※ CNBʹɺ؀ڥʹΑͬͯOpenSSL1.1ɺ1.0Λ ࢖͏ίʔυΛॻ͘ pack

    buid OpenSSL 1.0Λ࢖͏Πϝʔδര஀ OpenSSL 1.1ɺ1.0ͷར༻͕ΞϓϦέʔγϣ ϯίʔυΛج४ͱͨ͠ͰҙࢥܾఆʹΑͬͯ બ͹Εͨϝʔδര஀ ※ɹϏϧυ࣌ʹ؀ڥม਺ͳͲͰڍಈΛมߋ͢Δ͜ͱ͸΍Ζ͏ͱࢥ͑͹Ͱ͖Δ
  9. 45.

    tecktoncd/pipeline֓ཁ Pipeline1 Task1 Task2 Task3 Pipeline2 Task4 Task5 Task6 Pipeline

    Run parameter parameter Task͝ͱʹΞ΢τϓοτΛ ޙଓʹҾ͖౉ͤΔ 5BTLɺ1JQFMJOFͱҙຯͷ͋Δ୯ҐͰϦιʔεΛఆٛՄೳ ͦΕʹΑΓ࠶ར༻Ͱ͖ΔύΠϓϥΠϯ͕࣮ݱͰ͖Δ
  10. 46.

    CNDύΠϓϥΠϯ Task1 ΞϓϦέʔγϣϯΛݩʹɺ
 ࠷৽ͷΠϝʔδΛϏϧυͯ͠ Private Repo΁push Task2 ࠷৽ͷΠϝʔδΛk8sʹ
 σϓϩΠ͢Δ Pipeline

    Run parameter parameter repository: lolipop/www image: lolipop-www commit_hash: xxxxxxxx ϦϙδτϦ͕૿͑ͯ΋ɺ1JQFMJOF3VOΛ௥Ճ͢Δ͚ͩͰ ࠷৽ͷΠϝʔδ͕࡞੒͞ΕΔ
  11. 48.
  12. 54.

    inside k8s k8s pod service ingress The internet pod service

    pod service each user • Ϣʔβʔ͝ͱͷϦιʔε͸ɺKustomizeΛར ༻ͯ͠ஔ׵ͯ͠deploymentsΛapply • ໊લղܾʹ͸external dnsΛར༻ • ূ໌ॻͷൃߦ͸cert-managerΛར༻ • ingressʹPublicIPΛ෇༩͠ɺ֎෦͔ΒͷΞ ΫηεੑΛ֬อ ip
  13. 55.

    external-dns --- apiVersion: v1 kind: Service metadata: annotations: external-dns.alpha.kubernetes.io/hostname: lolipop-www.example.dev

    service Any Backend https://github.com/kubernetes-sigs/external-dns external-dns-controller
  14. 57.

    cert-manager --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-ingress-controller spec:

    [snip] containers: - args: - /nginx-ingress-controller - "--default-backend-service=$(POD_NAMESPACE)/default-http-backend" - "--default-ssl-certificate=$(POD_NAMESPACE)/cert-wildcard" OHJOYJOHSFTTͷҾ਺ʹอଘͨ͠4FDSFU໊Λ ౉͢͜ͱͰূ໌ॻΛར༻Մೳ
  15. 62.

    Telepresence https://www.telepresence.io/ $ telepresence --swap-deployment hello-world --docker-run --rm -it -v

    $(pwd):/ usr/src/app hello-dev ίϚϯυҰͭͰखݩͷϓϩηεͱLTΛ ૒ํ޲ʹϙʔτϑΥϫʔυ͢Δ͜ͱ͕Ͱ͖Δ
  16. 65.

    ࣗݾम෮.sh #!/bin/bash set -x while true; do deployments=`kubectl -n example

    get deployment -o json | jq -r '.items[] | select(.spec.replicas == 0) | .metadata.name'` if [ -n "$deployments" ]; then echo "$deployments" | while read line do (curl -o /dev/null -s -w '%{http_code}\n' https://$line.example.dev |grep 502) && \ (kubectl -n example delete deployments $(kubectl -n example get deployments | grep "$line-" | awk '{print $1 }') && \ kubectl -n example scale deployment.apps/$line --replicas=1) done fi sleep 10 # ಉ͡deployments͕ෳ਺͋Δ͔ͭɺૄ௨ੑ͕͋ΔͳΒ͹ɺͦΕ͸telepresence࢖༻தʹmaster͕σϓϩΠ͞ΕͨՄೳੑ͕ߴ͍ deployments=`kubectl -n example get deployment -o json | jq -r '.items[] | select(.spec.replicas == 1) | .metadata.name' | sort` echo "$deployments" | while read line do ([ `echo "$deployments" | grep $line | wc -l` -ge 2 ] && !(curl -o /dev/null -s -w '%{http_code}\n' https:// $line.example.dev |grep 502)) && \ kubectl -n example scale deployment.apps/$line --replicas=0 done done
  17. 67.
  18. 71.