クラウドサービスは企業にとって今や欠かせないもののひとつとなっていますが、セキュリティやカスタマイズの自由度の観点から、プライベートクラウドやオンプレミスを選択する企業も増えています。しかし、オンプレミスやプライベートクラウドで Kubernetes 環境を構築し、エンタープライズレベルのセキュリティと信頼性で運用するのは簡単ではないです。
Canonical 社が提供する Charmed Kubernetes はパブリッククラウドからオンプレミスまで様々なプラットフォームに対応しており、サービスのデプロイツールである Juju を用いてオンプレミスやプライベートクラウドにおいても容易に Kubernetes の環境を構築・管理できます。
本記事では、 Charmed Kubernetes の特長、構築方法および主な機能について紹介します。
Charmed Kubernetes とは
Charmed Kubernetes は Linux ディストリビューション Ubuntu の開発元であるイギリスの Canonical 社が提供するエンタープライズ向けの Kubernetes ディストリビューションです。
パブリッククラウドからオンプレミスのプライベートクラウドや仮想化基盤、ベアメタルまで、幅広いプラットフォームに対応しており、高可用性、スケーリング、ダウンタイムなしのアップグレード、暗号化通信、永続ストレージなど、エンタープライズレベルのセキュリティと管理機能を備えています。
Charmed Kubernetes の特長
Charmed Kubernetes には次のような特長があります。
クラウド基盤との統合
Charmed Kubernetes は幅広いクラウド基盤と統合することができます。統合することによって、クラウドサービスのネイティブ機能を直接使用することもできます。例えば、AWSと統合することで、AWS が提供しているストレージサービス(EBS)やロードバランサーサービス(ELB)をデフォルトで利用可能です。
アップストリーム Kubernetes の最新バージョン対応
Charmed Kubernetes はアップストリーム Kubernetes と並行してリリースされているため、アップストリーム Kubernetes の最新バージョンへアップグレードすることができ、いち早く最新機能を活用することが可能です。
幅広いプラットフォームに対応
Charmed Kubernetes は幅広いプラットフォームに対応しています。現時点では以下のプラットフォームに対応しています。
- パブリッククラウド
- Amazon AWS
- Google GCE
- Microsoft Azure
- Oracle
- Rackspace
- Equinix Metal
- プライベートクラウド
- OpenStack
- VMware vSphere
- MAAS
- ローカル
- LXD
可用性とセキュリティに優れたエンタープライズ向けの Kubernetes
パブリッククラウドの場合は、クラウドベンダーが提供する機能によって、一部のデータセンターに障害が起きてもサービスが継続して利用できる構成となっています。一方、オンプレミスのプライベートクラウドの場合は、障害対策のためにサーバの冗長化やバックアップなどの措置が必要になります。
Charmed Kubernetes は高可用性機能を提供しており、一部のサーバに障害が起きても、Kubernetes クラスタが動作し続けます。また、Charmed Kubernetes のすべてのコンポーネントが TLS による暗号化通信を行うため、セキュアで堅牢な Kubernetes を実現できます。
Juju とは
Juju は Canonical 社が開発しているサービスをデプロイするための自動化ツールです。
Juju を用いて対応しているプラットフォーム上に複数の Ubuntu サーバの作成から、Kubernetes クラスタの構築まで、いくつかのコマンドを実行するだけで、簡単に行えます。
本記事では、Juju を用いて Charmed Kubernetes クラスタを構築し、以下の機能について動作確認を行います。
- スケーリング
- アップグレード
- モニタリング
- 永続ストレージ(こちらを参照)
検証環境およびバージョン情報
Charmed Kubernetes は様々なプラットフォーム上に構築できますが、本記事では気軽に利用できるパブリッククラウド AWS を使って Charmed Kubernetes を構築します。各ソフトウェアは投稿時点での最新バージョンを利用しています。
環境およびバージョン情報は以下の通りです。
- Kubernetes 1.23
- Juju 2.9.22
- ローカルの作業環境: Ubuntu 20.04.3 LTS (Focal Fossa)
Juju がクラウドにアクセスするために、認証情報の登録が必要になります。
AWS の場合は、アクセスキーとシークレットキーが必要になりますので、事前に確認しておいてください。
Charmed Kubernetesのデプロイ
Juju のインストール
Juju をインストールします。
$ sudo snap install juju --classic
kubectl のインストール
kubectl
をインストールします。
$ sudo snap install kubectl --classic
クレデンシャルの追加
Juju に AWS にアクセスするためのクレデンシャルを登録します。
$ juju add-credential aws Select region [any region, credential is not region specific]: <任意のリージョンを指定> Using auth-type "access-key". Enter access-key: <アクセスキー> Enter secret-key: <シークレットアクセスキー> Credential "aws" added locally for cloud "aws".
登録後、以下のコマンドを実行し、AWS が登録されていることを確認します。
$ juju clouds ... Clouds available on the client: Cloud Regions Default Type Credentials Source Description aws 22 us-east-1 ec2 1 public Amazon Web Services localhost 1 localhost lxd 0 built-in LXD Container Hypervisor
Juju コントローラーのデプロイ
Juju コントローラーをデプロイします。
Juju コントローラーは、Juju を使ってデプロイされたサービスを管理するために使用されます。以下のコマンドを実行すると、us-east-1 リージョンの EC2 インスタンスに Juju コントローラーがデプロイされます。リージョンを指定したい場合には、juju bootstrap aws/<リージョン> <コントローラー名>
を実行してください。
$ juju bootstrap aws k8s-controller
デフォルトでは、 「mem=4G cores=2 」の t2.medium タイプの EC2 インスタンスが Juju コントローラーのマシンとして作成されます。CPU やメモリを変更したい場合は、デプロイ時に --bootstrap-constraints
を指定することでインスタンスタイプを変更できます。
$ juju bootstrap --bootstrap-constraints "mem=8G cores=4" aws k8s-controller
モデルの作成
Juju モデルはアプリケーションやマシンがデプロイされるワークスペースです。コントローラーは複数のモデルを持つことができますが、モデルは単一のコントローラーにしか関連付けられません。各モデルは複数のマシン、サービスを持つことができます。
サービスをデプロイする際に、デフォルトでは default というモデルにデプロイされますが、サービスごとにモデルを作成することを推奨されているため、ここでは Kubernetes 専用のモデルを作成します。
$ juju add-model k8s
モデルが作成されていることを確認します。
$ juju status Model Controller Cloud/Region Version SLA Timestamp k8s k8s-controller aws/us-east-1 2.9.22 unsupported 12:02:03+09:00 $ juju models Controller: k8s-controller Model Cloud/Region Type Status Machines Cores Access Last connection controller aws/us-east-1 ec2 available 1 2 admin just now default aws/us-east-1 ec2 available 0 - admin 53 seconds ago k8s* aws/us-east-1 ec2 available 0 - admin 14 seconds ago
Kubernetes のデプロイ
準備ができましたので、早速 Kubernetes をデプロイしましょう。
Juju を利用してアプリケーションをデプロイするには、Charm または Bundle を使います。
Charm を利用することで任意のマシンにアプリケーションをデプロイできます。複数アプリケーションから構成されるサービスでは、アプリケーションデプロイ後、アプリケーション同士の関連付けを設定する必要があります。Bundle は YAML 形式で記述したスクリプトファイルで、マシンの作成から、アプリケーションのデプロイ、そして関連付けまでの一連の処理を自動的にセットアップしてくれるツールです。
今回は Charm から Kubernetes をデプロイします。また、AWS のストレージサービスなどを利用するために、--overlay
を利用してクラウド統合機能を有効にします。--overlay
については後述します。デフォルトでは最新版がインストールされます。バージョンを指定してインストールを行う場合は後述する Bundle を使用したインストールを参照してください。
$ wget https://raw.githubusercontent.com/charmed-kubernetes/bundle/master/overlays/aws-overlay.yaml $ juju deploy charmed-kubernetes --overlay aws-overlay.yaml --trust
すべてのアプリケーションのデプロイが完了するまで、15分~20分程度かかります。すべてのアプリケーション(App) の「Status」が「active」になったらデプロイ完了です。
juju status
コマンドで状態を確認してみましょう。
App には Kubernetes の各コンポーネント、Machine には各インスタンスが表示されます。デフォルトでは 11台のマシン(インスタンス)が立ち上がり、マスタノード2台、ワーカーノード3台の Kubernetes クラスタが構成されます。
$ juju status Model Controller Cloud/Region Version SLA Timestamp k8s k8s-controller aws/us-east-1 2.9.22 unsupported 12:27:04+09:00 App Version Status Scale Charm Store Channel Rev OS Message aws-integrator 1.15.58 active 1 aws-integrator charmstore stable 174 ubuntu Ready containerd go1.13.8 active 5 containerd charmstore stable 200 ubuntu Container runtime available easyrsa 3.0.1 active 1 easyrsa charmstore stable 441 ubuntu Certificate Authority connected. etcd 3.4.5 active 3 etcd charmstore stable 655 ubuntu Healthy with 3 known peers flannel 0.11.0 active 5 flannel charmstore stable 619 ubuntu Flannel subnet 10.1.6.1/24 kubeapi-load-balancer 1.18.0 active 1 kubeapi-load-balancer charmstore stable 866 ubuntu Loadbalancer ready. kubernetes-master 1.23.4 active 2 kubernetes-master charmstore stable 1106 ubuntu Kubernetes master running. kubernetes-worker 1.23.4 active 3 kubernetes-worker charmstore stable 838 ubuntu Kubernetes worker running. Unit Workload Agent Machine Public address Ports Message aws-integrator/0* active idle 0 54.196.183.155 Ready easyrsa/0* active idle 1 34.232.80.105 Certificate Authority connected. etcd/0 active idle 2 54.204.103.118 2379/tcp Healthy with 3 known peers etcd/1 active idle 3 3.236.214.69 2379/tcp Healthy with 3 known peers etcd/2* active idle 4 44.198.164.226 2379/tcp Healthy with 3 known peers kubeapi-load-balancer/0* active idle 5 107.22.102.7 443/tcp,6443/tcp Loadbalancer ready. kubernetes-master/0* active idle 6 44.200.39.125 6443/tcp Kubernetes master running. containerd/3 active idle 44.200.39.125 Container runtime available flannel/3 active idle 44.200.39.125 Flannel subnet 10.1.2.1/24 kubernetes-master/1 active idle 7 3.83.124.151 6443/tcp Kubernetes master running. containerd/0* active idle 3.83.124.151 Container runtime available flannel/0 active idle 3.83.124.151 Flannel subnet 10.1.6.1/24 kubernetes-worker/0* active idle 8 54.160.123.197 80/tcp,443/tcp Kubernetes worker running. containerd/1 active idle 54.160.123.197 Container runtime available flannel/1* active idle 54.160.123.197 Flannel subnet 10.1.42.1/24 kubernetes-worker/1 active idle 9 54.209.207.221 80/tcp,443/tcp Kubernetes worker running. containerd/2 active idle 54.209.207.221 Container runtime available flannel/2 active idle 54.209.207.221 Flannel subnet 10.1.13.1/24 kubernetes-worker/2 active idle 10 3.81.86.195 80/tcp,443/tcp Kubernetes worker running. containerd/4 active idle 3.81.86.195 Container runtime available flannel/4 active idle 3.81.86.195 Flannel subnet 10.1.35.1/24 Machine State DNS Inst id Series AZ Message 0 started 54.196.183.155 i-02e9a6edcd5ac1cd5 focal us-east-1a running 1 started 34.232.80.105 i-05671fd8500a33119 focal us-east-1f running 2 started 54.204.103.118 i-0f28aea6be2d08e9d focal us-east-1d running 3 started 3.236.214.69 i-0159b2e42b4b9c24e focal us-east-1f running 4 started 44.198.164.226 i-0fd02e8e11ec1bfef focal us-east-1c running 5 started 107.22.102.7 i-0bbd5a7a0ef45e4ef focal us-east-1b running 6 started 44.200.39.125 i-05096429e51aeaa39 focal us-east-1c running 7 started 3.83.124.151 i-07c224c10603b0218 focal us-east-1d running 8 started 54.160.123.197 i-03a01a0e7b2bfe073 focal us-east-1e running 9 started 54.209.207.221 i-003d3e37b1a655e2e focal us-east-1a running 10 started 3.81.86.195 i-001459c2be09d5db8 focal us-east-1b running
Charmed Kubernetes 設定のカスタマイズ
Charmed Kubernetes の設定をカスタマイズする方法は2つあります。
- Bundle ファイルの使用
- Overlay の使用
Bundle ファイルの使用
Bundle ファイルは各種設定、デプロイの手順などを記載した YAML ファイルです。Bundle ファイルを必要に応じて編集することで、設定のカスタマイズが可能です。
特定の Kubernetes バージョンの Bundle ファイルは、こらちからダウンロードできます。
一例として、v1.21 の Bundle ファイルをダウンロードし、ワーカーノードの数を変更してみます。
$ wget https://api.jujucharms.com/charmstore/v5/charmed-kubernetes-733/archive/bundle.yaml $ vi bundle.yaml (ワーカーノードの数を3->4に変更) ... kubernetes-worker: annotations: gui-x: '90' gui-y: '850' charm: cs:~containers/kubernetes-worker-838 constraints: cores=4 mem=4G root-disk=16G expose: true num_units: 4 ...
Bundle ファイルを用いてデプロイします。
juju deploy ./bundle.yaml
Overlayの使用
--overlay
オプションを利用することで、デフォルトの設定にマージ、またはデフォルトの設定を上書きすることができます。
例えば、Google Cloud 統合機能を利用する場合は、以下の設定を --overla
y オプションに指定します。
description: Charmed Kubernetes overlay to add native GCP support. applications: gcp-integrator: annotations: gui-x: "600" gui-y: "300" charm: cs:~containers/gcp-integrator num_units: 1 trust: true relations: - ['gcp-integrator', 'kubernetes-master'] - ['gcp-integrator', 'kubernetes-worker']
各クラウドサービスむけの機能統合のYAMLファイルはこちらからダウンロードできます。
Google Cloud を利用する場合は、以下の手順を実行します。
$ wget https://raw.githubusercontent.com/charmed-kubernetes/bundle/master/overlays/gcp-overlay.yaml $ juju deploy charmed-kubernetes --overlay gcp-overlay.yaml --trust
また、一部の設定を変更したい場合も、--overlay
オプションが利用可能です。
例えば、ワーカーノードのデフォルトの制約は「constraints: cores=4 mem=4G root-disk=16G」となりますが、以下の設定を --overlay
に設定することで、デフォルトの設定を上書きすることができます。
$ cat myoverlay.yaml applications: kubernetes-worker: constraints: cores=4 mem=8G root-disk=100G num_units: 3 $ juju deploy charmed-kubernetes --overlay myoverlay.yaml
Kubernetes クラスタへ接続
Charmed Kubernetes のデプロイが完了したら、Kubernetes に接続してクラスタの状態を確認します。
まず、マスタノードから接続設定ファイルを取得します。
$ mkdir -p .kube $ juju scp kubernetes-master/0:config ~/.kube/config
次に、馴染みのある kubectl get
コマンドを実行し、ワーカーノードや Pod の状態を確認してみます。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-31-26-174.ec2.internal Ready <none> 21m v1.23.4 ip-172-31-42-12.ec2.internal Ready <none> 19m v1.23.4 ip-172-31-49-88.ec2.internal Ready <none> 22m v1.23.4 $ kubectl get pods --all-namespaces NAME STATUS ROLES AGE VERSION ip-172-31-26-174.ec2.internal Ready <none> 21m v1.23.4 ip-172-31-42-12.ec2.internal Ready <none> 19m v1.23.4 ip-172-31-49-88.ec2.internal Ready <none> 22m v1.23.4 $ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE ingress-nginx-kubernetes-worker default-http-backend-kubernetes-worker-6cd58d8886-nthsf 1/1 Running 0 21m ingress-nginx-kubernetes-worker nginx-ingress-controller-kubernetes-worker-mb75q 1/1 Running 0 21m ingress-nginx-kubernetes-worker nginx-ingress-controller-kubernetes-worker-vjp95 1/1 Running 0 19m ingress-nginx-kubernetes-worker nginx-ingress-controller-kubernetes-worker-wgbfj 1/1 Running 0 18m kube-system coredns-5564855696-b2fcm 1/1 Running 0 25m kube-system kube-state-metrics-5ccbcf64d5-5g49x 1/1 Running 0 25m kube-system metrics-server-v0.5.1-79b4746b65-bzhm5 2/2 Running 0 25m kubernetes-dashboard dashboard-metrics-scraper-5cd54464bf-kc54z 1/1 Running 0 25m kubernetes-dashboard kubernetes-dashboard-55796c99c-r7v76 1/1 Running 0 25m
AWS 統合機能によって、デフォルトの StorageClass が自動的に作成されていることを確認します。
$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE cdk-ebs kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 26m
これで Kubernetes クラスタのデプロイは完了です。
スケーリング
Kubernetes クラスタのスケーリングとは、ワーカーノードを追加または削除することです。
Kubernetes クラスタにワーカーノードを追加することをクラスタのスケールアップ、クラスタからノードを削除することをクラスタのスケールダウンと言います。
Charmed Kubernetes では juju add-unit/remove-unit
を実行することで、簡単にクラスタのスケールアップ/スケールダウンを行えます。
スケールアップ
新しいノードをクラスタに追加します。
$ juju add-unit kubernetes-worker -n 1
新しいワーカーノードが追加されていることを確認します。
$ juju status ... kubernetes-worker/0* active idle 8 54.160.123.197 80/tcp,443/tcp Kubernetes worker running. containerd/1 active idle 54.160.123.197 Container runtime available flannel/1* active idle 54.160.123.197 Flannel subnet 10.1.42.1/24 kubernetes-worker/1 active idle 9 54.209.207.221 80/tcp,443/tcp Kubernetes worker running. containerd/2 active idle 54.209.207.221 Container runtime available flannel/2 active idle 54.209.207.221 Flannel subnet 10.1.13.1/24 kubernetes-worker/2 active idle 10 3.81.86.195 80/tcp,443/tcp Kubernetes worker running. containerd/4 active idle 3.81.86.195 Container runtime available flannel/4 active idle 3.81.86.195 Flannel subnet 10.1.35.1/24 kubernetes-worker/3 active idle 11 174.129.117.55 80/tcp,443/tcp Kubernetes worker running. containerd/5 active idle 174.129.117.55 Container runtime available flannel/5 active idle 174.129.117.55 Flannel subnet 10.1.7.1/24 $ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ip-172-31-26-174.ec2.internal Ready 44m v1.23.4 172.31.26.174 54.209.207.221 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-42-12.ec2.internal Ready 42m v1.23.4 172.31.42.12 3.81.86.195 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-49-88.ec2.internal Ready 45m v1.23.4 172.31.49.88 54.160.123.197 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-83-85.ec2.internal Ready 13m v1.23.4 172.31.83.85 174.129.117.55 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5
スケールダウン
スケールダウンするときには、ノードを安全に停止・削除するために、その Node 上で実行中の Podを退去させてから、スケールダウンを行う必要があります。
検証用の Nginx の Pod をデプロイします。
$ kubectl create deployment --image=nginx nginx
Nginx の Pod がデプロイされているワーカーノードを確認します。「ip-172-31-83-85.ec2.internal」というノード(kubernetes-worker/3)にデプロイされています。今回は、kubernetes-worker/3 を削除してみます。
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-85b98978db-hsbvd 1/1 Running 0 2m41s 10.1.7.2 ip-172-31-83-85.ec2.internal
ノードを安全に停止・削除するために、以下のコマンドを実行し、kubernetes-worker/3 上で動作中の Nginx の Pod を移動させ、新たに Pod がスケジュールされないようにします。
$ juju run-action kubernetes-worker/3 pause --wait unit-kubernetes-worker-3: UnitId: kubernetes-worker/3 id: "2" results: Stderr: | WARNING: ignoring DaemonSet-managed Pods: ingress-nginx-kubernetes-worker/nginx-ingress-controller-kubernetes-worker-rwt52 status: completed timing: completed: 2022-02-16 04:14:20 +0000 UTC enqueued: 2022-02-16 04:14:16 +0000 UTC started: 2022-02-16 04:14:17 +0000 UTC
上記コマンドを実行すると、ノードが SchedulingDisabled になり、Pod が別のノード上で起動していることを確認できます。
$ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ip-172-31-26-174.ec2.internal Ready 55m v1.23.4 172.31.26.174 54.209.207.221 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-42-12.ec2.internal Ready 53m v1.23.4 172.31.42.12 3.81.86.195 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-49-88.ec2.internal Ready 56m v1.23.4 172.31.49.88 54.160.123.197 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-83-85.ec2.internal Ready,SchedulingDisabled 24m v1.23.4 172.31.83.85 174.129.117.55 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 $ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-85b98978db-x9dzg 1/1 Running 0 2m5s 10.1.35.2 ip-172-31-42-12.ec2.internal
これで、kubernetes-worker/3 ノードを安全に削除することができます。
$ juju remove-unit kubernetes-worker/3
しばらく経つと、kubernetes-worker/3 ノードが削除されていることを確認できます。
$ juju status ... kubernetes-worker/0* active idle 8 54.160.123.197 80/tcp,443/tcp Kubernetes worker running. containerd/1 active idle 54.160.123.197 Container runtime available flannel/1* active idle 54.160.123.197 Flannel subnet 10.1.42.1/24 kubernetes-worker/1 active idle 9 54.209.207.221 80/tcp,443/tcp Kubernetes worker running. containerd/2 active idle 54.209.207.221 Container runtime available flannel/2 active idle 54.209.207.221 Flannel subnet 10.1.13.1/24 kubernetes-worker/2 active idle 10 3.81.86.195 80/tcp,443/tcp Kubernetes worker running. containerd/4 active idle 3.81.86.195 Container runtime available flannel/4 active idle 3.81.86.195 Flannel subnet 10.1.35.1/24 $ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ip-172-31-26-174.ec2.internal Ready 68m v1.23.4 172.31.26.174 54.209.207.221 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-42-12.ec2.internal Ready 67m v1.23.4 172.31.42.12 3.81.86.195 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5 ip-172-31-49-88.ec2.internal Ready 69m v1.23.4 172.31.49.88 54.160.123.197 Ubuntu 20.04.4 LTS 5.11.0-1028-aws containerd://1.5.5
アップグレード
この節では、Charmed Kubernetes のマスタノードとワーカーノードのアップグレード方法を説明します。その他のコンポーネント containerd、easyrsa、etcd、flannel、kubeapi-load-balancer については、ドキュメントを参照してください。
Charmed Kubernetes のワーカーノードをアップグレードするために、2つの方法があります。
- Blue-green アップグレード: この方法では一時的により多くのリソースを利用しますが、一番安全でダウンタイムのないアップグレードを行えます。
- In-place アップグレード: この方法では既存のノードのアップグレードを行い、追加のリソースは必要ありませんが、サービスの停止が発生します。
本番環境で利用する場合は、Blue-green アップグレードを推奨します。
ここでは、Blue-green アップグレードを利用したワーカーノードのアップグレードを検証してみます。
アップグレードする前に、Charmed Kubernetes が対応している Kubernetes のバージョン情報を確認します。今回は v1.21 の Charmed Kubernetes を v1.23 にアップグレードします。
検証用の Kubernetes クラスタをデプロイします。
$ wget https://raw.githubusercontent.com/charmed-kubernetes/bundle/master/releases/1.21/bundle.yaml $ juju deploy ./bundle.yaml
マスタノードとワーカーノードのバージョンを確認します。
$ juju status ... App Version Status Scale Charm Store Channel Rev OS Message containerd go1.13.8 active 5 containerd charmstore stable 146 ubuntu Container runtime available easyrsa 3.0.1 active 1 easyrsa charmstore stable 395 ubuntu Certificate Authority connected. etcd 3.4.5 active 3 etcd charmstore stable 607 ubuntu Healthy with 1 known peer flannel 0.11.0 active 3 flannel charmstore stable 571 ubuntu Flannel subnet 10.1.78.1/24 kubeapi-load-balancer 1.18.0 active 1 kubeapi-load-balancer charmstore stable 814 ubuntu Loadbalancer ready. kubernetes-master 1.21.9 active 2 kubernetes-master charmstore stable 1034 ubuntu Restarting snap.kube-proxy.daemon service kubernetes-worker 1.21.9 active 3 kubernetes-worker charmstore stable 788 ubuntu Waiting for kube-proxy to start. $ juju scp kubernetes-master/0:config ~/.kube/config $ kubectl get node NAME STATUS ROLES AGE VERSION ip-172-31-1-0 Ready <none> 3m1s v1.21.9 ip-172-31-44-16 Ready <none> 3m9s v1.21.9 ip-172-31-92-202 Ready <none> 3m6s v1.21.9
まず、kubeapi-load-balancer をアップグレードします。
$ juju upgrade-charm kubeapi-load-balancer
次に、マスタノードをアップグレードします。以下のようにバージョンを指定して、upgrade を実行すると、マスタノードのアップグレードが始まります。
$ juju upgrade-charm kubernetes-master $ juju config kubernetes-master channel=1.23/stable $ juju run-action kubernetes-master/0 upgrade $ juju run-action kubernetes-master/1 upgrade
最後に、ワーカーノードをアップグレードします。ワーカーノードのアップグレードを検証するために、アプリケーションをデプロイします。
$ kubectl create deployment --image=nginx nginx $ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-74d589986c-d8gqr 1/1 Running 0 6m51s 10.1.30.2 ip-172-31-30-80
ワーカーノードのバージョンを設定します。
$ juju upgrade-charm kubernetes-worker $ juju config kubernetes-worker channel=1.23/stable
$ kubectl get node NAME STATUS ROLES AGE VERSION ip-172-31-14-158 Ready <none> 25m v1.21.9 ip-172-31-30-80 Ready <none> 25m v1.21.9 ip-172-31-64-109 Ready <none> 23m v1.21.9
新たにワーカーノードを3つ追加します。新しく追加されるワーカーノードは新しいバージョンで作成されます。
$ juju add-unit kubernetes-worker -n 3
$ kubectl get node NAME STATUS ROLES AGE VERSION ip-172-31-14-158 Ready <none> 44m v1.21.9 ip-172-31-30-80 Ready <none> 44m v1.21.9 ip-172-31-46-231 Ready <none> 70s v1.23.4 ip-172-31-46-47 Ready <none> 4m58s v1.23.4 ip-172-31-64-109 Ready <none> 42m v1.21.9 ip-172-31-81-150 Ready <none> 2m13s v1.23.4
旧バージョンのワーカーノードを一時停止します。
$ juju run-action kubernetes-worker/0 pause $ juju run-action kubernetes-worker/1 pause $ juju run-action kubernetes-worker/2 pause
すると、Nginx の Pod が新バージョンのワーカーノードに移動されます。
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-74d589986c-d8gqr 1/1 Running 0 17m 10.1.30.2 ip-172-31-81-150
これで、旧バージョンのワーカーノード安全に削除することができます。
$ juju remove-unit kubernetes-worker/0 $ juju remove-unit kubernetes-worker/1 $ juju remove-unit kubernetes-worker/2 $ kubectl get node NAME STATUS ROLES AGE VERSION ip-172-31-46-231 Ready <none> 22m v1.23.4 ip-172-31-46-47 Ready <none> 26m v1.23.4 ip-172-31-81-150 Ready <none> 24m v1.23.4 $ juju status App Version Status Scale Charm Store Channel Rev OS Message containerd go1.13.8 active 4 containerd charmstore stable 200 ubuntu Container runtime available easyrsa 3.0.1 active 1 easyrsa charmstore stable 441 ubuntu Certificate Authority connected. etcd 3.4.5 active 1 etcd charmstore stable 655 ubuntu Healthy with 1 known peer flannel 0.11.0 active 4 flannel charmstore stable 619 ubuntu Flannel subnet 10.1.66.1/24 kubeapi-load-balancer 1.18.0 active 1 kubeapi-load-balancer charmstore stable 866 ubuntu Loadbalancer ready. kubernetes-master 1.23.4 active 1 kubernetes-master charmstore stable 1106 ubuntu Kubernetes master running. kubernetes-worker 1.23.4 active 3 kubernetes-worker charmstore stable 838 ubuntu Kubernetes worker running.
モニタリング
Charmed Kubernetes では Prometheus によるモニタリング機能が利用可能です。
Kubernetes では Prometheus を利用した監視がよく使われています。Prometheus がクラスタの各種メトリクスを収集し、Grafana と連携して、Grafana のダッシュボードで Kubernetes クラスタとクラスタ上で動作するアプリケーションを監視することができます。
Prometheus によるモニタリング機能を利用するために、Bundleファイルをダウンロードし、デプロイ時に --overlay
オプションに指定します。
$ wget https://raw.githubusercontent.com/charmed-kubernetes/bundle/master/overlays/monitoring-pgt-overlay.yaml $ juju deploy charmed-kubernetes --overlay monitoring-pgt-overlay.yaml
prometheus、grafana、telegraf が起動していることを確認できます。
$ juju status Model Controller Cloud/Region Version SLA Timestamp k8s k8s-controller aws/us-east-1 2.9.22 unsupported 15:17:06+09:00 App Version Status Scale Charm Store Channel Rev OS Message containerd go1.13.8 active 4 containerd charmstore stable 200 ubuntu Container runtime available easyrsa 3.0.1 active 1 easyrsa charmstore stable 441 ubuntu Certificate Authority connected. etcd 3.4.5 active 1 etcd charmstore stable 655 ubuntu Healthy with 1 known peer flannel 0.11.0 active 4 flannel charmstore stable 619 ubuntu Flannel subnet 10.1.24.1/24 grafana active 1 grafana charmhub stable 51 ubuntu Ready kubeapi-load-balancer 1.18.0 active 1 kubeapi-load-balancer charmstore stable 866 ubuntu Loadbalancer ready. kubernetes-master 1.23.4 active 1 kubernetes-master charmstore stable 1106 ubuntu Kubernetes master running. kubernetes-worker 1.23.4 active 3 kubernetes-worker charmstore stable 838 ubuntu Kubernetes worker running. prometheus active 1 prometheus2 charmhub stable 25 ubuntu Ready telegraf active 4 telegraf charmhub stable 44 ubuntu Monitoring kubernetes-worker/1 (source version/commit 26e531a) ...
以下のコマンドを実行し、Grafana の URL とログイン情報を取得します。
$ juju run-action --wait grafana/0 get-login-info unit-grafana-0: UnitId: grafana/0 id: "4" results: password: 3cSfb2PshGHPLWJ4 url: http://<IP Address>:3000/ username: admin status: completed ...
ブラウザから上記コマンドで確認した Grafana の URL に接続し、ログインします。Grafana のダッシュボードで Kubernetes クラスタ全体のリソースの使用状況などが確認できます。
おわりに
今回は Canonical Kubernetes ディストリビューション Charmed Kubernetes の特長、構築方法、スケーリング、アップグレード、モニタリング機能について紹介しましたが、いかがでしたでしょうか。
Juju というアプリケーションのデプロイツールを用いてオンプレミスでもコマンドを実行するだけで容易に Kubernetes 環境を構築できる Charmed Kubernetes は魅力的ではないでしょうか。
次回はエンタープライズでの利用に欠かせない永続的ストレージについて説明します。