フューチャー技術ブログ

k3sを知る、動かす、感じる

はじめに

こんにちは。TIG/DXチームの伊藤太斉です。本記事はCNCF連載の第1弾になります。

アプリケーションをコンテナ化することが主流になった昨今、エッジコンピューティングでもコンテナを利用する機会が出てきました。そのため、サーバー上でKubernetesを利用して、コンテナをオーケストレーションをするのと同じようにエッジデバイスでもコンテナを管理する機能が求められるようになってきました。

ここで、本記事では2020年の8月にCNCF入りを果たしたk3sについて触れていきます。

k3sとは

k3sは元々Rancher Labs(本社:アメリカ フロリダ州クパチーノ)で開発されていたOSSで2019年の2月に発表されました。発表当初はKubernetesの公式ディストリビューションであること、バイナリが40MB以下であることから話題にもなりました。エンタープライズでKubernetesを利用している企業が、エッジデバイスでもコンテナを利用できるようにし、さらに拡張したKubernetes as a Service(KaaS)基盤の運用・監視などを一元化することが可能になります。そのため、最適な用途としては以下が挙げられています。

  • エッジコンピューティング
  • CI
  • ARM環境
  • IoT
  • 開発環境
  • 組み込みKubernetes

k3sの5つの変更

k3sの名前の由来はKubernetes(k8s)から5つの変更が入っていることに由来します。

(引用: https://k3s.io/)

1. データストアの変更

Kubernetesのマスタにあるデータストアはデフォルトではetcdですが、k3sではSQLiteに置き換えられています。ただ、もちろん固定ではなく、MySQL、PostgreSQL、etcdなどのデータストアも利用可能です。

2. コンポーネントのシングルバイナリ化

Kubernetesのコントロールプレーンが動くために必要なコンポーネントが1つのバイナリ、プロセスにまとまっています。その分、煩雑なクラスター操作(証明書の配布など)を自動化できるメリットがあります。

3. 外部との依存を最小化

k3sに必要な以下のパッケージをのぞいて、全て外部との依存を最小限に抑えています。

  • containerd
  • Flannel
  • CoreDNS
  • ホストユーティリティ

4. 機能の組み込み

k3sのベースの機能としてHelmコントローラー、Traefikイングレスコントローラーなど、k3s単体で利用できるようになっています。

5. プラグインの削除

Kubernetesにはストレージや各クラウドプロバイダーへのプラグインが存在していましたが、k3sではこれらが取り除かれています。

Kubernetesからの変更点をみてみると、改めて比較的コンピューティングリソースが少ない環境でも利用できるようにしていることがわかります。

いざ実際に動かしてみる

前提の知識を得ることも大事ですが、実際に触ってみることも大事ですよね。ということで、大好きなGCPでk3sを動かしてみたいと思います。今回はk3sが動く最低限として、

  • RAM:最小512MB
  • CPU:最低1CPU

とされているので、Server側をn1-standard-1(vCPU x 1、メモリ 3.75 GB)、Agent側をf1-micro(vCPU x 1、メモリ 0.6 GB)で動かしてみることにします。またOSはUbuntu18.04としています。

ファイアウォール

Serverへ外部からアクセスができるように

  • Inbound: 0.0.0.0/0
  • tcp:6443

で開けましょう

Serverのインストール

インスタンス名をk3s-serverとしています。はじめにServer側のインストールを行います。

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable-agent" K3S_KUBECONFIG_MODE="644" sh -

今回、agentは別のサーバーに入れるのでINSTALL_K3S_EXEC="--disable-agent"を追加、またkubeconfigを読めるようにするためにK3S_KUBECONFIG_MODE="644"を追加しています。

インストールまで済んだらagentに登録するトークンを出力しましょう

cat /var/lib/rancher/k3s/server/node-token

Agentのインストール

インスタンス名をk3s-agent-xとして立てています。Agent側は以下でインストールを行います。事前にcatしたトークン、Serverの外部IPを使うので準備してください

curl -sfL https://get.k3s.io | K3S_TOKEN=[server_token] K3S_URL=https://[server_external_ip]:6443 sh -

ここまで来ればnode(Agent)の確認ができると思うので、Server側で確認してみましょう

k3s kubectl get nodes

また、/etc/rancher/k3s/k3s.yaml配下のファイルを手元のPCに持ってくるとローカルからもnodeの確認ができます

/etc/rancher/k3s/k3s.yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: secret
server: https://[server_external_ip]:6443 # ここをServerの外部IPに書き換え
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
password: xxxxxxxxxxxxx
username: admin

サンプルを動かす

k3sクラスターを立てることができたので、簡単なサンプルを利用して、動くかみてみたいと思います。
今回使うサンプルは公式のKubernetes Deployment: How to Run a Containerized Workload on a Clusterから借りています。
はじめに、以下をapplyします。

testdeploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysite
labels:
app: mysite
spec:
replicas: 1
selector:
matchLabels:
app: mysite
template:
metadata:
labels:
app: mysite
spec:
containers:
- name: mysite
image: kellygriffin/hello:v1
ports:
- containerPort: 80

applyが完了したら、podの起動を確認して、以下のコマンドでcurlしましょう。

kubectl exec -it [container_name] curl localhost

実行すると以下が返ってくるかと思います。

<!DOCTYPE html>
<html>
<head>
<title>Hello World This is Version 1 of our Application</title>
</html>

次にスケールさせるためにReplicaを4にしてみましょう。

kubectl scale --replicas=4 deploy/mysite

スケールしていることを確認しましょう。

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysite-5bc4c5898d-8s448 1/1 Running 0 11m
mysite-5bc4c5898d-5d68q 1/1 Running 0 2m11s
mysite-5bc4c5898d-2zcpp 1/1 Running 0 3s
mysite-5bc4c5898d-nc6pc 1/1 Running 0 3s

まとめ

実利用がかなり浸透してきているKubernetesですが、k3sはさらに舞台を広げてくれるものだなと改めて思いました。

動かしている途中で感じたことですが、KubernetesではMasterとNodeでしたが、k3sはServerとAgentという風に呼び方を変えています。ここについては、Serverは本当にコントロールプレーンとしてサーバー上において、Agentはエッジデバイスに置くといった感じで、クラウドのみではなく、環境が異なってもクラスター管理できるのかなと感じました。別パターンとして、組み込みKubernetesであればクラスタ毎埋めることもできたりしそうですね(Agentを合わせる、別にするというオプションが取れるので)。

ここまで書いてきたk3sですが、試すのもお手軽なので、是非一度試して簡単さを実感してみてください。

参考