Contents
今度はk3sでございます。
以前、kubeadmを使用してKubernetesを作っておりましたが、いろいろありまして結局のところスタンドアロン構成に戻してみたりした時期がありました。が、リソース集約を考えたときにやっぱりKubernetesが便利だったなーというのと、YAML記法を忘れそうでちょいと自分に心配だったのがありまして、小さなクラスタを再度構成することにしました。
当時のKubernetesも好きだったんですが、何しろ重い。Kubernetes自体の負荷がかなりでかいのです。オートヒーリングなんかは目も当てられないぐらいに処理が重く、それ故にまともに機能しないことが多かったりで。そこで見つけたのがk3sでございます
とにかく軽い
k3sのURLは以下の通りです。
さてこのk3s、Lightweight Kubernetesって書かれてるように、システム要件が非常にリーズナブルで、Kubernetesそれ自身の負荷がだいぶ低いです。加えて、シングルバイナリーで構成されていることもあって、プロセスが散らばってないのがうれしいポイントです。
まずOSを好みに従いインストールし、パッケージをアップデートした後で上記リンクにあるワンライナーのシェルコマンドを打ち込めばMaster/Worker共にインストール&セットアップまで一通り完了してしまいます。
- CNIにはFlannelが使用されているようです。よって、コンテナネットワークは1セグメントの巨大なL2ネットワークで構成される
- コンテナを動かすソフトウェアはContanerdを使用するようです。Dockerとどのあたりが違うのか・・・とか、その辺りは私自身よくわかってません・・
- 私が導入したk3sはKubernetes v1.16ベースのものだったようです。知らぬうちにいろいろ機能やYAMLで宣言するAPIなどが変わっていてかなーり振り回されました。
# kubectl get nodes NAME STATUS ROLES AGE VERSION blackbeans.bluecore.net Ready master 6d3h v1.16.2-k3s.1 favabeans.bluecore.net Ready <none> 6d2h v1.16.2-k3s.1 soy.bluecore.net Ready <none> 6d2h v1.16.2-k3s.1
上記のように、今回は3台のノードを構成し、1Master/2Worker構成にしました。
Metrics-Server導入でハマる・・
Kubernetesの負荷を確認する際、以前はKube dashboardを使ったり、prometheusを使ったりしてたのですが、コマンドでさっと見れなかったものかなぁ?と情報を探してたらこんなコマンドがあるそうで。
- kubectl top node
- kubectl top pods
さっそく実行してみようじゃないか!と思って実行したらエラーが返ってくるでやんの。
さらに調べてみると「metrics-server」なるものが必要そう。
なるほど、これ入れるのか、じゃぁいけそうだ!と思って取り組み、それが完了したのは開始してから5時間後のことでした・・・・Orz
Gitで拾う
まずはお約束というか、Gitを使って一通りの構成情報を拾います。
git clone https://github.com/kubernetes-incubator/metrics-server
構成ファイルの修正
続いて、以下のファイルを変更します。(コンフィグは長時間格闘の末にたどり着いたものになります・・)
metrics-server/deploy/1.8+/metrics-server-deployment.yaml
--- apiVersion: v1 kind: ServiceAccount metadata: name: metrics-server namespace: kube-system --- apiVersion: apps/v1 kind: Deployment metadata: name: metrics-server namespace: kube-system labels: k8s-app: metrics-server spec: selector: matchLabels: k8s-app: metrics-server template: metadata: name: metrics-server labels: k8s-app: metrics-server spec: serviceAccountName: metrics-server volumes: # mount in tmp so we can safely use from-scratch images and/or read-only containers - name: tmp-dir emptyDir: {} containers: - name: metrics-server image: gcr.io/google-containers/metrics-server:v0.3.3 command: - /metrics-server - --metric-resolution=30s - --requestheader-allowed-names=aggregator - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP args: - --cert-dir=/tmp - --secure-port=4443 resources: {} ports: - name: main-port containerPort: 4443 protocol: TCP securityContext: readOnlyRootFilesystem: true runAsNonRoot: false imagePullPolicy: Always volumeMounts: - name: tmp-dir mountPath: /tmp hostNetwork: true dnsPolicy: ClusterFirst
上記、強調させてみるとそれほど修正箇所は多くないんですが、本当に試行錯誤の連続でした。特にきつかったのは「runAsNonRoot」と「hostNetwork」の二点でした。後日こうした設定内容については詳細が書けたらなと思っています。
デプロイメント開始
修正が終わったら以下コマンドで必要リソースが構成され、コンテナが動き出します。
# kubectl apply -f metrics-server/deploy/1.8+/
これでmetrics-serverコンテナが構成され、起動するようになります。
# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% blackbeans.bluecore.net 114m 1% 1239Mi 15% favabeans.bluecore.net 214m 3% 3346Mi 57% soy.bluecore.net 36m 0% 806Mi 13% # kubectl top pods --all-namespaces NAMESPACE NAME CPU(cores) MEMORY(bytes) default database-sv-68d58cb44b-ptq4h 4m 2897Mi default redis-sv-6654666886-hhtjg 3m 10Mi kube-system coredns-57d8bbb86-gdt7n 4m 14Mi kube-system local-path-provisioner-58fb86bdfd-tllgq 44m 13Mi kube-system metrics-server-897767cd9-vtr59 1m 15Mi kube-system svclb-traefik-7s595 0m 3Mi kube-system svclb-traefik-dv872 0m 2Mi kube-system svclb-traefik-qnrr6 0m 2Mi kube-system traefik-65bccdc4bd-nglz9 6m 25Mi
misskey用に動かしているDBサーバのメモリ使用量が半端ないですが、比較的リソースには余裕をもって動かせているようです。現状RedisとPostgreSQLしか動かしてないんですが、もう少しアプリケーションコンテナを動かそうかねーなどと考えています。