[Kubernetes][Linux] 再びKubernetesに手を出した

オンプレミス

今度は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しか動かしてないんですが、もう少しアプリケーションコンテナを動かそうかねーなどと考えています。

タイトルとURLをコピーしました