
講師紹介とコース作成の背景を説明します。
Kubernetesの大まかな役割を3分で説明します。
このレクチャーでは、コースの全体構成と目的を説明します。
コース全体構成:
準備・基礎
Kubernetes概要
環境準備
kubectl
Kubernetes hands-on
Kubernetesのリソース紹介と練習
簡易アプリケーションのデプロイ
Kubernetesのdebug
Kubernetes関連
EKSクラスタの構築
CI/CD
コースの目的:
Kubernetes概要・役割を理解する
Kubernetesの基本リソースを理解する
Kubernetes上にアプリケーションをデプロイできるようになる
Kubernetes開発に必須な知識を習得する
マネージドKubernetesクラスタをAWS上に構築を体験する
CI/CDツールによるKubernetes上へデプロイの流れを理解する
注意事項
対象者:
アプリケーション開発をしたことがある
Dockerを使って開発をしたことがある
MacのPCを使っている
使うもの:
Macのパソコン
Docker Desktop (https://docs.docker.com/docker-for-mac/install/)
Visual Studio Code (https://code.visualstudio.com/)
GitHubのアカウント
AWSのアカウント (EKS構築用 ※数ドル程度費用がかかる)
Kubernetesの定義の確認とこれから説明していく順番と内容の紹介
(2021/07/23にコンテンツに更新を行いました。旧バージョンのコンテンツを見たい方は連絡下さい。オプションで公開するか検討いたします。)
コンテナのもともとの背景や、コンテナを導入することでアプリケーションを実行することにどのように変化が起きたのか、どんな部分が便利になったのかを簡単に復習します。
(2021/07/23にコンテンツに更新を行いました。旧バージョンのコンテンツを見たい方は連絡下さい。オプションで公開するか検討いたします。)
コンテナオーケストレーションという言葉は初めて聞くと、すぐには理解しづらい言葉なので、どういうことを指すのかをアプリケーションを運用することを考えてから、実際にオーケストレーションの機能を紹介していきます。
(2021/07/23にコンテンツに更新を行いました。旧バージョンのコンテンツを見たい方は連絡下さい。オプションで公開するか検討いたします。)
Kubernetes のアーキテクチャを紹介します。
Kubernetesの各コンポーネントを重要な概念とともに説明します。
各コンポーネントの役割をアーキテクチャとともに、理解することが目的です。
(2021/07/23にコンテンツに更新を行いました。旧バージョンのコンテンツを見たい方は連絡下さい。オプションで公開するか検討いたします。)
Docker Desktopをインストールします。
すでにインストール済みの方はスキップしてください。
Docker DesktopのKubernetes機能を有効化します。
すでに有効化されている方はスキップしてください。
Visual Studio Codeをインストールします。コースの中でYamlファイルを編集する際に使っています。
すでにVisual Studio Codeがインストールされている方や、自分の好きなテキストエディタがある方はスキップしてください。
kubectlを練習する前に、ローカルのKubernetesクラスタを起動しておく必要があります。
すでにKubernetesクラスタが起動できている方はスキップしてください。
(2022/11/13にコンテンツの更新を行いました)
kubectlがどんな役割を果たしているかをKubernetesのアーキテクチャ図とともに簡単に説明します。
今後の具体的なコマンドの紹介の前に、全体像を理解するのに重要なレクチャーとなっています。
(2021/08/03にコンテンツの更新を行いました)
kubectlをインストールします。
(2021/08/03にコンテンツの更新を行いました)
kubectlの設定ファイル kubeconfigを紹介します。
(2021/08/03にコンテンツの更新を行いました)
kubectlの基本構文を勉強します。
kubectl [command] [TYPE] [NAME] [flags] という引数にどんなものが入るのかを紹介します。
(2021/08/03にコンテンツの更新を行いました)
kubectlを使う上で、対象となるリソースタイプにどのようなものがあるのかを紹介します。
kubectlコマンドを使って確認ができるので、今後必要に応じて自分でその都度確認するときに有用なコマンドになります。
(2021/08/03にコンテンツの更新を行いました)
kubectlのさまざまな出力フォーマットについてよく使われるものをメインに紹介します。
普段から必要な情報に合わせて、出力フォーマットを使い分けている人が多いと思うので、マスターしましょう。
(2021/08/03にコンテンツの更新を行いました)
kubectlコマンドの中で一番良く使われる kubectl getです。リソースを表示することができ、オプションにより表示方法を柔軟に帰ることができます。
(2021/08/03にコンテンツの更新を行いました)
kubectl describeでは、リソースの詳細情報を表示することができます。例を交えて紹介します。
(2021/08/03にコンテンツの更新を行いました)
kubectl create/delete を用いてリソース作成と削除を行います。
Yamlファイルに内容を記述して作成・削除するパターンと直接コマンドの引数としてリソースタイプを指定するパターンの2つを紹介します。
(2022/11/13にコンテンツの更新を行いました)
kubectlでKubernetesオブジェクトを管理する際の3種類の手法を紹介します。
オブジェクトを管理する上で、どれか一つの手法を使う必要があるのでKubernetesでアプリケーションを運用していく上ではとても重要な内容になります。
(2021/08/03にコンテンツの更新を行いました)
今回のセクション全体で、ローカルのDocker DesktopのKubernetesクラスタに接続するので、接続できているかの確認方法を紹介します。
Docker DesktopのKubernetesが起動できていることの確認
kubeconfigの確認
このセクションで学んでいく内容を簡単に紹介します。
Pod説明+練習
Kubernetes Object
Kubernetesマニフェストファイル
各リソースの紹介と練習
Namespace (名前空間)
ReplicaSet (ワークロードリソース)
Deployment (ワークロードリソース)
ConfigMap (設定)
Secret (設定)
Service (ネットワーク)
Podの特徴について説明します。
Podは、1つまたは複数のコンテナを持つ
同一Pod内ではネットワークやストレージを共有リソースとして扱う
Podは、コンテナの実行方法に関する仕様 (Entrypoint, Command, 環境変数、Healthcheckなど) を含む
また、それぞれの特徴について、例を用いて紹介します。
Podの練習をします。
Yamlファイルを使ってPodを作成
kubectl runを使ってPodを作成
Yamlファイルを使って作成したPodとkubectl runを使って作成したPodの比較
Kubernetesオブジェクトに関して説明します。Kubernetesオブジェクトは、クラスタの状態を表現するためのものです。
Kubernetesオブジェクトが理解しやすいように、NodeやPodの例をあわせて説明します。
Kubernetesオブジェクトの中には、 spec (理想状態)と status (現実状態)の2つのフィールドがあります。Kubernetesアーキテクチャの中でも紹介しましたが、Kubernetesコントロールプレーンは、これらの状態が一致するように管理しています。
Kubernetesオブジェクトを作成する際に必要な情報があります。
apiVersion: どのKubernetes APIを利用するかを指定. v1, apps/v1などがあり、 kubectl api-resourcesで確認が可能
kind: どの種類のオブジェクトを作成するか 例. Pod, Deployment...
metadata: オブジェクトを一意に特定するための情報で、 name, UID, namespaceなど
spec: 理想状態に関する記述。フォーマットはオブジェクトにより異なる。
Namespaceを紹介します。
Kubernetesは、同一の物理クラスター上で複数の仮想クラスターの動作をサポートします。 この仮想クラスターをNamespaceと呼びます。つまり、一つのクラスタを論理的に分けて使用できるということです。
初期Namespace
default: デフォルトのNamespace。何も指定しない場合にはこのNamespaceの中にKubernetesのオブジェクトが作成される
kube-system: Kubernetesのシステムによって作成されたオブジェクトのためのNamespace。例としては、 kube-proxyやcorednsなどがこのNamespaceに作成される。
kube-public: 認証されてないユーザを含む全てのユーザが読み取りできるNamespace。
kube-node-lease: ノードのハートビートのパフォーマンス向上させるLeaseオブジェクトのためのNamespace。
Namespaceをわけることのメリット
Podやコンテナのリソースの範囲 (上限、下限)をNamespaceごとに設定できる
Namespace全体の総リソース制限が設定できる
権限をNamespaceごとに付与できる
Kubernetesリソースのスコープ
Namespace-scoped: Namespaceに属しているリソース。例. Pod, ReplicaSet, Deployment, ConfigMap..
Cluster-scoped:クラスター全体で使われるリソース。例. Node, PersistentVolume..
kubectlでの指定
Namespaceの作成: kubectl create namespace <namespace名>
Namespaceの削除: kubectl delete namespace <namespace名>
Namespace内のKubernetesオブジェクトの操作: -n <namespace名>をつける。例. kubectl get pod -n kube-system
Namespaceの基本的な使い方を練習します。
ワークロードリソースについて説明します。Kubernetesのリソースの中でPodを作成・管理するリソースのことをまとめてワークロードリソースと呼びます。
例.
ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
これらのワークロードリソースの定義には、どのようなPodを作成するかの定義となるPod テンプレートというものがあります。中身には、以下の項目が含まれます:
コンテナイメージ
コンテナ名
ボリューム
使用するリソース
その他Podで定義できる全て
ReplicaSetというワークロードリソースを紹介します。ReplicaSetは、常に指定されたレプリカ数のPodを保つ役割を担っています。
メインのフィールド:
replicas: 稼働させたいPod数
pod template: どんなPodを稼働させたいかの定義
selector: 管理下にあるPodを識別するため
注意点: Podと同様にReplicaSetを直接使用することは推奨されていません。代わりに、次回学ぶDeploymentを使用することが奨励されています。
ReplicaSetの基本的な使い方を練習します。
Deploymentというワークロードリソースを紹介します。Deploymentは、Podとそれを管理するReplicaSetを管理します。Deploymentはその名の通り、ローリングアップデートやロールバックなど、アプリケーションのアップデート機能を提供します。
メインのフィールド:
replicas: 稼働させたいPod数
pod template: どんなPodを稼働させたいかの定義
selector: 管理下にあるPodを識別するため
strategy: 更新戦略 RecreateかRollingUpdateを選択。デフォルトではRollingUpdate
revisionHistoryLimit: 過去のVersionとしてReplicaSetを残しておく数。残しておいた分に、ロールバックすることができる。デフォルトは10
簡単なまとめ:
Deploymentを使うことでReplicaSetの更新を人の代わりにDeployment Controllerに任せることが出来ます。
初心者のうちは、設定は基本的にはデフォルト値でOKです。更新戦略には、RollingUpdateを使いましょう。
デプロイがなされることをRolloutと呼びますが、Podテンプレートが変更された時のみトリガーされます。 なぜならPodの定義が変わらない場合には、入れ替える必要がないためです。
アプリケーションの更新に対する要件が固まってきた段階で、細かい設定を決めていくのが良いかと思います。
Deploymentの基本的な使い方を練習します。
ConfigMapという設定系のリソースを紹介します。ConfigMapは、機密性のないデータをキーと値のペアで保存するために使用されるAPI Objectです。PodはConfigMapを環境変数、ボリュームによりConfigファイルとして使うことができます。
Podの中のコンテナがConfigMapを使う方法でよく使われるもの:
コンテナの環境変数の設定
読み取り専用のボリュームを追加し、アプリケーション側から読む
これらの使用方法を、例とともに説明します。
ConfigMapの基本的な使い方を練習します。
Secretというリソースを紹介します。Secretは、パスワード、Oauthトークン、SSHキーのような機密情報を保存、管理するリソースです。
PodがSecretを使う方法:
コンテナの環境変数として利用する
ボリューム内のファイルとして、Pod内のコンテナにマウントする
Podを生成するためにkubeletがイメージをpullするときに使用する
Secretでのポイントは、dataは、キーと値のペアですが値は、base64でエンコードしたものを書く必要があります。
Secretの作成方法
値をbase64でエンコードして、Yamlファイルに記述する
kubectl create secret generic --from-literal=<key>=<value> のように、kubectlのオプションを使って作成する
これらの内容を例とともに説明します。
Secretの基本的な使い方を練習します。
Serviceというリソースを紹介します。Serviceは、Podの集合をネットワークサービスとして抽象化する方法です。具体的には、Podの集合に対するDNS名を提供したり、Podの集合に対する負荷分散を提供します。
サービスが必要な背景:
各PodがIPアドレスを持っている
Podは永続的なリソースではなく、作成・削除が頻繁に起こる
Podで動いているアプリケーションの使い手は、IPアドレスの変更を追っていくのが難しい
サービスは、Podの変更に伴い、DNSの後ろにあるIPアドレスを更新してくれるため、使用者は、抽象化されたサービスの名前をエンドポイントして使用することが可能になります。
サービスの設定事項:
セレクター: 対象となるPodを見つけるためのマップ
Port: PodがどのPortを使っているかはアプリケーションによって異なるので、Pod側のPortとServiceで公開したいPortをそれぞれ指定する
Serviceの基本的な使い方を練習します。
このセクションでは、前セクションで学んだリソースを用いてアプリケーションのデプロイをしていきます。
このセクション全体の流れとしては、以下のようになります。
MySQLをdatabase名前空間へデプロイ + 動作確認
sample-appを自分の名前空間へデプロイ (Deployment, ConfigMap, Secret)
sample-appのserviceのデプロイと動作確認
作成したリソースの削除
⚠このセクション内の各レクチャーは前のレクチャーに依存しているので、必ず前のレクチャーが終わった時点から次のレクチャーを始める必要があります。
このレクチャーでは、MySQLをdatabase名前空間へデプロイします。
ステップとしては以下のようになります。
databaseという名前空間の作成
MySQLのDeploymentファイルの作成
MySQLのデプロイと動作確認
MySQLのServiceファイルの作成とデプロイ
このレクチャーでは、sample-appを自分の名前空間にデプロイします。
ステップとしては以下のようになります。
namespaceという変数に自分の名前空間の名前を設定
名前空間の作成
sample-app用のDeploymentファイルの作成
sample-app用のConfigMapとSecretファイルの作成
sample-appのデプロイ (Deployment, ConfigMap, Secret)
このレクチャーでは、sample-appのServiceの作成と動作確認をします。
ステップとしては以下のようになります。
sample-app用のServiceファイルの作成とデプロイ
kubectl port-forwardを使って動作確認
今セクションで作成した全てのリソースを削除します。
sample-appの削除 (Deployment, ConfigMap, Secret, Service)
MySQLの削除 (Deployment, Service)
Namespaceの削除
このレクチャーでは、このセクション全体で使用するリソースを準備します。
また、kubectl getの簡単な復習も行います。
※ レクチャー内で使用しているYamlファイルはダウンロード可能な教材からダウンロードすることができます。
このレクチャーでは、NodeをDebugします。
具体的には以下の内容になります。
クラスタ内の全て/一部のNodeのステータスを確認する
あるPodがどのNode上で動いているか確認する
あるNode上で動いている全てのPodを確認する
このレクチャーでは、NodeをDebugします。
具体的には以下の内容になります。
PodがRunning状態でない原因を探る
nginx-1
nginx-2
Podのログを確認する
このレクチャーでは、NodeをDebugします。
具体的には以下の内容になります。
Serviceが正常に使える状態かどうか確認する
Serviceが使えない状態のときに原因を探る
セレクターにマッチするPodが存在するか
マッチしたPodは正常に動いているか
Portは正しいか
このセクションでEKSクラスタ構築に関する注意事項
AWSのアカウントを事前に持っていることを想定→まだの方: https://aws.amazon.com/jp/register-flow/
AWSでコストが発生することに注意! (数ドル以内だと思いますが、消し忘れに注意!)
AWSで発生した問題、コストはすべて自己責任となります! ご注意ください!
EKSのクラスタ作成方法にはいくつか方法があります:
eksctl ← 今回はこちらを使います
Terraform eks module
AWS Consoleから作成
セクション概要:
準備
awscliのインストール
IAM Userの作成・設定
eksctlのインストール
EKSクラスタの作成
EKSクラスタ上で動作確認
Load BalancerタイプのServiceを作成
作成したリソースの削除
EKSクラスタの削除
IAM Userの削除
設定の削除
awscliをインストールします。 awsコマンドを使ってAWSのリソースにアクセスするために必要になります。
次の動画で IAM Userの作成・設定を紹介しますが、新しいAWSでのコンソールの操作が若干変わっているので、こちらを補足資料としてご利用ください。
EKSクラスタを作成するために使うIAM Userを作成・設定します。
プログラムでのアクセスのみを許可し、Adminアクセス権限を付与したIAM User eks-setup-userを作成
生成されたアクセスキーIDとアクセスシークレットキーは、絶対に漏らさないように気をつけてください!
aws configureを使って awsコマンドに作成したIAM Userを設定
EKS用のコマンドラインツール eksctlをインストールします。
eksctlの基本的な使い方を学びます。
eksctlによるクラスタの作成方法
デフォルトでのクラスタの条件
簡単なコンフィグファイルを使う方法
次のレクチャーの注意事項になります。しっかりとお読みください。
EKSクラスタを作成します。
コマンド: eksctl create cluster --name test-cluster --region ap-northeast-1 --profile eks-setup-user
eksctlでクラスタを作成してから、作成されたAWSのリソースをコンソール上で確認します。
VPC
CloudFormation
EKS
EC2
⚠ 作成に20分〜25分程度、削除にも5分〜10分程度時間がかかるので、予め時間が確保できることを確認してからこちらのレクチャーを始めてください。
今回は、作成したEKSクラスタでの動作確認を行います。
kubeconfigの設定 (aws eks update-kubeconfig --name test-cluster)
nodeの確認
nginxをDeploymentで作成
nginxのServiceをLoadBalancerタイプで作成
ロードバランサーへのアクセス
作成したKubernetesリソースの削除
今回は、作成したEKSクラスタを削除します。
コマンド: eksctl delete cluster --name test-cluster --region ap-northeast-1 --profile eks-setup-user
削除後にAWSのリソースをコンソール上で確認します
VPC
CloudFormation
EC2
EKS
今回は、EKSクラスタ作成に用いたIAM Userを削除します。こちらは、EKSクラスタの削除が完全に終了してから行ってください。そうでないと、クラスタ削除に失敗してしまう可能性があります。ご注意下さい。
最後に、kubeconfigのcurrent-contextもdocker-desktopに更新します。
このレクチャーでは、以下の内容を学びます:
CI/CDの簡単な定義のおさらい
KubernetesでのCI/CDの例の紹介
このレクチャーでは、このセクションで勉強するCI/CDの全体像を紹介します。
CI: GitHub Actions
コンテナイメージをビルドしてGitHub PackagesにPush
マニフェストファイルをビルドしたイメージ名で変更しマニフェストレポへPush
CD: ArgoCD
マニフェストレポとKubernetesクラスタをSync
ArgoCDはKubernetes上で実行
このレクチャーでは、GitHub ActionsとGitHub Packagesの簡単な紹介をします。
GitHub Actions: GitHubのレポジトリにYaml形式で定義ができるワークフロー
基本的な機能の説明
サンプルを用いた記述方法の説明
GitHub Packages: Dockerイメージ, npm, Maven, RubyGemsなどのパッケージを保存して公開できるレジストリ
今回の使用ケース
参考となるドキュメントの紹介
このレクチャーでは、ArgoCDの概要と使い方を紹介します。
ArgoCDの概要:
Kubernetes用のGitOpsパターンのCDツール
登録されたGit Repositoryの状態をKubernetesクラスタにSync
AppProjectとApplicationという2つのリソースを定義
AppProject: Applicationを束ねるグループ
属するApplicationに適用する権限や範囲を指定できる
Application: デプロイするアプリケーションの単位
Sync元のGitのRepo、Path、Revision
Sync先のKubernetesクラスタやNamespaceを指定
ArgoCD自体もKubernetes上で実行される
ArgoCDの使い方:
ArgoCDのインストール
(Optional) AppProject作成
Application作成
Kubernetesがますます普及して、アプリケーション開発者でもKubernetesの使用者として最低限の知識が必要になってきました。
しかし、Kubernetesはすべてのコンポーネントの役割や細かい設定をすべて網羅するにはかなり勉強のコストがかかってしまいます。アプリケーション開発者は、Kubernetesを完全にマスターすることが必須ではありませんが、基本的な知識や便利なコマンドなどを習得することで、効率よくアプリケーション開発を行うことができるようになります。
このコースでは、実践的な内容を中心としているので、Kubernetesの基本的なイメージを説明してから、
kubectl (cli)のインストールと基本的な操作方法
アプリケーションのデプロイを通じてKubernetesのリソースを学習
よく使うDebugの方法
EKS(マネージドクラスタ)のセットアップ
CI/CDとKubernetes特化のCDツールの紹介と実践
という実際に手を動かして触れることで、理解を深めていけるようになっています。コースの中では説明しきれない部分は、課題や質問部分で、自分たちで学習してさらに理解を深めていただきたい内容を推薦しました。
今後のKubernetes人生の第一歩となれれば幸いです。
(こちらのコースはMac OSを対象としているので、Windowsの方は申し訳ございませんが対象外となります。)