Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C#エンジニアのためのdocker kubernetesハンズオン (再)

394 views

Published on

2019/9/10のハンズオン資料

Published in: Technology
  • Be the first to comment

  • Be the first to like this

C#エンジニアのためのdocker kubernetesハンズオン (再)

  1. 1. C#エンジニアのための dockerコンテナ・ kubernetesハンズオン 2019/09/10 #csharptokyo @tanaka_733 今日のアンケート
  2. 2. 自己紹介 Senior Technical Support Engineer @ New Relic K.K. ◦ アプリケーションプラットフォーム監視(APM)のSaaSです ◦ Observability(可観測性)の獲得を助けます ◦ 日本語サポート開始しました Microsoft MVP for Azure ◦ .NET Core on Linux, Kubernetes, Azureなどのお仕事してました ◦ Visual StudioやQ#などにも興味があります ソーシャル活動 ◦ Twitter: @tanaka_733 ◦ Blog: 銀の光と碧い空
  3. 3. 【宣伝1】 n月刊ラムダノート https://www.lambdanote.com/collections/n
  4. 4. 今日のテーマ C# (.NET Core)アプリをコンテナ・kubernetesで動かしてみよう コンテナとは コンテナハンズオン kubernetesとは kubernetesハンズオン 【宣伝2】New Relicでkubernetes上の.NET Coreアプリを監視
  5. 5. コンテナ
  6. 6. dockerとコンテナ https://docs.microsoft.com/ja-jp/dotnet/standard/containerized-lifecycle-architecture/what-is-docker
  7. 7. docker engine https://docs.docker.com/engine/docker-overview/
  8. 8. dockerのしくみ https://docs.docker.com/engine/docker-overview/
  9. 9. コンテナイメージ 差分を積み重ねて構成 実体はバイナリファイル群
  10. 10. コンテナイメージ(例) 公式イメージ(aspnet) 設定、追加ソフトウェア アプリケーション
  11. 11. 実質同じコンテナイメージ 公式イメージ(aspnet) 設定、追加ソフトウェア アプリケーション レイヤー順が違っても、 実質同じ内容のコンテナイメージになりうる
  12. 12. イメージの更新を効率よくするには 頻繁に変更されるレイヤーが最後 アプリケーションがスタックの下だと そこから上の差分を すべて更新しないといけなくなる アプリケーションが一番上だと その層だけの更新でOK
  13. 13. コンテナイメージの作成 コンテナを実際に起動して、 手動で変更を加えて docker saveコマンドで 新しいイメージを作成できる FROM aspnet:2.2 AS COPY --from=publish /app /app ENTRYPOINT ["dotnet", "App.dll" ] Dockerfileというファイルに 作成する手順を記入して docker build する
  14. 14. .NET Coreでコンテナ コンテナのメリットは「可搬性」  どこでも動く .NET Core自体がクロスプラットフォーム前提 ◦ 例えば開発マシン(Win or Mac)とコンテナ(Linuxコンテナ)で同じアプリを動かせる ASP.NET CoreがKestrelなど軽量Webサーバーをサポートしているので、 IISなどの重いWebサーバーをコンテナに入れなくてすむ コンテナという広く使われている技術の上で動かすアプリケーションの開発言語として .NET Core (C#)を採用できる!
  15. 15. ハンズオンで利用する環境 Katacode ◦ ブラウザ上のターミナルからLinuxサーバーを操作できます ◦ ハンズオンの手順がWebページで表示されます ◦ Linuxサーバーがインターネットに公開できないので外部からの接続ができない ◦ HTTPはプロキシ経由で可能 Docker Desktop ◦ DockerのハンズオンはこれでもOK minikube ◦ kubernetes環境をローカルマシン上で動かせる AKS, EKSなど ◦ 運用にも使えるマネージドサービス ◦ ハンズオンだけのために使うには利用料が…
  16. 16. ハンズオン https://www.katacoda.com/tanaka_733/scen arios/csharp-kubernetes
  17. 17. 【補足】 Dockerfile best practice https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage- build-cache の中で今回説明したもの Use multi-stage builds ◦ マルチステージビルドを使う Leverage build cache ◦ 変更されやすいものほど最後に書いて、キャッシュが効くようにする (書いていないが説明したもの) アプリケーションのコンパイルもDockerコンテナ内で完結させる ◦ ホストでコンパイルすると、環境依存になる ◦ 特にDockerビルドを行うクラウドサービスを使うとき、SDKがない場合がある
  18. 18. 【補足】マルチステージビルド FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish WORKDIR /src COPY . . RUN dotnet publish MyWebApp.csproj -c Release -o /app FROM base As final WORKDIR /app COPY --from=publish /app /app ENTRYPOINT [ "dotnet", "MyWebApp.dll" ] aspnet:2.2 base sdk:2.2 publish Runtimeのみ、軽量 SDK入り。重い。 ネットワーク設定等 dotnet publish ENTRYPOINT COPY ビルド成果物 こちらが最終的なdockerイメージ こっちは使われない csproj など一式 final
  19. 19. Dockerfileで利用した命令 FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish WORKDIR /src COPY . . RUN dotnet publish MyWebApp.csproj -c Release -o /app FROM base As final WORKDIR /app COPY --from=publish /app /app ENTRYPOINT [ "dotnet", "MyWebApp.dll" ] FROM ~ AS ~: ベースとなるイメージを 指定し 別名を付ける EXPOSE: 公開するポートの指定 WORKDIR: 作業ディレクトリの指定 RUN: 任意のコマンドを実行 COPY (--from=別名) FROM SOURCE FROMからSOURCEにファイルをコピーす る Fromがあれば指定した別名のコンテナから なければDockferファイルがあるホストから ENTRYPOINT: 起動時に最初に実行され るデフォルトコマンド
  20. 20. コンテナ を動かそ う
  21. 21. コンテナをどこで動かすか Docker単体 or コンテナオーケストレーター上 AWSなら ◦ EKS, ECS Azureなら ◦ ACI, AKS (コンテナでなければWebAppでも) GCPなら ◦ GKE コンテナ化することで、同じコンテナイメージをどこでも動かせる。 (サービスを使えば)サーバーレス風に動かすことも可能
  22. 22. コンテナオーケストレーター コンテナでアプリを動かすといろんな機能がほしくなる… ◦ コンテナをアプリケーションごとに指定した数だけ起動しておきたい ◦ ヘルスチェックしてエラーが出たら再起動したい ◦ コンテナイメージをバージョニングしてアプリをアップデートしたい ◦ ロードバランシングしたい ◦ 永続化データを保存するのでボリュームを管理したい ◦ etc… オーケストレーターの実装はいろいろあるが、 現状kubernetesがデファクトとなっている。
  23. 23. Kubernetes? https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/ 多くの場合、Node=仮想マシ ン コンテナとvolumeをまとめた もの。1つのアプリ。 今日作るPodはコンテナ1つ だけ。 永続化ストレージ コンテナ化したアプリ =さっき作ったコンテナイ メージ
  24. 24. kubernetesで動かすときに必要 Podの公開、ロードバランシング Podのオートスケーリング 外部サービス? Podのデプロイ Podのヘルスチェック
  25. 25. kubernetesの操作 kubectl というコマンドラインツールを利用 ◦ Windows、MacOS、Linuxで動作 非常に多くのサブコマンド、オプションがありコマンドで多くのことができる kubernetes内のオブジェクト(Node, Pod, Serviceなどなど)の全状態を確認したり、 生成したりする場合、YAMLフォーマットを使う場合が多いです。 kubectl get pods kubectl get services –o yaml kubectl create –f myapp.yaml kubectl delete pods mypod
  26. 26. Kubernetes ハンズオン
  27. 27. New RelicでObservability
  28. 28. アプリケーションの監視 (SaaS ダッシュボード) C#をはじめ複数言語 複数Framework サポート C#であれば .NET Framework, .NET Coreとも サポート
  29. 29. クラウドネイティブ環境を「見る」 ブラウザ アプリ モバイル アプリ API ロジック DB サーバー クラウド コンテナ
  30. 30. Kubernetes Explorer
  31. 31. Kubernetes上のアプリを New Relicで「見る」 New Relicにサインアップしてライセンスキーを取得する ◦ https://newrelic.co.jp/signup Kubernetesクラスターの監視をセットアップする ◦ 数コマンド程度の手順 アプリのコンテナにNew Relicエージェントを仕込む ◦ アプリケーションコードの変更不要 ◦ 同じコンテナ内にエージェントを追加して、 環境変数と起動オプション追加 (ASP.NET Coreの場合)
  32. 32. New Relicの.NET Coreコンテナ対応 基本的な流れはQiitaに書いてあります ◦ https://qiita.com/takayoshitanaka/items/6eef46d821704a7384dc 推奨手順はインストーラー実行なのでDockerfile内でインストール実行 ◦ インストーラー実行せずともdllやconfigなどを一式コピーしても動作することは確認 .NET CoreではkestrelおよびIISのみデフォルトで監視 ◦ コンテナ上のASP.NET Coreはデフォルトkestrelを利用
  33. 33. FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base ENV CORECLR_ENABLE_PROFILING=1 CORECLR_PROFILER={36032161-FFC0-4B61-B559-F6C5D41BAE5A} CORECLR_NEWRELIC_HOME=/usr/local/newrelic-netcore20-agent CORECLR_PROFILER_PATH=/usr/local/newrelic-netcore20-agent/libNewRelicProfiler.so ARG agent_version="8.16.567.0" RUN curl https://download.newrelic.com/dot_net_agent/previous_releases/${agent_version}/newrelic-netcore20- agent_${agent_version}_amd64.deb -o newrelic-netcore20-agent_${agent_version}_amd64.deb && dpkg -i newrelic-netcore20-agent_${agent_version}_amd64.deb && rm newrelic-netcore20-agent_${agent_version}_amd64.deb WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish WORKDIR /src COPY . . RUN dotnet publish <csprojファイルのパス> -c Release -o /app FROM base As final WORKDIR /app COPY --from=publish /app /app ENTRYPOINT [ "dotnet", "<publishしたdllのファイル名>" ] New Relic用のDockerfile例 環境変数の設定 (ライセンスキーとアプリ名は コンテナ起動時に指定するので ここでは省略) Agentのインストーラーを インターネットから取得してインストール
  34. 34. kubernetesのdeploymentに 環境変数を追加
  35. 35. まとめ Dockerコンテナ ◦ Dockerイメージを作ることでアプリケーションをOSまるごと可搬できる ◦ Dockerコマンドでdockerを操作 ◦ Dockerfileでイメージを作成 Kubernetes ◦ kubectlコマンドで操作 ◦ kubectlコマンドでdockerイメージを実行 ◦ YAMLファイルで複数オブジェクトをまとめて定義したり、編集できる New Relic ◦ C#の環境でもkubernetes環境でもObservabilityの獲得を助けます
  36. 36. アンケートに ご協力くださ い

×