Oracle Cloud Hangout Cafe 2023/06/07 Kubernetes超入門 資料
Kubernetes IntroductionOracle Cloud Hangout Café Season7 #1Yutaka IchikawaOracle Corporation JapanSolutions ArchitectJun07, 2023
View Slide
Copyright © 2023, Oracle and/or its affiliates2ProfileName• Yutaka Ichikawa/市川 豊Belong• Solutions ArchitectRole• Principal Cloud Solution EngineerSNS• Twitter/GitHub/Qiita:cyberblack28Blog• https://cyberblack28.hatenablog.com/Materials• https://speakerdeck.com/cyberblack28/Community• Oracle Cloud Hangout Cafe #ochacafe• CloudNative Days Tokyo #cndt #o11y2022Certified• Certified Kubernetes Administrator• Certified Kubernetes Application Developer• Certified Kubernetes Security Specialist• Kubernetes and Cloud Native AssociatePublications
Copyright © 2023, Oracle and/or its affiliates3• 第1章 コンテナの世界に飛び込む前に• 第2章 コンテナアプリケーション開発に必要なソフトウェア• 第3章 コンテナアプリケーション開発のライフサイクル Build・Ship・Run• 第4章 コンテナオーケストレーション• 第5章 Kubernetes でコンテナアプリケーションを動かすまで• 第6章 ローカル開発の準備• 第7章 コンテナアプリケーションにおける CI/CD解説動画(https://onl.sc/XJm16m8)解説資料(https://onl.sc/hjuqfdU)
Copyright © 2023, Oracle and/or its affiliates4ThinkIT + Oracle Cloud Hangout CaféOracle Cloud Hangout Café ダイジェスト• 第1回「CI/CD最新事情」 2023年1月• 第2回「マイクロサービスの認証・認可とJWT」 2023年2月• 第3回「Kubernetes Operator 超入門」 2023年3月• 第4回「Kubernetes のセキュリティ」 2023年4月• 第5回「実験!カオスエンジニアリング」 2023年5月• 第6回「Service Mesh がっつり入門!」 2023年6月https://thinkit.co.jp/article/20858
Copyright © 2023, Oracle and/or its affiliates51. コンテナとコンテナオーケストレーション• これまでのアプリケーション開発• OS/ライブラリとアプリケーションの分離• 仮想マシンとコンテナの違い• OS/ライブラリとアプリケーションの統合• Docker 実践 ~ Build ~• Docker 実践 ~ Ship ~• Docker 実践 ~ Run ~• Docker 実践 ~ Build/Ship/Run ~• コンテナライフサイクル• コンテナを支えるオーケストレーションAgenda2. Kubernetes コンポーネント• Control Plane & Node• Pod• ReplicaSet & Deployment• Service• Ingress• PersistentVolume &PersistentVolumeClaim• ConfigMap & Secret• Namespace & Label3. Kubernetes クラスタ構築&アプリケーションデプロイ• クラスタ構築• WordPressを動かしてみる
Copyright © 2023, Oracle and/or its affiliates6コンテナとコンテナ・オーケストレーション
Copyright © 2023, Oracle and/or its affiliates7コンテナ技術とコンテナ・オーケストレーションこれまでのアプリケーション開発物理マシン仮想マシン仮想マシン(クラウド)コンテナ物理サーバでアプリケーションを稼働VM 物理サーバ上に複数の仮想マシンでアプリケーションを稼働クラウドをベースとしたスケーラブルな仮想マシンでアプリケーションを稼働物理マシン・仮想マシンもノードとして束ねて、コンテナという小さい単位でアプリケーションを稼働
Copyright © 2023, Oracle and/or its affiliates8コンテナ技術とコンテナ・オーケストレーションこれまでのアプリケーション開発アプリケーションコードをソースコードリポジトリにコミット/プッシュCI/CDパイプラインによるテスト、ビルド、デプロイDeveloperCodeRepositoryCI/CDPipelineすべて自動化されている場合もあれば、手動で行う場合もあります。本番環境ステージング環境検証環境OperatorInfrastructureEngineer開発環境OS/ライブラリVM物理マシン 仮想マシン仮想マシン(クラウド)
Copyright © 2023, Oracle and/or its affiliates9コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの分離アプリケーション本番環境ステージング環境検証環境開発環境OS/ライブラリVM物理マシン 仮想マシン仮想マシン(クラウド)アプリケーションは物理マシンや仮想マシンのOS/ライブラリ上で稼働稼働するアプリケーションは実行環境に依存する環境差異が原因で他の環境で稼働するけど、本番環境で稼働しない等の障害が発生するOSのパッチバージョンが異なる、このライブラリが無かった、関係ないものがインストールされている…
Copyright © 2023, Oracle and/or its affiliates10コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの分離アプリケーションOS/ライブラリ• 仮想マシンイメージがベンダー製品特有(ベンダーロックイン)• 容量も重い(数ギガ~数十ギガ)• 可搬性(Portability)が低いXenServer仮想マシンイメージKVMVMWareハイパーバイザーハードウェアVMWare Xen/Server KVM物理/仮想マシンにおける、OS/ライブラリのアップデートには人手や時間を要するため、アプリケーションのリリースに影響する…仮想マシン
Copyright © 2023, Oracle and/or its affiliates11コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの分離これまでのアプリケーション開発OS/ライブラリが既に整っている実行環境にアプリケーションをデプロイするという形式1.アプリケーション• 環境差異による問題が発生• OS/ライブラリ側に何かあるとアプリケーションに影響2.インフラ• 仮想マシンイメージがベンダー製品特有(ベンダーロックイン)• 仮想マシンイメージの容量が重く可搬性(Portability)が低い• 物理/仮想マシンの特性上、OS/ライブラリのアップデートに時間を要して、アプリケーションのリリースに影響する
Copyright © 2023, Oracle and/or its affiliates12コンテナ技術とコンテナ・オーケストレーション仮想マシンとコンテナの違いハードウェアハイパーバイザーOS/Hyper Visor OS/Hyper Visorカーネル カーネルアプリケーション アプリケーションライブラリ ライブラリ仮想マシン 仮想マシンハードウェアカーネルOS/Hyper Visor OS/Hyper Visorコンテナ コンテナコンテナエンジン各仮想マシンのカーネル上で実行、隔離性が高いが、起動が遅く(数分)オーバヘッドが大きいカーネルを共有しているため、隔離性は低いが、起動が高速(数秒)でオーバヘッドが小さい仮想マシン コンテナアプリケーション アプリケーションライブラリ ライブラリ
Copyright © 2023, Oracle and/or its affiliates13コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの統合OS/ライブラリアプリケーションコンテナイメージビルド(Build)OS/ライブラリ• OS/ライブラリとアプリケーションをパッケージイメージ化• 技術としてはOSSのため、ベンダーロックインを回避• イメージはこれまでの仮想マシンイメージに比べるとはるかに軽いのでポータビリティ性が高い1.ビルド(Build)
Copyright © 2023, Oracle and/or its affiliates14コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの統合• イメージをレジストリに保存して、共有2.シップ(Ship)OS/ライブラリOS/ライブラリOS/ライブラリイメージレジストリPush Pullシップ(Ship)イメージの共有OS/ライブラリコンテナプラットフォーム
Copyright © 2023, Oracle and/or its affiliates15コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの統合• コンテナイメージを基にコンテナを起動3.ラン(Run)コンテナプラットフォーム上でイメージからコンテナを起動して、アプリケーションを稼働。イメージもプラットフォームも特定ベンダー技術に依存しないため、仮想マシンイメージと違って、ベンダーロックインも回避。OS/ライブラリラン(Run)OS/ライブラリコンテナプラットフォームコンテナコンテナイメージ
Copyright © 2023, Oracle and/or its affiliates16コンテナ技術とコンテナ・オーケストレーションOS/ライブラリとアプリケーションの分離コンテナアプリケーション開発OS/ライブラリとアプリケーションを統合して、軽量イメージ化して、コンテナプラットフォームにコンテナとしてデプロイする形式1.アプリケーション• OS/ライブラリとアプリケーションが一つに統合されているため、環境差異による問題が起きにくい2.インフラ• 仮想マシンイメージと仕組みが異なり、OSSベースでベンダーロックインも回避、軽量で可搬性(Portability)が高い• OS/ライブラリのアップデートも容易なため、リリースサイクルを速め、スピード(Agility)が向上
Copyright © 2023, Oracle and/or its affiliates17コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Build ~「 $ docker image build 」 コマンドを実行して Dockerfile からコンテナイメージを作成ContainerImageコンテナイメージFROM centos:7RUN yum -y install epel-releaseRUN yum -y install nginxCOPY index.html /usr/share/nginx/htmlENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]Dockerfile $ docker image buildBuild
Copyright © 2023, Oracle and/or its affiliates18コンテナ技術とコンテナ・オーケストレーションコンテナイメージの構造ContainerImage読み込み専用(ReadOnly)ベースイメージCentOSイメージ層FROM centos:7RUN yum -y install epel-releaseRUN yum -y install nginxCOPY index.html /usr/share/nginx/htmlENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;“]Dockerfile①②③④⑤⑤④③②①コンテナ起動時の構造ベースイメージCentOSイメージ層書き込み可能イメージ層読み込み専用(ReadOnly)「 $ docker container run 」コマンドでコンテナが起動すると、自動的に書き込み可能なレイヤーが作られる仕組み⑤④③②①書き込み可能なイメージ層は「 $ docker container commit 」 コマンドで保存されて、その層が読込専用となります。左例でいうと⑥の層ができることになります。6
Copyright © 2023, Oracle and/or its affiliates19コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Build ~# docker image build -t cyberblack/test-nginx .Sending build context to Docker daemon 25.09kBStep 1/5 : FROM centos:77: Pulling from library/centosab5ef0e58194: Pull completeDigest:sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813cStatus: Downloaded newer image for centos:7---> 5e35e350adedStep 2/5 : RUN yum -y install epel-release---> Running in 83d64f46ae64・・省略(yumの処理)・Complete!Removing intermediate container 83d64f46ae64---> 827e069c2cf4Step 3/5 : RUN yum -y install nginx---> Running in 5a61a4cfa4c1・・省略(yumの処理)・Complete!Removing intermediate container 5a61a4cfa4c1---> 8e94cdfc1d95Step 4/5 : COPY index.html /usr/share/nginx/html---> f78c1d4c9694Step 5/5 : ENTRYPOINT [“nginx”, “-g” “daemon off;”]---> Running in 115085b978f4Removing intermediate container 115085b978f4---> aa214ab9d4f0Successfully built aa214ab9d4f0Successfully tagged cyberblack/test-nginx:latestFROM centos:7RUN yum -y install epel-releaseRUN yum -y install nginxCOPY index.html /usr/share/nginx/htmlENTRYPOINT [“/usr/sbin/nginx”, “-g”, “daemon off;“]①②③④⑤Dockerfile コンテナイメージ# docker image build -t cyberblack/test-nginx .Build※ cyberblack の箇所は DockerHub アカウント名cyberblack/test-nginx①②③⑤④
Copyright © 2023, Oracle and/or its affiliates20コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Ship ~ビルドしたイメージを「 $ docker image push 」してアップロード、イメージレジストリからイメージを「 $ docker image pull 」してダウンロードできます。また、イメージレジストリ及びリポジトリはパブリック/プライベートがあるので環境に合わせて利用できます。コンテナエンジン(dockerd)ハードウェアpullコンテナイメージレジストリCentOSリポジトリUbuntuリポジトリContainerImagepush tag:latesttag:6.7・・tag:latesttag:14.04・・ShipNginxリポジトリtag:latesttag:19.1・・カーネルrunbuildContainerImageContainerImage$ docker image pull$ docker image pushDockerfile
Copyright © 2023, Oracle and/or its affiliates21コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Ship ~# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: cyberblackPassword:WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin SucceededHubDocker Hub にログイン
Copyright © 2023, Oracle and/or its affiliates22コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Ship ~# docker image push cyberblack/test-nginxThe push refers to repository [docker.io/cyberblack/test-nginx]39e4809cbd03: Pushed66061884888d: Pushed5a338cc84c53: Pushed77b174a6a187: Mounted from library/centoslatest: digest:sha256:8287e7100ce2ddf7cd76202ab25ccbfd287b223242231cd83005ed0cda1e9cf6 size: 1160Docker Hub に PushContainer Imagecyberblack/test-nginx# docker pull cyberblack/test-nginxUsing default tag: latestlatest: Pulling from cyberblack/test-nginxab5ef0e58194: Already exists1379c469e275: Pull completedbb831d3fcac: Pull completea6bb76d398b0: Pull completeDigest: sha256:8287e7100ce2ddf7cd76202ab25ccbfd287b223242231cd83005ed0cda1e9cf6Status: Downloaded newer image for cyberblack/test-nginx:latestdocker.io/cyberblack/test-nginx:latestDocker Hub から PullHubcyberblack/test-nginxPushPullShip# docker image push cyberblack/test-nginx# docker image pull cyberblack/test-nginx Container Image$ docker image push$ docker image pull
Copyright © 2023, Oracle and/or its affiliates23コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Run ~ローカルでbuildしたコンテナイメージやコンテナレジストリからpullしたコンテナイメージを基に「 $ docker container run 」コマンドを実行して、コンテナを起動します。コンテナエンジン(dockerd)ハードウェアpullコンテナイメージレジストリCentOSリポジトリUbuntuリポジトリContainerImagepush tag:latesttag:6.7・・tag:latesttag:14.04・・Nginxリポジトリtag:latesttag:19.1・・カーネルrunbuildContainerImageContainerImage$ docker container runDockerfileRun
Copyright © 2023, Oracle and/or its affiliates24コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Run ~# docker container run --name sample-nginx -d -p 8080:80 cyberblack/test-nginxa8506ee968e6d5ae664ba4046fe15b518127f6c826247fcaac2f3c1cd24e4cefコンテナを起動と同時に Docker イメージを展開# docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa8506ee968e6 cyberblack/test-nginx "nginx -g 'daemon of…" 13 seconds ago Up 12 seconds 0.0.0.0:8080->80/tcp sample-nginxコンテナ稼働を確認# curl http://localhost:8080Welcome to nginx!Hello,Docker & Kubernetesコンテナ(Nginx)にアクセスsample-nginxport:80localhostport:8080localhost ポート8080経由でコンテナーの80ポートへcurl でアクセス# curl http://localhost:8080Run
Copyright © 2023, Oracle and/or its affiliates25コンテナ技術とコンテナ・オーケストレーションDocker 実践 ~ Build/Ship/Run ~BuildShipRun イメージレジストリDockerfileコンテナイメージアプリケーションフレームワークアプリケーションライブラリOS イメージ① コンテナイメージ自動作成③ イメージを基にコンテナを起動イメージの作成手順を記載$ docker image pull$ docker image push$ docker image build$ docker container runコンテナ② Docker イメージの保存・共有
Copyright © 2023, Oracle and/or its affiliates26コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーション単体のコンテナでは、コンテナ自体が落ちたり、コンテナ環境を支えるホストなどのハードウェアや仮想マシンに障害が発生して稼働が停止した場合などの対処が無く、システム自体利用不可。この状態でのプロダクション利用は厳しい。コンテナの停止、ホストが停止した場合でも自動修復して、サービス無停止による継続。アプリケーションをサービス無停止の状態でデプロイ可能な DevOps 環境を構築する上でコンテナーオーケストレーションは必須。OKEComputeOCIRコンテナイメージKubernetes
Copyright © 2023, Oracle and/or its affiliates27コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーションKubernetes は、Google 社内のコンテナーオーケストレーションシステムである Borg からインスパイアされて開発されたOSS のコンテナーオーケストレーション。読み方:クーバーネーティス、クーバネティス、クバネティス等略称:K8s(Kubernetes)8文字現在は、CNCF (Cloud Native Computing Foundation) で管理され、多数の企業が参加するコミュニティで開発。
Copyright © 2023, Oracle and/or its affiliates28コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーションKubernetesの主な役割と実現• コンテナのスケジューリング• ローリングアップデート• オートスケーリング• 死活監視• 頻繁なアプリケーションのデプロイを可能にするシステム基盤• 無停止によるリリース、高可用なシステム基盤• 負荷に応じた伸縮自在なシステム基盤主な役割 実現• コンテナの自動修復• サービスディスカバリ• ロードバランシング
Copyright © 2023, Oracle and/or its affiliates29コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーションマニフェストファイルYAMLControllerがあるべき理想の状態へ収束Controller 内の Reconciliation loop(調整ループ)と呼ばれる、あるべき理想の状態へ収束させるループ処理を実行。Kubernetesクラスタ登録Controller監視コンテナ管理(作成・削除)Reconciliationloop宣言的オペレーション
Copyright © 2023, Oracle and/or its affiliates30コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーションKubernetesは分散処理基盤Virtual Machine&BareMetalKubernetesContainer
Copyright © 2023, Oracle and/or its affiliates31コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーションKubernetes is becoming the Linux of the cloudby Jim Zemlin (The Linux Foundation)
Copyright © 2023, Oracle and/or its affiliates32コンテナ技術とコンテナ・オーケストレーションコンテナを支えるオーケストレーションMulti-Cloud to Multi-Kubernetes Cloud Native to Kubernetes Native
Copyright © 2023, Oracle and/or its affiliates33Kubernetes コンポーネント
Copyright © 2023, Oracle and/or its affiliates34Control Plane & Node
Copyright © 2023, Oracle and/or its affiliates35Kubernetes コンポーネントControl Plane & NodeKubernetes には、構成要素として Control Plane と Worker Node というコンポーネントがあるControl Planeクラスタの制御を受け持ち、スケジューリングやイベント検知など、クラスタの全体に関わる管理を担う。Nodeアプリケーションコンテナの稼働場所となり、コンテナランタイムが稼働し、Control Plane と連携してコンテナの起動などの実行を担う。
Copyright © 2023, Oracle and/or its affiliates36Kubernetes コンポーネントControl Plane & Node
Copyright © 2023, Oracle and/or its affiliates37Kubernetes コンポーネントControl Planeコンポーネント 概要API server Kubernetes への API リクエストを REST で受け付けるフロントエンドサーバオブジェクトのCRUDやユーザおよびサービスアカウントの認証認可、リクエストの制御を行う Admission Control 機能があるScheduler Pod を最適な Node に配置するCloud controller manager クラウドプロバイダーの機能と連携して、ロードバランサやディスクボリュームなどのリソースを管理するController Manager Kubernetes クラスタのリソース状態を管理して、要求される各リソースの状態(あるべき姿)を維持するetcd Kubernetes クラスタに登録される全ての情報を保存するデータストア(KVS)
Copyright © 2023, Oracle and/or its affiliates38Kubernetes コンポーネントNodeコンポーネント 概要kubelet Node への Pod のスケジューリングを監視して、Container Runtime を利用して Pod の生成、更新、破棄などを行うContainer Runtime kubelet によるコンテナイメージの取得とコンテナの作成、更新、破棄などを実行。 Kubernetes は、コンテナランタイムの取替が可能なため、containerd 、cri-o 、gVisor など利用可能kube-proxy 各 Node で動作する、Service オブジェクトが持つ仮想的な Cluster IP や NodePort 宛のトラフィックを Pod へ正常に転送するネットワークプロキシの役割を担う
Copyright © 2023, Oracle and/or its affiliates39Pod
Copyright © 2023, Oracle and/or its affiliates40Kubernetes コンポーネントPodContainer ContainerNode1 Node2• 1つまたは複数のコンテナをデプロイする最小単位• Pod 内のコンテナは同じホスト名と IP アドレスを持つ• Pod 内のコンテナは同じポート番号を持つことはできない• Pod 内のコンテナはローカルホスト通信• Pod 内のコンテナは同じ Node 上で稼働、Node をまたぐことはできない
Copyright © 2023, Oracle and/or its affiliates41Kubernetes コンポーネントPod ができるまでの仕組み1.Podを作るマニフェストまたはコマンドを kubectl で実行すると、 APIserverが受け付けて、etcd に格納。2.Scheduler は API serverを経由して etcd を監視、更新されるとリソース(ここではPod)をどの Node に配置するか決める。3. Scheduler が配置する Pod の nodename を更新、 kubelet も API server 経由で etcd を監視しているので、 nodename が合致する kubelet が ContainerRuntime を利用して Pod(コンテナ)を作成。Pod (コンテナ)を作成したことを API serverに伝えると、 API server が etcd を更新。ContainerImage Registry
Copyright © 2023, Oracle and/or its affiliates42ReplicaSet & Deployment
Copyright © 2023, Oracle and/or its affiliates43Kubernetes コンポーネントReplicaSetReplicaSet は、 Pod のレプリカを作成して、マニフェストファイルで定義されたレプリカ数( replicas )を保証し、定義された数の Pod を常に起動させる仕組み。Kubernetes ClusterReplicaSet (Replica 数 = 5)
Copyright © 2023, Oracle and/or its affiliates44Kubernetes コンポーネントReplicaSetReplicaSet は、Node や Pod に障害が発生した場合、定義されたレプリカ数を保証するために、別ノードで復旧、Kubernetes のセルフヒーリング機能。ReplicaSet (Replica 数 = 5)Kubernetes Cluster
Copyright © 2023, Oracle and/or its affiliates45Kubernetes コンポーネントDeploymentDeployment は ReplicaSet の作成、更新、履歴管理を行う。ローリングアップデート、ロールバックを可能にする。1世代 2世代 3世代 4世代ローリングアップデートロールバックreplicas:5Image: nginx:1.15replicas:5Image: nginx:1.16replicas:5Image: nginx:1.17replicas:5Image: nginx:1.18
Copyright © 2023, Oracle and/or its affiliates46Kubernetes コンポーネントDeployment & ReplicaSet & Pod の関係管理 管理上位リソースPod Replicaset Deployment
Copyright © 2023, Oracle and/or its affiliates47Kubernetes コンポーネントセルフヒーリングの仕組みContainerImage Registryマニフェストファイル(yaml)replicas:3replicas:31.「kubectl create -f deployment.yaml」kubectl コマンドでマニフェストファイル(あるべき姿の定義)を登録します。etcd に格納されます。2. Controller Manager が API server を経由して etcd から Node の状況( Deployment と ReplicaSet の定義、あるべき姿 ) を常に監視して、差異が生じた場合に再作成を実行3. kubelet は、再作成のアクションを確認して、コンテナを起動。4. kubelet は Node の状況確認及び自分の Node の状況を APIserver に連絡、API server は、更新内容を etcd 書き込む。
Copyright © 2023, Oracle and/or its affiliates48Kubernetes コンポーネントReconcile LoopKubernetes は、マニフェストファイルの内容をあるべき理想の形(Desired State)とする。そして、常にその状態であるかを監視して、相違がある場合、 Reconcile Loop により自動修復。登録監視ControllerReconcile Loopあるべき理想の形でない場合、修復を行う。コンテナの作成、削除クラスタの状態
Copyright © 2023, Oracle and/or its affiliates49Kubernetes コンポーネントReconcile LoopReconcile Loop とは、 Controller 内で実行されている理想とするあるべき姿に収束させるループ機能。ObserveDiffActAct:Observe:Diff:現状確認理想と現実の差分計算差分に対する処理
Copyright © 2023, Oracle and/or its affiliates50Kubernetes コンポーネントReconcile Loop例:3個の Nginx コンテナ( Pod )を起動することを理想とする理想の状態 クラスタの状態
Copyright © 2023, Oracle and/or its affiliates51Kubernetes コンポーネントReconcile Loop2個のコンテナ( Pod )しか起動していない場合理想の状態 クラスタの状態
Copyright © 2023, Oracle and/or its affiliates52Kubernetes コンポーネントReconcile Loop2個のコンテナ( Pod )しか起動していない場合Diff: 1個のコンテナ( Pod )が足りない理想の状態 クラスタの状態
Copyright © 2023, Oracle and/or its affiliates53Kubernetes コンポーネントReconcile Loop2個のコンテナ( Pod )しか起動していない場合Act: 1個の nginx のコンテナ( Pod )を作成する理想の状態 クラスタの状態
Copyright © 2023, Oracle and/or its affiliates54Service
Copyright © 2023, Oracle and/or its affiliates55Kubernetes コンポーネントServiceService はクラスタ内外からのリクエストを Pod にアクセスする為のルーティングや DNS 機能を提供。主な機能として、ClusterIP 、NodePort 、LoadBalancer がある。Kubernetes ClusterNode #1 Node #2 Node #3
Copyright © 2023, Oracle and/or its affiliates56Kubernetes コンポーネントClusterIPクラスタ内の Pod 同士が、内部 DNS で名前解決して通信するプライベート IP アドレス。Kubernetes Cluster内部 DNS代表 IP アドレス(ClusterIP)クライアントリクエストDNS 登録/削除名前解決IP アドレス返答負荷分散
Copyright © 2023, Oracle and/or its affiliates57Kubernetes コンポーネントNodePortNode の IP アドレスに公開ポート番号を開放して、クラスタ外部からのアクセスを受け付ける。Service は、kube-proxy と連携して、各ノードにポートを開き、ノード横断で Pod にリクエストを送信。Kubernetes Clusterクラスタ外リクエストNode #1 IP address:NodePortクラスタ外リクエストNode #2 IP address:NodePortクラスタ外リクエストNode #3 IP address:NodePorttype: NodePortNode #1 Node #2 Node #3
Copyright © 2023, Oracle and/or its affiliates58Kubernetes コンポーネントLoadBalancerクラスタ外のロードバランサと連携して外部からのアクセスを受け付ける。各クラウドプロバイダーで対応。type: LoadBalancerNode #1 Node #2 Node #3Kubernetes Cluster外部ロードバランサクラスタ外リクエスト外部IPアドレス
Copyright © 2023, Oracle and/or its affiliates59Ingress
Copyright © 2023, Oracle and/or its affiliates60Kubernetes コンポーネントIngressIngress は外部からの HTTP(S) トラフィックを内部 Service にルーティングし、レイヤ7のロードバランシングを提供。パスベースルーティング、HTTPS終端、名前ベースのバーチャルホスティングも可能。外部 DNSVIP外部公開用アドレス(外部LB)外部クライアント(ブラウザ)https://xxxx.sample.co.jp/foo名前解決InternetKubernetes Clusterhttps://xxxx.sample.co.jp/barpath: /foopath: /bar
Copyright © 2023, Oracle and/or its affiliates61Volume & PersistentVolume &PersistentVolumeClaim
Copyright © 2023, Oracle and/or its affiliates62Kubernetes コンポーネントVolumeコンテナ側からマウント可能なボリューム領域。保存領域の実態をポイントする。Volume は、あらかじめ用意された利用可能な Volume を Pod のマニフェストファイルから直接指定して利用。ContainerVolumeContainerNIC※例として Container を2個としています。ローカルディスクなどIP アドレスコンテナ同士は、ローカルホスト通信Kubernetes Cluster
Copyright © 2023, Oracle and/or its affiliates63Kubernetes コンポーネントPersistentVolume (PV) & PersistentVolumeClaim (PVC)PersistentVolume は、永続ボリュームと連携して、Kubernetes クラスタにボリュームを登録するリソース。PersistentVolumeClaim は、PersistentVolume をアサインするリソース。 Pod から PersistentVolume を利用する場合、 Pod のマニフェストにPersistentVolumeClaim を定義して利用。Container ContainerNIC※例として Container を2個としています。IP アドレスコンテナ同士は、ローカルホスト通信ストレージプラグインを利用することで多種の外部ストレージを利用できます。Kubernetes ClusterVolume Volume
Copyright © 2023, Oracle and/or its affiliates64Kubernetes コンポーネントPVC と PV の利用手順例ストレージ① インフラエンジニアがストレージを準備② クラスタ管理者が PV を作成し、ストレージを Kubernetes クラスタに登録③ 開発者が PVC を作成し、Pod からマウントする場合の名称、利用する PV 条件を指定④ Kubernetes は PVC の条件に合致する PV があれば PVC と PV を紐づける⑤ 開発者は、Pod 定義で PVC を指定して Pod を生成するインフラエンジニアクラスタ管理者開発者①②②③④⑤②③⑤②③⑤PersistentVolumeマニフェストファイルPersistentVolumeClaimマニフェストファイルPod / Deploymentマニフェストファイル
Copyright © 2023, Oracle and/or its affiliates65ConfigMap & Secret
Copyright © 2023, Oracle and/or its affiliates66Kubernetes コンポーネントConfigMapConfigMap は、環境変数、引数等の設定情報(Key-Value 保持)をコンテナに渡すために使用。Volume としてコンテナにマウントして、コンテナからはファイルとして認識される。Kubernetes ClusterContainerVolumeContainerNIC※例として Container を2個としています。IP アドレスコンテナ同士は、ローカルホスト通信httpd.conf, nginx.conf のような設定ファイルやパラメータだけでも可能です。格納可能なデータサイズは1MB となります。Key=Value
Copyright © 2023, Oracle and/or its affiliates67Kubernetes コンポーネントSecretSecret は、機密性の高いデータ( ID/Password 情報、SSL/TLS 証明書、アクセストークン等)を保持する上で使用する Volume 。Kubernetes Clustertmpfs 領域 tmpfs 領域は、メモリ内に保持されるため、Node のディスク書き込まれない。参照利用する Pod が存在する場合にのみデータを Node に送信。転送は over SSL/TLS となる。etcd 内では、平文で保存されるため、etcd のアクセス権限やセキュリティの対応が必要。
Copyright © 2023, Oracle and/or its affiliates68Kubernetes コンポーネントSecret リソースの暗号化Secret は、base64 でエンコードされているが、暗号化されていない。Git リポジトリに Secret の設定が定義されているマニフェストファイルをアップロードするのはセキュリティリスクがあるため、マニフェストファイルを暗号化するオープンソースソフトウェアを利用する。• Kubesechttps://kubesec.io/• SealedSecrethttps://github.com/bitnami-labs/sealed-secrets• ExternalSecrethttps://github.com/godaddy/kubernetes-external-secrets
Copyright © 2023, Oracle and/or its affiliates69Label & Namespace
Copyright © 2023, Oracle and/or its affiliates70Kubernetes コンポーネントLabel & Label SelectorKubernetes 上のオブジェクトにタグのような属性を設定して、グループ化したり、特定のオブジェクトを抽出できるようにする仕組み。• LabelLabelはKey/Value ペアの文字列で、Pod などのオブジェクトに任意のメタ情報を付与して識別用途として利用。• Label SelectorLabel 設定値の条件に該当するものをグループとして識別用途利用。
Copyright © 2023, Oracle and/or its affiliates71Kubernetes コンポーネントNamespaceNamespace は、複数のユーザー間で(リソース割り当てを介して)クラスタリソースを分割する仕組みです。• 1ユーザー毎に1個の Namespace• Namespace におけるリソースの名前は、Namespace 内で一意である必要がありますが、Namespace 間では一意である必要はありません• Namespace 毎にリソースの利用上限を設定可能
Copyright © 2023, Oracle and/or its affiliates72Kubernetes クラスタ構築 & アプリケーションデプロイ
Copyright © 2023, Oracle and/or its affiliates73クラスタ構築
Copyright © 2023, Oracle and/or its affiliates74Kubernetes クラスタ構築 & アプリケーションデプロイKubernetes クラスタ構築ツールを利用せずに、全てを1から構築する「 Kubernetes the hard way 」https://github.com/kelseyhightower/kubernetes-the-hard-way
Copyright © 2023, Oracle and/or its affiliates75Kubernetes クラスタ構築 & アプリケーションデプロイkubeadmhttps://kubernetes.io/docs/setup/independent/install-kubeadm/Kubernetes クラスタを構築するオープンソースソフトウェア
76 Copyright © 2023, Oracle and/or its affiliatesVirtualMachineVirtualMachinek8s-control-plane k8s-nodeItem SpecShape VM.Standard.A1.FlexCPU AmpereMEM (control plane) 12GBMEM (node/manage) 6GBOS Ubuntu 20.04ContainerRuntime ContainerdCNI CalicokubectlsshVirtualMachinemanageOCI Always-Free 環境で構築できます。UserKubernetes クラスタ構築 & アプリケーションデプロイkubeadmhttps://github.com/oracle-japan/ochacafe-s5-3
Copyright © 2023, Oracle and/or its affiliates77Kubernetes クラスタ構築 & アプリケーションデプロイKubernetes マネージドサービスAmazonElastic Kubernetes ServiceGoogleKubernetes EngineAzureKubernetes ServiceOracleContainer Engine forKubernetes
Copyright © 2023, Oracle and/or its affiliates78WordPress を動かしてみる
Copyright © 2023, Oracle and/or its affiliates79WordPress を動かしてみるデモ環境で利用するソースなどhttps://bit.ly/ochacafe7-1
Copyright © 2023, Oracle and/or its affiliates80WordPress を動かしてみるデモ環境概要図
Copyright © 2023, Oracle and/or its affiliates81WordPress を動かしてみるOKE 構築クイック作成で Kubernetes クラスタを構築https://oracle-japan.github.io/ocitutorials/cloud-native/devops-for-beginners-oke/※構築手順は、チュートリアルを参照
Copyright © 2023, Oracle and/or its affiliates82WordPress を動かしてみるSecret 作成
Copyright © 2023, Oracle and/or its affiliates83WordPress を動かしてみるSecret 作成$ kubectl create secret generic mysql --from-literal=password=mysql-p@ssw0d1.データベースのパスワードを格納する Kubernetes シークレットを作成OCI の Cloud Shell で kubectl コマンドを実行
Copyright © 2023, Oracle and/or its affiliates84WordPress を動かしてみるNFS サーバの作成
Copyright © 2023, Oracle and/or its affiliates85WordPress を動かしてみるKubernetes クラスタ上におけるデータの一時性と永続性一時性( Temporary ):Pod が削除または再デプロイさると同時にデータが消えることPodvolumeContainer Container ContainerPodvolumePod 削除 = データ削除コンテナ内の書き込みレイヤーのボリュームにデータを保存Pod 内のボリュームにデータを保存、例としては emptyDir
Copyright © 2023, Oracle and/or its affiliates86WordPress を動かしてみるKubernetes クラスタ上におけるデータの一時性と永続性永続性( Persistent ):Pod が削除または再デプロイされてもデータは消えないことPodvolumeContainerノードまたはディスク削除 = データ削除PodvolumeContainerpvcpvNode NodePodvolumeContainerpvcpvNodeExternalStorage外部ストレージ・volumeの削除= データ削除ノードにあるローカルディスクまたは PVC/PV を利用してローカルディスクにデータを保存、直接の場合は、hostPath をマニフェストに定義する PVC/PV を利用して外部ストレージにデータを保存
Copyright © 2023, Oracle and/or its affiliates87WordPress を動かしてみるPersistentVolumeClaim と PersistentVolume の仕組みPodPersistentVolumeClaimPersistentVolume20GiBPersistentVolume30GiBPersistentVolume40GiB5GiB のボリュームを要求ボリュームの割り当て払い出されるボリュームは、要求されている 5GiB に近い 20GiB のボリュームとなるので、要求容量よりも 15GiB 多いボリュームとなる。 PersistentVolume の容量は設計時に校了が必要。
Copyright © 2023, Oracle and/or its affiliates88WordPress を動かしてみるStorageClass による Dynamic ProvisioningStorageClass の仕組みを利用して、PersistentVolumeClaim が発行されたタイミングで動的に PersistentVolume を作成してアサインできます。PodPersistentVolumeClaimPersistentVolume5GiB5GiB のボリュームを要求ボリュームの割り当てDynamic Provisioning は、要求に応じて動的にボリュームを作成して割り当てる仕組み。StorageClass を登録して、PersistentVolumeClaim から呼び出すと Provisioner が要求に応じた PersistentVolume を作成して割り当てることができる。StorageClassProvisioner
Copyright © 2023, Oracle and/or its affiliates89WordPress を動かしてみるNFS サーバの作成CSI ボリューム・プラグインを利用して、ブロックボリュームの PersistentVolumeClaim を作成nfs-pvc.yamloci-bv ストレージ・クラスの定義 ( provisioner: blockvolume.CSI.oraclecloud.com ) で指定された CSI プラグインを使用して、ブロック・ボリュームを動的にプロビジョニング。$ kubectl apply -f nfs-pvc.yaml$ kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEnfs-pvc Pending oci-bv 1m1.マニフェストの適用2. PVC の確認oci-bv ストレージ・クラスの定義に volumeBindingMode: WaitForFirstConsumer が含まれているため、PVC のステータスは Pending となる。
Copyright © 2023, Oracle and/or its affiliates90WordPress を動かしてみるNFS サーバの作成Deployment として、NFS サーバを作成NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEnfs-pvc Bound csi-3ce3f735-04a8-4b22-a768-7ae794d200a7 50Gi RWO oci-bv 141mnfs-server.yamlNFS サーバの Pod が作成されると PVC のステータスが、Pending から Bound に変わり、バインドされたことになる。$ kubectl apply -f nfs-server.yaml1.マニフェストの適用$ kubectl get pvc2. PVC の確認事前に作成した、PVC を指定
Copyright © 2023, Oracle and/or its affiliates91WordPress を動かしてみるNFS サーバの作成WordPress & MySQL から接続する NFS の Service を作成NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP,12250/TCP 33dnfs-service ClusterIP 10.96.211.52 2049/TCP,20048/TCP,111/TCP 167mnfs-service.yaml$ kubectl apply -f nfs-service.yaml1.マニフェストの適用$ kubectl get services2. Service の確認
Copyright © 2023, Oracle and/or its affiliates92WordPress を動かしてみるPV & PVC の作成
Copyright © 2023, Oracle and/or its affiliates93WordPress を動かしてみるPV & PVC の作成WordPress & MySQL Pod から紐づける PVC & PV を作成定義 説明name,labels 多数 PV がある場合に識別しやすくなるため、設定が推奨storageClassName PV の StorageClass を指定PVC は、紐づける PV の storageClassName を指定storage 利用する容量を指定accessModes ・ReadWriteOnce(RWO)単一ノードから Read/Write・ReadOnlyMany(ROX)複数ノードから Read・ReadWriteMany(RWX)複数ノードから Read/WritepersistentVolumeReclaimPolicy ・DeletePV の実体が削除される・Retain指定しない場合は Retain 、PV の実体は削除せずに保持、他の PVC によって、このPVは再マウントされない・RecyclePV のデータを削除 ( rm –rf ./* ) し、再利用可能にする他の PVC によって再マウントされるnfs nfs-service の IP アドレスを入力して、NFS サーバを指定mysql-pv.yamlwordpress-pv.yaml wordpress-pvc.yamlmysql-pvc.yaml
Copyright © 2023, Oracle and/or its affiliates94WordPress を動かしてみるPV & PVC の作成$ kubectl apply -f mysql-pv.yaml1.マニフェストの適用$ kubectl apply -f mysql-pvc.yaml$ kubectl apply -f wordpress-pv.yaml$ kubectl apply -f wordpress-pvc.yaml2. Bound の確認NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpersistentvolumeclaim/mysql-pvc Bound mysql-pv 10Gi RWX mysql 25hpersistentvolumeclaim/nfs-pvc Bound csi-3ce3f735-04a8-4b22-a768-7ae794d200a7 50Gi RWO oci-bv 26hpersistentvolumeclaim/wordpress-pvc Bound wordpress-pv 10Gi RWX wordpress 25hNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpersistentvolume/csi-3ce3f735-04a8-4b22-a768-7ae794d200a7 50Gi RWO Delete Bound default/nfs-pvc oci-bv 26hpersistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-pvc mysql 25hpersistentvolume/wordpress-pv 10Gi RWX Retain Bound default/wordpress-pvc wordpress 25h$ kubectl get pvc,pv
Copyright © 2023, Oracle and/or its affiliates95WordPress を動かしてみるDeployment & Service の作成
Copyright © 2023, Oracle and/or its affiliates96WordPress を動かしてみるDeployment & Service の作成WordPress & MySQL の Deployment を作成定義 説明containers Pod 内のコンテナの設定等を指定します。・imageイメージレジストリ指定します。・env環境変数指定、ここでは環境変数としてMYSQL_ROOT_PASSWORD を定義し、Secrets に登録したパスワードを参照しています。・containerPortコンテナのポート番号を指定します。・volumeMountsPVC で要求する volume をマウントするコンテナ側のディレクトリを指定します。・volumes連携する PVC を指定します。mysql.yaml wordpress.yaml
Copyright © 2023, Oracle and/or its affiliates97WordPress を動かしてみるDeployment & Service の作成WordPress & MySQL の Service を作成定義 説明type ・ClusterIPクラスタ内で Pod 同士が通信するためのプライベートで IP アドレス・NodePort「全ての Kubernetes Node の IPアドレス:port 」で受信したトラフィックをコンテナーに転送する形で外部通信を確立・LoadBalancerLB 経由でアクセス可能なサービス、L4 ロードバランサ機能mysql-service.yaml wordpress-service.yaml
Copyright © 2023, Oracle and/or its affiliates98WordPress を動かしてみるDeployment & Service の作成WordPress & MySQL の Deployment を作成$ kubectl apply -f mysql.yaml$ kubectl apply -f mysql-service.yaml$ kubectl apply -f wordpress.yaml$ kubectl apply -f wordpress-service.yaml2. Pod のステータス確認NAME READY STATUS RESTARTS AGEmysql-8585f7cbd7-9hz79 1/1 Running 0 25hnfs-server-5c9d68c76c-kxq4d 1/1 Running 0 26hwordpress-76f698c64-2qh8m 1/1 Running 0 25h$ kubectl get pods
Copyright © 2023, Oracle and/or its affiliates99WordPress を動かしてみるDeployment & Service の作成3. Service のステータス確認NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP,12250/TCP 34dmysql-service ClusterIP 10.96.94.102 3306/TCP 26hnfs-service ClusterIP 10.96.211.52 2049/TCP,20048/TCP,111/TCP 26hwordpress-service LoadBalancer 10.96.251.162 150.230.xxx.xxx 80:32516/TCP 25h$ kubectl get serviceshttp://EXTERNAL-IP/wp-admin/install.php4. ブラウザアクセス
Copyright © 2023, Oracle and/or its affiliates100WordPress を動かしてみるPod のスケールアウトとインの作成WordPress Pod を 10 個にして、スケールアップ$ kubectl scale deployment wordpress --replicas 10スケールアップの確認$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-c468c5548-bh6t5 1/1 Running 0 6m41snfs-server-754d98f49b-zmfld 1/1 Running 0 10mwordpress-74d8c99c7f-6dhzg 1/1 Running 0 104swordpress-74d8c99c7f-kg96k 1/1 Running 0 104swordpress-74d8c99c7f-m2dg7 1/1 Running 0 104swordpress-74d8c99c7f-mjrsm 1/1 Running 0 6m19swordpress-74d8c99c7f-nzxkd 1/1 Running 0 104swordpress-74d8c99c7f-pbr57 1/1 Running 0 104swordpress-74d8c99c7f-pfrfz 1/1 Running 0 104swordpress-74d8c99c7f-qqtdc 1/1 Running 0 104swordpress-74d8c99c7f-rknbm 1/1 Running 0 105swordpress-74d8c99c7f-svhpj 1/1 Running 0 104s
Copyright © 2023, Oracle and/or its affiliates101WordPress を動かしてみるPod のスケールアウトとインの作成WordPress Pod を 1個 にして、スケールイン$ kubectl scale deployment wordpress --replicas 1スケールインの確認$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-c468c5548-bh6t5 1/1 Running 0 6m41snfs-server-754d98f49b-zmfld 1/1 Running 0 10mwordpress-74d8c99c7f-mjrsm 1/1 Running 0 6m19s
Copyright © 2023, Oracle and/or its affiliates102WordPress を動かしてみるオブジェクトの削除WordPress と MySQL の Deployment と Service を削除$ kubectl delete -f wordpress-service.yaml$ kubectl delete -f wordpress.yaml$ kubectl delete -f mysql-service.yaml$ kubectl delete -f mysql.yamlWordPress と MySQL の PV と PVC を削除$ kubectl delete pvc wordpress-pvc$ kubectl delete pvc mysql-pvc$ kubectl delete pv wordpress-pv$ kubectl delete pv mysql-pv
Copyright © 2023, Oracle and/or its affiliates103WordPress を動かしてみるオブジェクトの削除NFS の Deployment と Service と PVC を削除$ kubectl delete service nfs-service$ kubectl delete deployment nfs-server$ kubectl delete pvc nfs-pvcSecret を削除$ kubectl delete secret mysql
Copyright © 2023, Oracle and/or its affiliates104参考
Copyright © 2023, Oracle and/or its affiliates105参考Docker & Kubernetes KubernetesSecurity日本語書籍Public Cloud & Container/Kubernetes
Copyright © 2023, Oracle and/or its affiliates106参考Certified KubernetesAdministrator資格Certified KubernetesDeveloperCertified KubernetesSecurity Specialist
Thank youCopyright © 2023, Oracle and/or its affiliates107