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ハンズオン

508 views

Published on

2019/07/30に行ったハンズオンの説明資料です。

Published in: Technology
  • Be the first to comment

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

  1. 1. C#エンジニアのための dockerコンテナ・ kubernetesハンズオン 2019/07/30 #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. コンテナを 動かそう
  20. 20. コンテナをどこで動かすか Docker単体 or コンテナオーケストレーター上 AWSなら ◦ EKS, ECS Azureなら ◦ ACI, AKS (コンテナでなければWebAppでも) GCPなら ◦ GKE コンテナ化することで、同じコンテナイメージをどこでも動かせる。
  21. 21. コンテナオーケストレーター コンテナでアプリを動かすといろんな機能がほしくなる… ◦ コンテナをアプリケーションごとに指定した数だけ起動しておきたい ◦ ヘルスチェックしてエラーが出たら再起動したい ◦ コンテナイメージをバージョニングしてアプリをアップデートしたい ◦ ロードバランシングしたい ◦ 永続化データを保存するのでボリュームを管理したい ◦ etc… オーケストレーターの実装はいろいろあるが、 現状kubernetesがデファクトとなっている。
  22. 22. Kubernetes? https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/ 多くの場合、Node=仮想マシン コンテナとvolumeをまとめた もの。1つのアプリ。 今日作るPodはコンテナ1つだけ。 永続化ストレージ コンテナ化したアプリ =さっき作ったコンテナイメージ
  23. 23. kubernetesで動かすときに必要 Podの公開、ロードバランシング Podのオートスケーリング 外部サービス? Podのデプロイ Podのヘルスチェック
  24. 24. Kubernetes ハンズオン
  25. 25. New RelicでObservability
  26. 26. アプリケーションの監視 (SaaS ダッシュボード) C#をはじめ複数言語 複数Framework サポート C#であれば .NET Framework, .NET Coreとも サポート
  27. 27. クラウドネイティブ環境を「見る」 ブラウザ アプリ モバイル アプリ API ロジック DB サーバー クラウド コンテナ
  28. 28. Kubernetes Explorer
  29. 29. Kubernetes上のアプリを New Relicで「見る」 New Relicにサインアップしてライセンスキーを取得する ◦ https://newrelic.co.jp/signup Kubernetesクラスターの監視をセットアップする ◦ 数コマンド程度の手順 アプリのコンテナにNew Relicエージェントを仕込む ◦ アプリケーションコードの変更不要 ◦ 同じコンテナ内にエージェントを追加して、 環境変数と起動オプション追加 (ASP.NET Coreの場合)
  30. 30. New Relicの.NET Coreコンテナ対応 基本的な流れはQiitaに書いてあります ◦ https://qiita.com/takayoshitanaka/items/6eef46d821704a7384dc 推奨手順はインストーラー実行なのでDockerfile内でインストール実行 ◦ インストーラー実行せずともdllやconfigなどを一式コピーしても動作することは確認 .NET CoreではkestrelおよびIISのみデフォルトで監視 ◦ コンテナ上のASP.NET Coreはデフォルトkestrelを利用
  31. 31. 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のインストーラーを インターネットから取得してインストール
  32. 32. kubernetesのdeploymentに 環境変数を追加
  33. 33. まとめ Dockerコンテナ ◦ Dockerイメージを作ることでアプリケーションをOSまるごと可搬できる ◦ Dockerコマンドでdockerを操作 ◦ Dockerfileでイメージを作成 Kubernetes ◦ kubectlコマンドで操作 ◦ kubectlコマンドでdockerイメージを実行 ◦ YAMLファイルで複数オブジェクトをまとめて定義したり、編集できる New Relic ◦ C#の環境でもkubernetes環境でもObservabilityの獲得を助けます

×