概要
GKE が大好きで非常に満足していたのですが、以下のような願望もありました。- Kubernetes勉強しながら好き勝手出来るスクラッチ用のクラスター環境が欲しい
- Raspberry Piなどエッジで動かすコンテナを、Kubernetesクラスターでコントロールしたい
k3s is 何?
「エッジでも動く!」という噂を聞いて、k3sを使うことに決めました。- 超軽量なKubernetes。
- バイナリが
40 MB
以下
- 小さいことはいいことだ。
- RAMが
512 MB
あれば動く
- ラズパイとかのエッジでも動くよ。凄い!
- バイナリが
引用元: k3s.io
この記事でやること
上図のkemo-cluster
のようなKubernetesクラスターを作ります。- ホスト
kemo-master
で、k3sをServerとして起動 - ホスト
kemo-node01
とkemo-node02
で、k3sをAgentとして起動 - クラスター外のホスト
kemo-client
からクラスターに対して操作を実行する。
- 入門 Kubernetesのサンプルアプリケーションkuardを使って
ReplicaSet
を作成 LoadBalancer
タイプのServiceを起動してブラウザからアクセス
- 入門 Kubernetesのサンプルアプリケーションkuardを使って
使用環境
- Ubuntu Server: 18.04.2 LTS
- k3s: v0.4.0
では始めましょう!ʕ◔ϖ◔ʔ
Server
インストールとサービス起動
k3sをインストールしてServerとして起動します。curl -sfL https://get.k3s.io | sh -上記を実行するだけで、ホスト環境に合わせたバイナリのダウンロードや配置、
systemd
の登録と起動まで自動でやってくれます。公式のREADMEのsystemdに詳しい情報があります。サービスの設定ファイル
/etc/systemd/system/k3s.service
を確認すると、以下のようになっています。kemokemo@kemo-master:~$ cat /etc/systemd/system/k3s.service [Unit] Description=Lightweight Kubernetes Documentation=https://k3s.io After=network.target [Service] Type=notify EnvironmentFile=/etc/systemd/system/k3s.service.env ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/k3s server KillMode=process Delegate=yes LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity TimeoutStartSec=0 [Install] WantedBy=multi-user.target
Tokenの確認
AgentからServerへと接続するために必要となるToken
を確認します。sudo cat /var/lib/rancher/k3s/server/node-token後ほどAgentのインストール時に使いますのでどこかにメモしておきます。
動作確認
動いているか確認しましょう。kubectl get nodes実行結果は以下のようになります。
kemokemo@kemo-master:~$ kubectl get node NAME STATUS ROLES AGE VERSION kemo-master Ready <none> 113s v1.14.1-k3s.4
Agent
インストール
こちらも、READMEのsystemdの内容に沿ってインストールします。curl -sfL https://get.k3s.io | K3S_URL=https://{server_url}:6443 K3S_TOKEN={Token} sh -
{server_url}
: Serverのホスト名を指定します。家庭ネットワークなどDNSが効かない環境ではServerのIPアドレスを指定します。{Token}
: Serverで確認したものを指定します。
サービスの設定ファイル
/etc/systemd/system/k3s-agent.service
は、以下のようになっています。kemokemo@kemo-node01:~$ sudo cat /etc/systemd/system/k3s-agent.service [sudo] password for kemokemo: [Unit] Description=Lightweight Kubernetes Documentation=https://k3s.io After=network.target [Service] Type=exec EnvironmentFile=/etc/systemd/system/k3s-agent.service.env ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/k3s agent KillMode=process Delegate=yes LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity TimeoutStartSec=0 [Install] WantedBy=multi-user.targetインストール時に指定した
K3S_URL
やK3S_TOKEN
などの環境変数は、/etc/systemd/system/k3s-agent.service.env
に保存されてk3s-agent.service
起動時に読み込まれます。メモ
mDNSを使ってkemo-master.local
というホスト名で接続したかったのですが、うまくいきませんでした。仕方ないので、静的IPアドレスを使って接続しています。Ubuntu Server 18.04での静的IPアドレスの指定はこちらを参照。ノードの登録確認
Serverでノードを確認して、以下のように追加されていれば成功です。kemokemo@kemo-master:~$ kubectl get node NAME STATUS ROLES AGE VERSION kemo-master Ready <none> 52m v1.14.1-k3s.4 kemo-node01 Ready <none> 3m4s v1.14.1-k3s.4もうひとつのノード
kemo-node02
も同様にして登録しました。確認結果は以下のようになりました。kemokemo@kemo-master:~$ kubectl get node NAME STATUS ROLES AGE VERSION kemo-master Ready <none> 53m v1.14.1-k3s.4 kemo-node01 Ready <none> 4m5s v1.14.1-k3s.4 kemo-node02 Ready <none> 5s v1.14.1-k3s.4
クラスター外からアクセスする
クラスター外のホスト名kemo-client
から、今回作ったk3sクラスターに対して操作を実行できるようにして、Pod
やService
を起動できるようにセットアップしたいと思います。まずは、公式READMEを確認しましょう。
Copy /etc/rancher/k3s/k3s.yaml on your machine located outside the cluster as ~/.kube/config. Then replace “localhost” with the IP or name of your k3s server. kubectl can now manage your k3s cluster. Accessing cluster from outsideServerの
/etc/rancher/k3s/k3s.yaml
を使えば良いようです。何度か試用する程度なら--kubeconfig=k3s.yaml
を指定する方法が、継続的に使うクラスターであれば~/.kube/config
に設定を追加する方法が良いでしょう。順にみていきましょう。
Configファイルを準備する
まずは、クラスター外からアクセスするための情報を整理しましょう。k3s.yaml
をコピー
Serverの/etc/rancher/k3s/k3s.yaml
を、scp
コマンドなどで手元の環境にコピーします。scp kemokemo@kemo-master.local:/etc/rancher/k3s/k3s.yaml ~/k3s.yaml
設定内容を編集
k3s.yaml
のserver
のURLを、環境に合わせて編集します。apiVersion: v1 clusters: - cluster: certificate-authority-data: {cert_data} server: https://{server_url}:6443 name: {your_cluster_name} contexts: - context: cluster: {cluster_name} user: {user_name} name: {context_name} current-context: {context_name} kind: Config preferences: {} users: - name: {user_name} user: password: {password} username: admin
name | default value | description |
---|---|---|
{cert_data} | - | 構築したクラスターごとに異なる値が入っています。そのまま使います。 |
{server_url} | localhost | Serverのホスト名、DNSが効かない環境ではServerのIPアドレスを指定します。 |
{cluster_name} | default | クラスター名を決めて適宜変更します。 |
{user_name} | default | クラスターが区別できるようなユーザー名を決めて、適宜変更します。 |
{context_name} | default | クラスターが区別できるようなContext名を決めて、適宜変更します。 |
{password} | - | 構築したクラスターごとに異なる値が入っています。そのまま使います。 |
動作確認
上記で編集したk3s.yaml
を使って接続できるか確認してみましょう。kubectl --kubeconfig=k3s.yaml get nodeうまくいくと以下のようになります。
kemokemo@kemo-client:~ ʕ◔ϖ◔ʔ > kubectl --kubeconfig=k3s.yaml get node NAME STATUS ROLES AGE VERSION kemo-master Ready <none> 7m v1.14.1-k3s.4 kemo-node01 Ready <none> 4m v1.14.1-k3s.4 kemo-node02 Ready <none> 3m v1.14.1-k3s.4
さぁ、みんなで使えるようにしましょう
--kubeconfig
を指定する方法
上記の動作確認でも実施したように、以下の方法が手軽に試してもらうのに有効です。- チームメンバーに
k3s.yaml
を配る --kubeconfig=k3s.yaml
を指定して使ってもらう
~/.kube/config
にContextを追加する方法
GKEなど他にも操作対象のクラスターがある場合は、use-context
でクラスターを切り替えて使えるようにするのが良さそうです。Kubernetes公式の Configure Access to Multiple Clusters を参考にしながら設定しましょう。まずはクラスター情報を設定します。
kubectl config set-cluster {cluster_name} --server=https://{server_url}:6443
certificate-authority-data
を設定します。(こちら参照。)kubectl config set clusters.{cluster_name}.certificate-authority-data {cert_data}ユーザー名やパスワードを設定します。
kubectl config set-credentials {user_name} --username=admin --password={password}最後にContextを設定します。
kubectl config set-context {context_name} --cluster={cluster_name} --namespace=default --user={user_name}ここまで実行できたら、使うContextを切り替えましょう。
kubectl config use-context {context_name}
ReplicaSetを作成してみる
次は、Podを起動してみましょう。オライリー本の「入門 Kubernetes」に連動したリポジトリdoublemarket/kuar-examples-1-9の宣言ファイルを使います。これは、原著から使用されているkuardというサービスをPodとして起動します。
まずはダウンロードします。
wget https://github.com/doublemarket/kuar-examples-1-9/raw/master/8-1-kuard-rs.yaml mv 8-1-kuard-rs.yaml kuard-rs.yaml上述の方法で
Context
を追加して切り替え済みの状態で以下を実行します。kubectl apply -f kuard-rs.yaml確認してみましょう。
kemokemo@kemo-client:~ ʕ◔ϖ◔ʔ > kubectl get pods NAME READY STATUS RESTARTS AGE kuard-mg85p 1/1 Running 0 4m10s1つのPodが起動しましたね。では
kuard-rs.yaml
をエディタで開いて、replicas
を1から3に変更して保存し、再度適用してみましょう。kemokemo@kemo-client:~ ʕ◔ϖ◔ʔ > kubectl get pods NAME READY STATUS RESTARTS AGE kuard-5wpmh 1/1 Running 0 3s kuard-8cqxn 1/1 Running 0 3s kuard-mg85p 1/1 Running 0 10mうん、3つに増えましたね!
メモ
kubectl apply
が以下のようなエラーで失敗する場合、クラスター側と手元のkubectlのバージョンが違っている可能性が高いです。kubectl version
で確認しましょう。error: SchemaError(io.k8s.api.core.v1.CinderVolumeSource): invalid object doesn't have additional properties
LoadBalancerを起動してブラウザからアクセス可能にする
では最後に、LoadBalancer
を起動してPod名kuard
内のコンテナで動作しているWebサービスに、クラスター外からアクセスできるようにしてみましょう。apiVersion: v1 kind: Service metadata: name: my-loadbalancer spec: selector: app: kuard ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer上記の内容を
load-balancer.yaml
に保存して適用してみましょう。kubectl apply -f load-balancer.yaml確認してみましょう。
kemokemo@kemo-client:~ ʕ◔ϖ◔ʔ > kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 4d12h my-loadbalancer LoadBalancer 10.43.151.181 192.168.3.25 80:31411/TCP 3s
EXTERNAL-IP
をブラウザで開いてみましょう。無事にアクセスできました!
まとめ
k3sを使って、オンプレミスなKubernetesクラスターを作ってみました。クラスター構築自体は簡単で説明も少なくて済んだので、本記事では「クラスター外からのアクセス」に重点をおいて解説する内容にしました(`・ω・´)ゞ今回作ったKubernetesクラスターを「気軽に使えるスクラッチ環境」として活用したいと思います!ʕ◔ϖ◔ʔ