Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

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

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

Avatar for Kazuhiko Yamashita

Kazuhiko Yamashita

November 28, 2019
Tweet

More Decks by Kazuhiko Yamashita

Other Decks in Programming

Transcript

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

    pack build <image name> --builder xxxx/tech-php-builder:0.0.1 ΞϓϦέʔγϣϯίʔυͷϦϙδτϦͰίϚϯυΛଧ͚ͭͩͰ ͦͷΞϓϦέʔγϣϯ͕ಈ͘ίϯςφΠϝʔδ͕ੜ੒͞ΕΔ
  2. 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ϑΣʔζͰ͸ίϯςφʹඞཁͳࢿ࢈ͷ ΠϯετʔϧͳͲΛϓϥΨϒϧʹఆٛ͢Δ ͜ͱ͕Ͱ͖Δ
  3. 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ͷґଘղܾΛ ͠ͳ͕ΒͦΕͧΕͷϑΣʔζΛ࣮ߦ
  4. 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 Λߋ৽ͯ͠΍Ε͹ ͋ͱ͸͢΂ͯϓϥΨϒϧʹॲཧ͞ΕΔ
  5. ҙࢥܾఆλΠϛϯά͕ܾఆతʹҧ͏ Dockerfile CNB DockerfileʹOpenSSL1.0Λ࢖͏ͱॻ͘ docker build ※ CNBʹɺ؀ڥʹΑͬͯOpenSSL1.1ɺ1.0Λ ࢖͏ίʔυΛॻ͘ pack

    buid OpenSSL 1.0Λ࢖͏Πϝʔδര஀ OpenSSL 1.1ɺ1.0ͷར༻͕ΞϓϦέʔγϣ ϯίʔυΛج४ͱͨ͠ͰҙࢥܾఆʹΑͬͯ બ͹Εͨϝʔδര஀ ※ɹϏϧυ࣌ʹ؀ڥม਺ͳͲͰڍಈΛมߋ͢Δ͜ͱ͸΍Ζ͏ͱࢥ͑͹Ͱ͖Δ
  6. tecktoncd/pipeline֓ཁ Pipeline1 Task1 Task2 Task3 Pipeline2 Task4 Task5 Task6 Pipeline

    Run parameter parameter Task͝ͱʹΞ΢τϓοτΛ ޙଓʹҾ͖౉ͤΔ 5BTLɺ1JQFMJOFͱҙຯͷ͋Δ୯ҐͰϦιʔεΛఆٛՄೳ ͦΕʹΑΓ࠶ར༻Ͱ͖ΔύΠϓϥΠϯ͕࣮ݱͰ͖Δ
  7. CNDύΠϓϥΠϯ Task1 ΞϓϦέʔγϣϯΛݩʹɺ
 ࠷৽ͷΠϝʔδΛϏϧυͯ͠ Private Repo΁push Task2 ࠷৽ͷΠϝʔδΛk8sʹ
 σϓϩΠ͢Δ Pipeline

    Run parameter parameter repository: lolipop/www image: lolipop-www commit_hash: xxxxxxxx ϦϙδτϦ͕૿͑ͯ΋ɺ1JQFMJOF3VOΛ௥Ճ͢Δ͚ͩͰ ࠷৽ͷΠϝʔδ͕࡞੒͞ΕΔ
  8. inside k8s k8s pod service ingress The internet pod service

    pod service each user • Ϣʔβʔ͝ͱͷϦιʔε͸ɺKustomizeΛར ༻ͯ͠ஔ׵ͯ͠deploymentsΛapply • ໊લղܾʹ͸external dnsΛར༻ • ূ໌ॻͷൃߦ͸cert-managerΛར༻ • ingressʹPublicIPΛ෇༩͠ɺ֎෦͔ΒͷΞ ΫηεੑΛ֬อ ip
  9. 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
  10. 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໊Λ ౉͢͜ͱͰূ໌ॻΛར༻Մೳ
  11. Telepresence https://www.telepresence.io/ $ telepresence --swap-deployment hello-world --docker-run --rm -it -v

    $(pwd):/ usr/src/app hello-dev ίϚϯυҰͭͰखݩͷϓϩηεͱLTΛ ૒ํ޲ʹϙʔτϑΥϫʔυ͢Δ͜ͱ͕Ͱ͖Δ
  12. ࣗݾम෮.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