CivoCloud k3sから考える個人開発者向けKubernetes

10 min読了の目安(約9400字TECH技術記事

※本記事はブログからの移行記事のため、一部内容が古くなっている場合があります(また時間があるときに改稿するかもしれません)


今回はCivo社が開発しているマネージドk3sに触れていきます。

背景

勉強がてら個人開発サービスでKubernetesを使いたい!と思った時に、まずネックとなるのは価格面です。
マネージドKubernetesで最も有名なGKEの場合を考えてみます。

https://cloud.google.com/compute/all-pricing

n1-standard-1(vCPU1、メモリ3.75GBの最低インスタンス)でも、
1台あたり月額24ドル、度々自動停止されるプリエンプティブルインスタンスに変更したとしても月額7.3ドルのコストがかかってきます。

そうなってくると、「やはりマネージドは高いからEC2やVPSに入れてみようか」という発想になってきます。
しかしながら、Kubernetesの性能要件は低くなく、ノードごとに

  • 2コア以上のCPU
  • 2GB以上のメモリ[1]

が要求されるため、この要求を満たすVPSを二台借りると、おおよそ月額2〜3000円(場合によって初期費用もプラス)以上のコストがかかります。

そこで、一旦Kubernetesは諦めて軽量版のk3sを検証してみることにしました。
しかしこちらもあまり上手くはいかず、VPSの典型的な月額1000円インスタンスでは、k3s自体のオーバーヘッドに耐えるだけで精一杯という使用感でした。

やはり、現状個人開発環境としてKubernetesを採用するのは厳しいかと考えていた時、
海外のクラウドプロバイダーであるCivo社の#kube100プロジェクトを目にしました。

#kube100とは

Civo社が開発している世界初のマネージドk3sのβテストプロジェクトです。

https://www.civo.com/kube100

開発中のCivo k3sの特筆すべきはその価格で、1ノード当たり最低月額5ドルから利用できます。

GKEと違い、Masterノードに対しても課金される点は抑えておく必要がありますが、
ノード単価がGKEの1/4〜1/5程度で済むので、それでも十分安いと言えます。

この#kube100に参加すると、以下の恩恵を受けることができます。

  • 月額70ドル相当のFree Credit
  • 新機能への早期アクセス
  • 公式のSlackに招待

次に、実際にハンズオンしていきます。

ハンズオン

環境

  • MacOS: Catalina
  • kubectl: v1.17.2
  • Civo CLI(この後の事前準備でインストールするもの): v0.5.9

事前準備

  • Civo CLIのインストール

awscliやgcloudのように、civoにもCLIツールが存在するので、事前に公式ドキュメントを参考にして
インストールします。

https://www.civo.com/learn/kubernetes-cluster-administration-using-civo-cli

管理画面から触る

構築

  • 公式からJoin

メールアドレスや氏名などの情報と、いくつかの質問に答えると申請完了です。

https://www.civo.com/kube100

Civo社側で申請が許可されると、ダッシュボードにログインできるようになります。

  • ログイン確認

ダッシュボードにログインして、以下のような画面が表示されればOKです。

  • クラスター構築

サイドバーの[Kubernetes]->[Create cluster]に進み、
インスタンスタイプ・ノード数などの情報を入力していきます。

ちなみに、このタイミングでLonghornやPrometheus Operatorなどのエコシステムを選択するだけで、
チェックされたツールが入った状態でクラスター構築が可能です。
デフォルトではTraefik Ingress Controller、Metrics Serverにチェックが入っていますので、
今回はそのまま2つとも導入します。

  • クラスター構築を待つ

おおよそ2〜3分程度で完了するので、待ちます。

  • kubeconfigをダウンロード

Click to Downloadを選択すると、ダウンロード可能です。

  • クラスター確認

先ほどダウンロードしたkubeconfigを環境変数にセットし、ノードがReadyしていることを確認します。
今回ノード数は1台だけに指定したので、masterだけがReadyしています。

$ export KUBECONFIG=xxxxx(kubeconfigのパス)
$ kubectl get no
NAME               STATUS   ROLES    AGE    VERSION
kube-master-0a73   Ready    master   141m   v1.16.3-k3s.2

動作確認する

Civo公式によると、k3sのMaster NodeだけにPublic IPを持たせており、そこをトラフィックのエンドポイントとする設計のようです。

Do all nodes have public IP addresses?
Only the master node has a public IP address. It receives traffic to your cluster, and routes it to your worker nodes in the form of a load balancer, as well as processing tasks itself.

https://www.civo.com/learn/kubernetes-faq

Masterへの通信はデフォルトの設定だとほぼ全許可されている[2]ので、

  • NodePort Service
  • Traefik Ingress

の2つでNginxをテスト公開し、疎通確認してみます。

  • NginxのDeployment,NodePort Serviceを作成する
# Deployment
$ kubectl create deploy nginx --image=nginx
deployment.apps/nginx created

# Service
$ kubectl expose deploy nginx --type=NodePort --port 80
service/nginx exposed
  • NodePortにアクセス

ワンライナーで確認します。

$ curl `kubectl get $(kubectl get no -l node-role.kubernetes.io/master=true -o name) -o=jsonpath='{.status.addresses[?(@.type=="ExternalIP")].address}'`:`kubectl get svc nginx -o=jsonpath={.spec.ports[*].nodePort}` -sI | grep -E 'nginx|200'
HTTP/1.1 200 OK
Server: nginx/1.17.10

200が返ったのでOKです。

  • DNSエンドポイントを確認する

Serviceまでの疎通は確認できたので、Ingressを設定するためのDNSエンドポイントをCivo CLIで確認します。

$ civo kubernetes show xxx(クラスター名) | grep 'DNS'

後の設定で利用するため、上記の出力結果を控えておきましょう。

CIvoとTraefik Ingressで公開する方法は、以下の記事が非常に参考になりました。

https://sysadmins.co.za/use-traefik-as-a-kubernetes-ingress-controller-for-your-app-on-civo/
  • Ingressを設定する
$ cat << EOF |kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
  namespace: default
  annotations:
    kubernetes.io/ingress.class: traefik
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: xxxxx.k8s.civo.com # 先ほど確認したエンドポイント
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
EOF
ingress.extensions/nginx configured
  • Ingressの疎通確認

控えておいたドメインにアクセスして確認します。

$ curl xxxxx.k8s.civo.com -sI | grep -E 'nginx|200'
HTTP/1.1 200 OK
Server: nginx/1.17.10

Ingress経由でも無事アクセス確認が取れました。

CLIから触ってみる

ここまでは管理画面経由でクラスター構築を行ってきましたが、
CLI経由でもクラスター管理が可能です。

クラスター一覧を取得する

civo kubernetes list で取得可能です。

$ civo kubernetes list
nil versions are discouraged and will be deprecated in Rubygems 4
+--------------------------------------+---------+---------+-----------+---------+--------+
| ID                                   | Name    | # Nodes | Size      | Version | Status |
+--------------------------------------+---------+---------+-----------+---------+--------+
| xxxxx| sandbox | 1       | g2.xsmall | 1.0.0   | ACTIVE |
+--------------------------------------+---------+---------+-----------+---------+--------+

list以外のサブコマンドにも共通していますが、aliasが貼られているため、
civo k8s listcivo k3s list と入力することも可能です。

クラスターを構築する

civo kubernetes create でCLIから構築が可能です。

$ civo kubernetes create sandbox2 --size=g2.xsmall --nodes=1 --save --switch --wait
Building new Kubernetes cluster sandbox2: Done
Created Kubernetes cluster sandbox2 in 02 min 25 sec
Merged config into ~/.kube/config and switched context to sandbox2

覚えておいた方が良さそうなオプションは以下の通りです。

オプション 内容
--size インスタンスタイプ。インスタンスタイプが分からない場合は、civo size list で確認可能
--nodes ノード数。指定しなかった場合、デフォルト3なので注意
--save 構築するクラスターのkubeconfigを~/.kube/configに保存
--wait クラスター構築の進捗を表示
--switch クラスター構築が完了した後、そのままContextを新クラスターに切り替え。--saveと--waitが必要

マーケットプレイスからアプリケーションを導入する

Civoでは、k3s上に簡単にエコシステムをインストールできるように、
マーケットプレイスが用意されています。

https://github.com/civo/kubernetes-marketplace

Civoがサポートしているものであれば、civo applications add で非常に簡単にインストールすることが可能です。

$ civo applications add Longhorn --cluster=sandbox2
Added Longhorn 0.7.0 to Kubernetes cluster sandbox2

2020年5月現在では、以下のアプリケーション[3]をサポートしています。

$ civo applications list
+----------------------+-------------+--------------+-----------------+--------------+
| Name                 | Version     | Category     | Plans           | Dependencies |
+----------------------+-------------+--------------+-----------------+--------------+
| cert-manager         | v0.11.0     | architecture | Not applicable  | Helm         |
| Helm                 | 2.14.3      | management   | Not applicable  |              |
| Jenkins              | 2.190.1     | ci_cd        | 5GB, 10GB, 20GB | Longhorn     |
| KubeDB               | v0.12.0     | database     | Not applicable  | Longhorn     |
| Kubeless             | 1.0.5       | architecture | Not applicable  |              |
| kubernetes-dashboard | v2.0.0-rc7  | management   | Not applicable  |              |
| Linkerd              | 2.5.0       | architecture | Not applicable  |              |
| Longhorn             | 0.7.0       | storage      | Not applicable  |              |
| Maesh                | Latest      | architecture | Not applicable  | Helm         |
| MariaDB              | 10.4.7      | database     | 5GB, 10GB, 20GB | Longhorn     |
| metrics-server       | (default)   | architecture | Not applicable  |              |
| MinIO                | 2019-08-29  | storage      | 5GB, 10GB, 20GB | Longhorn     |
| MongoDB              | 4.2.0       | database     | 5GB, 10GB, 20GB | Longhorn     |
| OpenFaaS             | 0.18.0      | architecture | Not applicable  | Helm         |
| Portainer            | beta        | management   | Not applicable  |              |
| PostgreSQL           | 11.5        | database     | 5GB, 10GB, 20GB | Longhorn     |
| prometheus-operator  | 0.35.0      | monitoring   | Not applicable  |              |
| Rancher              | v2.3.0      | management   | Not applicable  |              |
| Redis                | 3.2         | database     | Not applicable  |              |
| Selenium             | 3.141.59-r1 | ci_cd        | Not applicable  |              |
| Traefik              | (default)   | architecture | Not applicable  |              |
+----------------------+-------------+--------------+-----------------+--------------+

クラスターを削除する

civo kubernetes removeで可能です。

$ civo kubernetes remove sandbox2
Removing Kubernetes cluster sandbox2

ハマりポイント

まだ原因が明確に掴めていませんが、civo kubernetes config xxx --save した際に、
既存の~/.kube/configに何らかの問題があってerrorになった場合、
あろうことかmergeのタイミングで ~/.kube/configの中身が空になりました

$ civo kubernetes config sandbox --save
KUBECONFIG=~xxxx
error: open (省略)/admin.pem: no such file or directory
Merged config into ~/.kube/config

# 中身が空になっている/^o^\
$ cat /Users/xxxxx/.kube/config
$

消えてしまうと復旧が結構大変なこともあるので、打つ時は必ずkubeconfigをバックアップしておいた方が良さそうです。

まとめ

とにかく安いので、正式にローンチすれば、個人開発向けの環境としては十分選択肢に入ってきそうな感触でした。
まだβテスト中ということもあり、作りが荒い部分も見受けられますが、
大方の動作は良好ですので、気になった方は触ってみてください。
Joinされる方は、フィードバックなどを通して共にコントリビュートしていきましょう。

脚注
  1. 2GBちょうどだと、追加でコンテナを動作させることができないレベルでメモリが枯渇するので、実質3〜4GB以上が最低ラインです ↩︎

  2. 今回は詳しく触れませんが、意図しないアクセスを防ぐため、不要なポートは閉じておきましょう ↩︎

  3. Helmなどはバージョンが古いこともあるので、その点は抑えておきましょう ↩︎