fbpx

k0s Kubernetesのセットアップ簡易版 #k0s #kubernetes #mirantis #docker #iot #edge

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本ブログは Mirantis社のblog記事「How to set up k0s Kubernetes: A quick and dirty guide」の翻訳記事です。

ここ数週間、Mirantis では Kubernetes を簡単に利用する一つの方法として k0s プロジェクトについて話題に上げてきました。今回の簡易版ガイドでは、k0s を始めるための手順を説明します。

k0s の Kubernetes アーキテクチャは、Linux カーネルを含むあらゆるシステム上で Kubernetes を実行するために必要なすべてを含む単一のバイナリで構成されています。

それだけに、始めるのは次のようにとても簡単です。

  1. k0s バイナリをダウンロードします。
  2. Kubernetesコントロールプレーンをインスタンス化するためのサーバーを作成します。
  3. Kubernetes worker を作成します。
  4. クラスターにアクセスして利用開始しましょう!

もちろん、さらにコントローラやサーバーを追加することも可能です。

しかし、今回は最もシンプルな「必要なものをすべて実行する単一のサーバー構成」から始めます。

k0sでシングルノードKubernetesクラスタを作成する

はじめに、k0s のコントローラとして動作するサーバを作成しましょう。(シングルノード構成なのでコントローラノードでは無いことに注意してください。)

k0s の Kubernetes の実装についての詳細は Jussi Nummelin のブログを参照してください。

また、コントローラプロセスは Pod としてではなく、ホスト上で直接実行されていますので、いわゆる「master」ノードは存在しません。

動作させるホスト自体は高価なインスタンスである必要はありません。このブログでは、Amazon Linux 2 を実行している AWS t2.medium インスタンス ( 2CPU、4GB RAM ) を使用しました。 クラスタと通信できるようにポート 6443 が開いていることを確認してください。

次の簡単なコマンドで k0s をインストールできます。

sudo curl -sSLf k0s.sh | sudo sh

( k0s.sh というスクリプトはどこから出てきたのか疑問に思う人もいるかも知れません。http://k0s.sh を参照してスクリプトがダウンロードされます。ダウンロードしたスクリプトはそのまま実行することが出来ます。)

コマンド実行後にサーバーを起動しましょう。

sudo k0s server --enable-worker &

これだけです。

次のように実行すると、ログメッセージの表示を省略できます。

sudo k0s server --enable-worker </dev/null &>/dev/null &

一旦サーバだけを起動して、別の場所で worker を起動することもできます。その方法については後で詳しく説明します。

では、新しいクラスタにアクセスしてみましょう。

k0s クラスタへのアクセス

クラスタにアクセスするには、(まだインストールして無ければ) kubectl をインストールして KUBECONFIG 環境変数にファイルを指定するだけです。

sudo cp /var/lib/k0s/pki/admin.conf ~/admin.conf
export KUBECONFIG=~/admin.conf

これでクラスタにアクセスできるようになりました。

namespace を参照してみましょう。

> kubectl get namespaces
NAME              STATUS   AGE
default           Active   5m32s
kube-node-lease   Active   5m34s
kube-public       Active   5m34s
kube-system       Active   5m34s

ノードを探しても master ノードがないことに注意してください。

k0s は素のプロセスとしてコントロールプレーンを実装していることを忘れないでください。

> kubectl get nodes
NAME             STATUS   ROLES    AGE    VERSION
ip-172-31-8-33   Ready    <none>   5m1s   v1.19.3

Lens のような管理ツールを使って他のサーバからクラスタにアクセスしようとするとどうなるのでしょうか?

クラスタの外部からk0sにアクセスする : k0s Kubernetes クラスタのカスタマイズ

外部から k0s クラスタにアクセスする方法を見てみましょう。

必要なKUBECONFIG用のファイルは、先程使用したキーを SCP でローカルマシンにコピーしてください。

scp -i <SERVER_KEY> ec2-user@<SERVER_IP>:~/admin.conf .
export KUBECONFIG=admin.conf

SCP してきた当初は、接続先が localhost となっています。これを、今回利用しているAWSインスタンスのパブリックIPアドレスに変更する必要があります。ローカルマシン上の admin.conf ファイルを編集して、localhost からサーバのパブリックIPアドレスに変更してください。

例えば、今回の場合のサーバのパブリックIPは 52.10.92.152 です。

apiVersion: v1
clusters:
- cluster:
    server: https://52.10.92.152:6443
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lVRzhGakJZVVNZOFBrOWNjcTVhK3lFenNBNXAwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dERVdNQlFHQTFVRUF4TU5hM1ZpWlhKdVpYUmxjeTFqWVRBZUZ3MHlNREV4TWpNd016TXpNREJhR...

接続先を変更後に接続をテストすると、怪しいメッセージが出力されます。

kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"windows/amd64"}
Unable to connect to the server: x509: certificate is valid for 127.0.0.1, 172.31.8.33, 172.31.8.33, 172.31.8.33, 10.96.0.1, not 52.10.92.152

このメッセージは、「接続は出来ておりKubernetesは動作していますが、資格情報が間違っています」という内容となります。

この問題を解決する為には、公開IPアドレスを含むようにk0sを設定する必要があります。

まず、k0s が使用している現状の default-config.yaml をエクスポートします。

sudo k0s default-config > k0s.yaml

次に、エクスポートした k0s.yaml を編集して、パブリックIPを spec.api.sans に追記します。( - 52.10.92.152 の行を追記しています。)

apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
  name: k0s
spec:
  api:
    address: 172.31.8.33
    sans:
    - 172.31.8.33
    - 172.31.8.33
    - 52.10.92.152
    extraArgs: {}
  controllerManager:
    extraArgs: {}
  scheduler:
    extraArgs: {}
  storage:
    type: etcd
    kine: null
    etcd:
      peerAddress: 172.31.8.33
  network:
    podCIDR: 10.244.0.0/16
    serviceCIDR: 10.96.0.0/12
    provider: calico
    calico:
      mode: vxlan
      vxlanPort: 4789
      vxlanVNI: 4096
...

編集がおわったら k0s サーバを再起動してください。現状はバックグラウンドプロセスとして実行されているので、マシンを再起動してから k0s を再起動する方法が最も簡単です。

sudo k0s server --enable-worker &

これですべてが動作します。(KUBECONFIGのファイルは先程のものをそのまま利用します。)

> kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-11-11T20:21:36Z", GoVersion:"go1.15.4", Compiler:"gc", Platform:"linux/amd64"}

また、KUBECONFIGをインポートすれば、Lensでアクセスすることもできます。

Kubernetes クラスタにノードを追加する

worker ノードやコントロールプレーンを追加するだけでクラスタを追加できます。新しく追加するサーバがどのクラスタに接続するのかを知るためのトークンが必要になります。このトークンを生成するに、コントロールプレーンにログインして操作します。

k0s token create --role=worker

見たとおり新しい worker ノード用のトークンを作成しています。

このコマンドの結果として次のような非常に長い文字列が出てきます。

H4sIAAAAAAAC/2yV0Y7iOhKG7/speIGZYycwpxtpLyZgBwIxY8dlJ74LcYZAnBBCGtKs9t1XzcxIu9K5K1f9+n7Lsup/ybujKvvr8dzOJzf8Urj361D21/nLl8nvev4ymUwm17K/lf18Ug1Dd53/9Rf+2/vq46+vX31//m069Z+iouyH489jkQ/ll/x9qM79cfj4YvMhn0+2CRq2CV4IsJE8BkuhIkjARBxREM8ZGhY1jhIQgSBsybXqDKJ+AlFgkFPiUYV5HRmlmNnRoN9pdiqkqja+o2XLApZ+v1skhIZuu8ddlK/MSdZUCLhvuKOBRZYIZRl3dMUlVQLoVMKsirHptKs2VnUZNOOplPSilQgMGD9eOSaImkrdMYvwN5l2TJCoEm1xLw/dnxn935mEqC2JuXClFgbNNK8pU0SkdknNXplZ1mAd0y6TqTBxrXzjWZoDDmJil+DT1cKxKDsxAqAWXFHFgaAEImIRfWoTRG+fbwIgNuJUj4k2Yo/GSwzFQ5Ea21ZV3DdqJ6000rV5YxIFh41Br57Ba79MFTXSabuk5zxUZ5nG9xyGkyDTMVHfe1YrY0IcMXe4JSSiuXIKlhHOkIEyZKBSg8BxnD/Mujyc77BSjx3N+iKluVTnj3gVxBqmvvGpA1dgvXRLvYp7mYohTxnX4YjzU7RV3ut9j88986b3Ag0CMGNlas+2ji6LpvA2XpUomX2opTE2HJZlSo86XE/F8TruqHvfEZpmzYzJZjzHYOKSBlJoK/K22pQy7uNavPNH5vPU1SDXnsDFJoHDNCe4YvUbk+HhpkI+TaRI9aprdaN2GV57WetcDEWfLzOUeW871bzds1MQ5pDdWWqrzUPFWw/PRBtFW4+J/HsHVkbpHhSTsJ7tidMljQabKmN0NLNt8MOc3FWmNMlQtEjUYcz8SNnQcBMKynyC42X0zrVlvKaB8DqR11GwqHHAiA1ipWqxspQf33wAFVjkFrzpAiBRK51ZQ40XXGdTARFwEAHA4SZhfReIjEoLYjBNeR2B1vG0COtNvhIQO3HM0niqaJerlE/L5hWXZNorQne8sX2hqz6HYmYfwecffIiaBhKx4NM/98+ocGvPtsGuOA5Ek1mjDt2Ce+NHhkRrH8zFyjUK22P2MXgQ2ladTMZTty5OgnKotCbDKFJz2hM1JqvgaFD30ErdsjS7m4fd7pYCWczWi5MZEvJm2GIIslZxtjSyeAhPhfHNYuILNDttUYUV5ahsA1FqGPWK+rIRIDxbs1asi1YEpol6CKuLaSgkTbbJfSvLpR2s300zn8LeZzf5cLdd6pgO6WVP7h97sKMljoJUs7zmD4nED+1oLGp6grDok6UxQNmHQviy02tPfe9kTsa7BJtlaTHdNxneK/deoA52cL1tvegae2+UUbvereBum8IT8HaL26CRtUmVDC5GsiYmHS1klTJZjDtpr4vm9RajyN/iIGLp4WFOxlmCRrMUUxsO25KwXqRUJ83IchJhaCqyRdW3QkcO2i4FhO7xyhL14A+r3yIZWpw0fLMPVZVj5f+QaPN7N1NZ8wNHKlHEhQmwQBF47uUtP//rZTJp86acT2p0fSnO7VCOw6+Y+FX/iok/mfFUfTber8/T+7505fBlfz4P16HPu/+nvfd92Q5f/pCezfrY2vlkcW5/Hg8vXV/+LPuyLcrrfPLv/7x8Up/mvyH/gH8aP68wnOuynU9qN15n+Ovl56OyaLj8ffC+9f3x9PLfAAAA////I+m0AwcAAA==

これは何?と思われるかもしれませんが、単純にBASE64エンコードされたKUBECONFIGに過ぎません。

ここでの利点は、worker ノードがネットワーク経由でコントロールプレーンにアクセスできれば、worker ノードがどこにあっても接続できるという事です。

workerを作成しましょう。

まず、(必要に応じて)新しいサーバーを作成し、k0sをインストールします。

sudo curl -sSLf k0s.sh | sudo sh

そして、クラスタに参加させます。

sudo k0s worker "上記の長いトークンの文字列"

実行すると、次のような出力があります。

k0s worker "H4sIAAAAAAAC/2yV0Y7i..."

kubectl でノードをチェックすると、リストの中に今追加した新しいノードが表示されるはずです。

> kubectl get nodes
NAME               STATUS   ROLES    AGE   VERSION
ip-172-31-14-157   Ready    <none>   81s   v1.19.3
ip-172-31-8-33     Ready    <none>   11h   v1.19.3

これで worker ノードは追加できました。

同様にコントロールプレーンを追加することで、クラスタの堅牢性を高めることもできます。

ここでも、トークンを作成することから始めます。(roleが異なっていることに注意しましょう。)

k0s token create --role=controller

そして worker ノードの時と同様に、新しいサーバーに k0s をインストールして、サーバーを起動します。

sudo curl -sSLf k0s.sh | sudo sh
sudo k0s server "長いトークン" &

すると以下の出力があります。

k0s server "長いトークン" &

これで追加できました。

しかし、k0s Kubernetesアーキテクチャの中に master ノードがないため、ノードを確認しても追加されていることはわかりません。

> kubectl get nodes
NAME               STATUS   ROLES    AGE   VERSION
ip-172-31-14-157   Ready    <none>   23m   v1.19.3
ip-172-31-8-33     Ready    <none>   11h   v1.19.3

クラスタから切り離すコマンドは現在作成中ですので注意してください。

2台目のコントローラに何かあった場合クラスタ自体に影響が出てしまいます。ですので、必要が無い場合には追加しないでください。

今後について

k0sは素晴らしいものですが、まだ世に出たばかりです。

作業は非常に速く進行していますが、k0sコミュニティはフィードバックや貢献が必要です。

また、皆さんがk0sを使用するのはどんな場面か、k0sに何を望んでいるかを聞きたいと思っています。

是非コメントで教えてください!

新規CTA