コンテンツへスキップ

k0sにおけるKnative Serving

公開日: 2023-03-28,   更新日: 2024-01-17

k0sにおけるKnative Serving

著者: Naveenraj Muthuraj、アルバータ大学の大学院生

この作業は、最小限のリソースでk0sにknative servingをデプロイする試みです。1つのCPUと1GBのRAMを試してみましょう。

このドキュメントは3つのセクションで構成されています。最初のセクションでは、knative servingとk0sに必要なリソースをキャプチャします。2番目のセクションでは、Knativeとk0sが実際に使用しているリソースを監視して、k0s(エッジ)ノードのサイズを決定します。最後に、1つのCPUと1.5GBのRAMを持つk0sノードに、リソース要求/制限を減らしたknative servingをインストールします(なぜ1.5GB?、Knative + k0sのリソース使用量を参照)。

k0sにknative servingをインストールするだけの場合は、k0sにおけるKnativeインストールセクションに直接スキップできます。

リソース要件分析

このセクションでは、knative-servingとk0sに必要なデフォルトのインストールリソース要件を決定します。

Knative Servingのデフォルトリソース要件

knative-serving

 kubectl get pods  -n knative-serving -o custom-columns="NAME:metadata.name,CPU-REQUEST:spec.containers[*].resources.requests.cpu,CPU-LIMIT:spec.containers[*].resources.limits.cpu,MEM-REQUEST:spec.containers[*].resources.requests.memory,MEM_LIMIT:spec.containers[*].resources.limits.memory"

NAME                                      CPU-REQUEST   CPU-LIMIT   MEM-REQUEST   MEM_LIMIT
activator-7499d967fc-2npcf                300m          1           60Mi          600Mi
autoscaler-568989dd8c-qzrhc               100m          1           100Mi         1000Mi
autoscaler-hpa-854dcfbd44-8vcj8           30m           300m        40Mi          400Mi
controller-76c798ffcb-k96sz               100m          1           100Mi         1000Mi
default-domain-nwbhr                      100m          1           100Mi         1000Mi
domain-mapping-7748ff49d4-29mg4           30m           300m        40Mi          400Mi
domainmapping-webhook-755d864f5c-dsc7j    100m          500m        100Mi         500Mi
net-kourier-controller-79c998474f-svzcm   <none>        <none>      <none>        <none>
webhook-8466d59795-d8zd8                  100m          500m        100Mi         500Mi

kourier-system

kubectl get pods  -n kourier-system -o custom-columns="NAME:metadata.name,CPU-REQUEST:spec.containers[*].resources.requests.cpu,CPU-LIMIT:spec.containers[*].resources.limits.cpu,MEM-REQUEST:spec.containers[*].resources.requests.memory,MEM_LIMIT:spec.containers[*].resources.limits.memory"
NAME                                      CPU-REQUEST   CPU-LIMIT   MEM-REQUEST   MEM_LIMIT
3scale-kourier-gateway-5f9f97b454-rqkgh   <none>        <none>      <none>        <none>

合計

コンポーネント CPUリクエスト CPU制限 メモリリクエスト メモリ制限
アクティベーター 300m 1 60Mi 600Mi
オートスケーラー 100m 1 100Mi 1000Mi
autoscaler-hpa 30m 300m 40Mi 400Mi
コントローラー 100m 1 100Mi 1000Mi
default-domain* 100m 1 100Mi 1000Mi
ドメインマッピング 30m 300m 40Mi 400Mi
domainmapping-webhook 100m 500m 100Mi 500Mi
net-kourier-controller <なし> <なし> <なし> <なし>
webhook 100m 500m 100Mi 500Mi
合計 860m 5600m 640Mi 5400Mi

* default-domainはジョブであり、ジョブが完了するとリソースは解放されます。

k0sのデフォルトリソース要件

デフォルトのk0sインストールで使用されるリソース

メモリ使用量

vagrant@vagrant:~$ free -m
               total        used        free      shared  buff/cache   available
Mem:             971         558          61           0         351         268
Swap:           1941         208        1733

k0sで使用されるメモリ - 558m

CPU使用量

top - 01:55:58 up  2:27,  1 user,  load average: 0.70, 0.42, 0.43
Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.8 us,  0.7 sy,  0.0 ni, 97.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    971.2 total,     60.9 free,    547.8 used,    362.5 buff/cache
MiB Swap:   1942.0 total,   1734.9 free,    207.1 used.    280.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                               
   1222 kube-ap+  20   0 1203728 261064  30408 S   1.7  26.2   4:12.43 kube-apiserver                                                                        
   1213 kube-ap+  20   0  740108  29256   6032 S   1.0   2.9   2:13.01 kine                                                                                  
   1376 kube-ap+  20   0  776892  54388  20112 S   1.0   5.5   1:52.61 kube-controller                                                                       
    602 root      20   0  806420  44088  20408 S   0.7   4.4   0:53.60 k0s                                                                                   
   1283 root      20   0  779664  48132  19672 S   0.7   4.8   2:24.79 kubelet                                                                               
      5 root      20   0       0      0      0 I   0.3   0.0   0:00.29 kworker/0:0-events                                                                    
    347 root      19  -1   56140  14772  14244 S   0.3   1.5   0:04.18 systemd-journal                                                                       
   1282 root      20   0  757300  24652   7024 S   0.3   2.5   0:44.78 containerd                                                                            
   1372 kube-sc+  20   0  765012  24264  13596 S   0.3   2.4   0:16.83 kube-scheduler                                                                        
   1650 root      20   0  757488  14860   8068 S   0.3   1.5   0:03.90 kube-p

k0sで使用される3%〜30m?

BaseOSで使用されるリソース

メモリ

vagrant@vagrant:~$ free -m
               total        used        free      shared  buff/cache   available
Mem:             971         170         502           0         297         668
Swap:           1941           0        1941
BaseOSで使用されるメモリ170

CPU

top - 02:02:20 up 2 min,  1 user,  load average: 0.04, 0.06, 0.02
Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    971.2 total,    502.7 free,    170.8 used,    297.8 buff/cache
MiB Swap:   1942.0 total,   1942.0 free,      0.0 used.    670.7 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                               
    606 root      20   0  727828  49984  20012 S   1.3   5.0   0:02.68 snapd 
アイドル状態のBaseOSで使用されるCPU 0.7%

得られた結果は、ニールによる実験と比較可能です[1]

Knative + k0sのデフォルトリソース要件

概算によるVMに必要な最小リソース

リソース CPU メモリ
k0s 30m 558 + 208(スワップ)
knative-serving 860m 640Mi
合計 890m 1406Mi

リソース使用量分析

Knativeのリソース監視

次に、2つのCPUと2GBのメモリを持つVMを作成してknative servingを動作させ、各コンポーネントのメトリクスをキャプチャできるようにします。リソースが完全に利用されていない場合は、各Knativeコンポーネントの最小要件を減らすことができます。

Vagrantではデフォルトで1 CPU VMになるため、1.5 CPUでVMを作成します!

# knative core components
vagrant@vagrant:~$ sudo k0s kubectl get pods -n knative-serving
NAME                                      READY   STATUS    RESTARTS   AGE
autoscaler-86796dfc97-2q6b2               1/1     Running   0          19m
controller-7cd4659488-sqz5q               1/1     Running   0          19m
activator-6f78547bf7-xp5jh                1/1     Running   0          19m
domain-mapping-856cc965f5-jv4g9           1/1     Running   0          19m
domainmapping-webhook-6dc8d86dbf-mg8j8    1/1     Running   0          19m
webhook-d9c8c747d-fwhst                   1/1     Running   0          19m
net-kourier-controller-54999fc897-st6tn   1/1     Running   0          12m
default-domain-qpvfp                      1/1     Running   0          9m48s

# kourier
vagrant@vagrant:~$ sudo k0s kubectl get pods -n kourier-system
NAME                                     READY   STATUS    RESTARTS   AGE
3scale-kourier-gateway-9b477c667-2hdt2   1/1     Running   0          15m

# 1 knative service
vagrant@vagrant:~$ sudo k0s kubectl get ksvc 
NAME    URL                                      LATESTCREATED   LATESTREADY   READY   REASON
hello   http://hello.default.svc.cluster.local   hello-00001     hello-00001   True  

vagrant@vagrant:~$ sudo k0s kubectl get pods 
NAME                                      READY   STATUS    RESTARTS   AGE
hello-00001-deployment-66ddff5b59-jbn6x   2/2     Running   0          84s

1つのKnativeサービスがアイドル状態の場合の、完全にインストールされたKnative servingのリソース分析

vagrant@vagrant:~$ sudo k0s kubectl top node
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
vagrant   166m         8%     1341Mi          71%   
vagrant@vagrant:~$ sudo k0s kubectl top pod --all-namespaces
NAMESPACE         NAME                                      CPU(cores)   MEMORY(bytes)   
default           hello-00001-deployment-66ddff5b59-jbn6x   1m           8Mi             
knative-serving   activator-6f78547bf7-xp5jh                2m           21Mi            
knative-serving   autoscaler-86796dfc97-2q6b2               5m           19Mi            
knative-serving   controller-7cd4659488-sqz5q               5m           27Mi            
knative-serving   default-domain-6mknr                      1m           7Mi             
knative-serving   domain-mapping-856cc965f5-jv4g9           2m           13Mi            
knative-serving   domainmapping-webhook-6dc8d86dbf-mg8j8    7m           15Mi            
knative-serving   net-kourier-controller-54999fc897-st6tn   6m           37Mi            
knative-serving   webhook-d9c8c747d-fwhst                   9m           16Mi            
kourier-system    3scale-kourier-gateway-9b477c667-2hdt2    4m           17Mi            
kube-system       coredns-7bf57bcbd8-b22j4                  3m           16Mi            
kube-system       kube-proxy-pm4ht                          1m           13Mi            
kube-system       kube-router-vdqtv                         1m           19Mi            
kube-system       metrics-server-7446cc488c-zxdxg           5m           18Mi      

Knative + k0sのリソース使用量

概算によるVMで使用される最小リソース

リソース CPU メモリ
k0s + knative-serving < 160m < 1406Mi

この初期結果から、CPU数を減らすことができるかもしれませんが、約1.4GBのメモリ使用量は、メモリを減らす余地がほとんどないことを意味します。

次に、リソース要求と制限を50%削減してみて、問題が発生するかどうかを確認してみましょう。

k0sにおけるKnative

エッジのようなノードの作成

これを行うには、1つのCPUと1.5GBのメモリを備えたvagrant VMを使用します。

Vagrantfile

Vagrant.configure("2") do |config|
    config.vm.define "k0s"
    config.vm.box = "bento/ubuntu-22.04"
    config.vm.provider "virtualbox" do |v|
      v.memory = 1500
      v.cpus = 1
      v.name = "k0s"
    end
end

vagrant up
vagrant ssh k0s

k0sのインストール

# Download k0s
curl -sSLf https://get.k0s.sh | sudo sh
# Install k0s as a service
sudo k0s install controller --single
# Start k0s as a service
sudo k0s start
# Check service, logs and k0s status
sudo k0s status
# Access your cluster using kubectl
sudo k0s kubectl get nodes
vagrant@vagrant:~$ sudo k0s kubectl get nodes
E0318 07:24:18.366073    2692 memcache.go:255] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
E0318 07:24:18.381532    2692 memcache.go:106] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
E0318 07:24:18.387961    2692 memcache.go:106] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
E0318 07:24:18.391539    2692 memcache.go:106] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
NAME      STATUS   ROLES           AGE   VERSION
vagrant   Ready    control-plane   61s   v1.26.2+k0s

1つのCPUと1.5GBのRAMでk0sを実行することの効果がすでにわかります。

追加インストールなしのk0sメトリクス

vagrant@vagrant:~$ sudo k0s kubectl top node
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
vagrant   39m          3%     959Mi           71% 

ロードバランシングのためのMetallbのインストール

ベアメタルにはMetallbネイティブインストールを使用します

sudo k0s kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml

ロードバランサーサービスのIPアドレスを設定します

ロードバランサーサービスに割り当てるIPを定義します。
ip_pool.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.10.0/24

サービスIPをアナウンスします(レイヤー2構成)
l2_ad.yaml

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

MatalLBリソースの作成

sudo k0s kubectl apply -f ip_pool.yaml
sudo k0s kubectl apply -f l2_ad.yaml

カスタムKnativeデプロイメントファイルの作成

リソースを元の値の50%に減らすことで、すべてのknative servingコンポーネントのデプロイメントファイルを編集します。例:CPUリクエスト/制限の元の値が100mの場合、それを50mに減らし、メモリについても同様に行います。

50%の削減はランダムに見えるかもしれませんが、デフォルトファイルをインストールしようとしたときに、CPUが不足しているために一部のポッドが起動しませんでした。890ミリコアの最小リクエスト(Knative + k0sのデフォルトリソース要件を参照)は、一部のポッドが十分なCPUを見つけられなかった理由を説明しています。これは、BaseOS + k0sが110mを超えるCPU(1000-890)を使用している可能性があるためです。

したがって、リソース使用量(Knative + k0s リソース使用量を参照)を監視した結果、すべてを1 CPUに収めることを目標に、リソース要求/制限を50%削減することが安全な選択肢でした。

次のステップのために、リソースを削減した状態で作成したデプロイメントファイルを使用できます。

カスタムKnativeデプロイメントファイルのインストール

# crd.yaml
sudo ks0s kubectl apply -f https://gist.githubusercontent.com/naveenrajm7/865756eaf07631c82dcd42278d02d105/raw/f94b4be95a40b5210ed6647c692235d60cebd83d/serving-crds.yaml
# core
sudo k0s kubectl apply -f https://gist.githubusercontent.com/naveenrajm7/6e67e288a3b29b5e7c8b3969d76dca27/raw/0269701bf5331e2b037ec582bfe09c8818cd8e27/serving-core.yaml
# networking 
sudo k0s kubectl apply -f https://gist.githubusercontent.com/naveenrajm7/227c4c80a445a373a825f488605d9b1d/raw/ddceae84d378fd600c2115ae0e729e03f7e27a76/kourier.yaml

# Check Load balancer
sudo k0s kubectl --namespace kourier-system get service kourier

# before DNS , you should have external IP (via MetalLB)
# dns
sudo k0s kubectl apply -f https://gist.githubusercontent.com/naveenrajm7/0b8f36752b0246ac680913580a756ed0/raw/ffb00218395c7421332b8d251d8b02b05f5a94ad/serving-default-domain.yaml

knative-servingのコンポーネントの確認

vagrant@vagrant:~$ sudo k0s kubectl get pods -n knative-serving
NAME                                      READY   STATUS      RESTARTS   AGE
autoscaler-84445c7b8f-f8nwq               1/1     Running     0          37m
activator-5f59946cc4-dsx6w                1/1     Running     0          37m
controller-67cc995548-ncvtw               1/1     Running     0          37m
domainmapping-webhook-57946bc655-vrl68    1/1     Running     0          37m
domain-mapping-5b485cdb5-fqt89            1/1     Running     0          37m
webhook-5c8c986896-f5z8w                  1/1     Running     0          37m
net-kourier-controller-6c89f976bf-4w579   1/1     Running     0          7m25s
default-domain-nghzp                      0/1     Completed   0          17s

Say Hello Edge!

通常のhello knativeサービスのインストール

hello.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: hello
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/minScale: "1"
    spec:
      containers:
        - image: ghcr.io/knative/helloworld-go:latest
          env:
            - name: TARGET
              value: "Edge!!"

# create knative service
vagrant@vagrant:~$ sudo k0s kubectl apply -f hello.yaml
# Check if service is running
vagrant@vagrant:~$ sudo k0s kubectl get ksvc
NAME    URL                                          LATESTCREATED   LATESTREADY   READY   REASON
hello   http://hello.default.192.168.10.0.sslip.io   hello-00001     hello-00001   True    
# Visit service
vagrant@vagrant:~$ curl http://hello.default.192.168.10.0.sslip.io
Hello Edge!!

Knativeをエッジに展開しましょう。

リソース:

  1. Neil Cresswell, K0s vs K3s vs Microk8s のリソース消費量の比較, 2022年8月23日 ブログ

  2. k0s クイックスタートガイド

  3. knativeドキュメント

  4. MetalLB

当サイトでは、サイトのトラフィックを把握するために分析と Cookie を使用しています。当サイトのご利用に関する情報は、その目的のために Google と共有されます。詳細はこちら