この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。

詳細オプション / 設定

このセクションでは、K3sを実行および管理するさまざまな方法と、K3sの使用に必要なホストOSの準備手順についての高度な情報が含まれています。

証明書管理

認証局証明書

K3sは、最初のサーバーノードの起動時に自己署名の認証局(CA)証明書を生成します。これらのCA証明書は10年間有効であり、自動的には更新されません。

カスタムCA証明書の使用や自己署名のCA証明書の更新に関する情報は、`k3s certificate rotate-ca`コマンドのドキュメントを参照してください。

クライアントおよびサーバー証明書

K3sのクライアントおよびサーバー証明書は、発行日から365日間有効です。期限切れの証明書や、期限切れまで90日以内の証明書は、K3sが起動するたびに自動的に更新されます。

クライアントおよびサーバー証明書を手動でローテーションする方法については、`k3s certificate rotate`コマンドのドキュメントを参照してください。

トークン管理

デフォルトでは、K3sはサーバーとエージェントの両方に対して単一の静的トークンを使用します。注意して、このトークンはクラスターが作成された後にローテーションできます。 エージェントの参加にのみ使用できる2番目の静的トークンを有効にすることも可能であり、また自動的に期限切れになる一時的な`kubeadm`スタイルの参加トークンを作成することもできます。 詳細については、`k3s token`コマンドのドキュメントを参照してください。

DNS解決の設定

ネームサーバーの有効性チェック

起動時に、各ノードは`/etc/resolv.conf`および`/run/systemd/resolve/resolv.conf`のファイルをチェックして、ループバック、マルチキャスト、またはリンクローカルのネームサーバーを確認します。 そのようなエントリが存在する場合、設定ファイルは使用されません。なぜなら、そのようなエントリはhttps://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy[ノードから名前解決の構成を継承する]ポッド内では正しく機能しないからです。 使用可能な resolv.conf が見つからない場合、K3s はログに警告メッセージを出力し、8.8.8.82001:4860:4860::8888 をネームサーバーとして使用するスタブ resolv.conf を生成します。

システム構成ファイルを変更せずに K3s に代替のリゾルバ構成を提供したい場合は、--resolv-conf オプションを使用して適切なファイルのパスを指定できます。 手動で指定されたリゾルバ構成ファイルは、有効性チェックの対象にはなりません。

CoreDNS カスタム構成のインポート

CoreDNS 構成をカスタマイズするために、coredns-custom`という名前の ConfigMap を `kube-system ネームスペースに作成できます。 .override に一致するキーは :.53 サーバーブロックにインポートされます。 追加のサーバーブロックは .server に一致するキーに配置できます。 追加のコンテンツ(ゾーンファイルなど)も存在する可能性があり、coredns ポッドの /etc/coredns/custom にマウントされます。

以下は、example.com へのルックアップを 10.0.0.1 のネームサーバーに転送し、https://datatracker.ietf.org/doc/html/rfc1035#section-5[RFC 1035] 準拠のテキストファイルから example.net を提供する例の ConfigMap です:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns-custom
  namespace: kube-system
data:
  example-com.override: |
    forward example.com 10.0.0.1
  example-net.server: |
    example.net:53 {
      log
      errors
      file /etc/coredns/custom/db.example.net
    }
  db.example.net: |
    $ORIGIN example.net.
    @       3600 IN SOA    sns.dns.icann.org. noc.dns.icann.org. 2017042745 7200 3600 1209600 3600
            3600 IN NS     a.iana-servers.net.
            3600 IN NS     b.iana-servers.net.
    www          IN A      127.0.0.1
                 IN AAAA   ::1

HTTP プロキシの設定

K3s を HTTP プロキシを介してのみ外部接続が可能な環境で実行している場合、K3s systemd サービスでプロキシ設定を構成できます。これらのプロキシ設定は K3s で使用され、組み込みの containerd と kubelet に渡されます。

プロキシ設定およびホストからの他の環境変数は Pods に渡されません。

K3s インストールスクリプトは、現在のシェルから HTTP_PROXYHTTPS_PROXYNO_PROXY、および CONTAINERD_HTTP_PROXYCONTAINERD_HTTPS_PROXYCONTAINERD_NO_PROXY 変数を自動的に取得し、通常は次のように systemd サービスの環境ファイルに書き込みます:

  • /etc/systemd/system/k3s.service.env

  • /etc/systemd/system/k3s-agent.service.env

もちろん、これらのファイルを編集してプロキシを構成することもできます。

K3s は、クラスター内部の Pod およびサービス IP 範囲とクラスター DNS ドメインを NO_PROXY エントリのリストに自動的に追加します。Kubernetes ノード自体(つまり、ノードのパブリックおよびプライベート IP)が NO_PROXY リストに含まれているか、ノードがプロキシを介して到達可能であることを確認する必要があります。

HTTP_PROXY=http://your-proxy.example.com:8888
HTTPS_PROXY=http://your-proxy.example.com:8888
NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

K3s および Kubelet に影響を与えずに containerd のプロキシ設定を構成したい場合は、変数の前に CONTAINERD_ を付けることができます:

CONTAINERD_HTTP_PROXY=http://your-proxy.example.com:8888
CONTAINERD_HTTPS_PROXY=http://your-proxy.example.com:8888
CONTAINERD_NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

Docker をコンテナランタイムとして使用する

K3s には containerd が含まれており、業界標準のコンテナランタイムとしてデフォルト設定されています。 Kubernetes 1.24以降、Kubeletはdockershimを含まなくなりました。これは、kubeletがdockerdと通信するためのコンポーネントです。 K3s 1.24以降はhttps://github.com/Mirantis/cri-dockerd[cri-dockerd]を含んでおり、これにより以前のK3sリリースからのシームレスなアップグレードが可能で、Dockerコンテナランタイムを引き続き使用できます。

containerdの代わりにDockerを使用するには:

  1. K3sノードにDockerをインストールしてください。Rancherのhttps://github.com/rancher/install-docker[Dockerインストールスクリプト]の1つを使用してDockerをインストールできます:

    curl https://releases.rancher.com/install-docker/20.10.sh | sh
  2. `--docker`オプションを使用してK3sをインストールしてください。

    curl -sfL https://get.k3s.io | INSTALL_K3S_ARTIFACT_URL=<PRIME-ARTIFACTS-URL>/k3s sh -s - --docker
  3. クラスターが利用可能であることを確認してください。

    $ sudo k3s kubectl get pods --all-namespaces
    NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE
    kube-system   local-path-provisioner-6d59f47c7-lncxn   1/1     Running     0          51s
    kube-system   metrics-server-7566d596c8-9tnck          1/1     Running     0          51s
    kube-system   helm-install-traefik-mbkn9               0/1     Completed   1          51s
    kube-system   coredns-8655855d6-rtbnb                  1/1     Running     0          51s
    kube-system   svclb-traefik-jbmvl                      2/2     Running     0          43s
    kube-system   traefik-758cd5fc85-2wz97                 1/1     Running     0          43s
  4. Docker コンテナが実行中であることを確認してください。

    $ sudo docker ps
    CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS               NAMES
    3e4d34729602        897ce3c5fc8f              "entry"                  About a minute ago   Up About a minute                       k8s_lb-port-443_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
    bffdc9d7a65f        rancher/klipper-lb        "entry"                  About a minute ago   Up About a minute                       k8s_lb-port-80_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
    436b85c5e38d        rancher/library-traefik   "/traefik --configfi…"   About a minute ago   Up About a minute                       k8s_traefik_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
    de8fded06188        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
    7c6a30aeeb2f        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
    ae6c58cab4a7        9d12f9848b99              "local-path-provisio…"   About a minute ago   Up About a minute                       k8s_local-path-provisioner_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
    be1450e1a11e        9dd718864ce6              "/metrics-server"        About a minute ago   Up About a minute                       k8s_metrics-server_metrics-server-7566d596c8-9tnck_kube-system_031e74b5-e9ef-47ef-a88d-fbf3f726cbc6_0
    4454d14e4d3f        c4d3d16fe508              "/coredns -conf /etc…"   About a minute ago   Up About a minute                       k8s_coredns_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
    c3675b87f96c        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
    4b1fddbe6ca6        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
    64d3517d4a95        rancher/pause:3.1         "/pause"

etcdctlを使用する

etcdctlは、etcdサーバーと対話するためのCLIを提供します。K3sはetcdctlをバンドルしていません。

K3sの組み込みetcdと対話するためにetcdctlを使用したい場合は、https://etcd.io/docs/latest/install/[公式ドキュメント]を使用してetcdctlをインストールしてください。

ETCD_VERSION="v3.5.5"
ETCD_URL="https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz"
curl -sL ${ETCD_URL} | sudo tar -zxv --strip-components=1 -C /usr/local/bin

その後、K3sが管理する証明書とキーを使用して認証するようにetcdctlを設定することで使用できます。

sudo etcdctl version \
  --cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt \
  --cert=/var/lib/rancher/k3s/server/tls/etcd/client.crt \
  --key=/var/lib/rancher/k3s/server/tls/etcd/client.key

containerdの設定

バージョンゲート

K3sは2025年2月のリリースからcontainerd 2.0を含んでいます:v1.31.6+k3s1およびv1.32.2+k3s1。 containerd 2.0は設定バージョン3を好むことに注意してください。一方、containerd 1.7は設定バージョン2を好みます。

K3sは、現在のクラスターおよびノードの設定に特有の値を使用して、containerdの設定ファイルを`/var/lib/rancher/k3s/agent/etc/containerd/config.toml`に生成します。

高度なカスタマイズのために、同じディレクトリにcontainerdの設定テンプレートを作成できます。

  • containerd 2.0の場合、`config-v3.toml.tmpl`にバージョン3の設定テンプレートを配置してください。

    詳細については、https://github.com/containerd/containerd/blob/release/2.0/docs/cri/config.md[containerd 2.0 ドキュメント]を参照してください。

  • containerd 1.7 およびそれ以前のバージョンでは、config.toml.tmpl にバージョン 2 の設定テンプレートを配置してください。

    詳細については、https://github.com/containerd/containerd/blob/release/1.7/docs/cri/config.md[containerd 1.7 ドキュメント]を参照してください。

Containerd 2.0 は以前の設定バージョンと後方互換性があり、config-v3.toml.tmpl が見つからない場合、k3s は config.toml.tmpl からレガシー バージョン 2 の設定を引き続きレンダリングします。

テンプレートファイルは、https://pkg.go.dev/text/template[text/template] ライブラリを使用して containerd 設定にレンダリングされます。 デフォルトのテンプレート内容については、https://github.com/k3s-io/k3s/blob/main/pkg/agent/templates/templates.go[templates.go] の ContainerdConfigTemplateV3ContainerdConfigTemplate を参照してください。 テンプレートは、https://github.com/k3s-io/k3s/blob/main/pkg/agent/templates/templates.go#L22-L33[ContainerdConfig] 構造体をドット値(データ引数)として実行されます。

ベーステンプレート

K3s のソースコードから完全なストックテンプレートをコピー&ペーストするのではなく、K3s ベーステンプレートを拡張できます。これは、デフォルトの前後に数行追加するだけで既存の設定を構築する必要がある場合に便利です。

/var/lib/rancher/k3s/agent/etc/containerd/config-v3.toml.tmpl
{{ template "base" . }}

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'custom']
  runtime_type = "io.containerd.runc.v2"
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'custom'.options]
  BinaryName = "/usr/bin/custom-container-runtime"
  SystemdCgroup = true

最良の結果を得るために、プリレンダリングされた config.toml をテンプレートに単純にコピーして、希望の変更を加えないでください。ベーステンプレートを使用するか、上記の k3s デフォルトに基づいた完全なテンプレートを提供してください。

代替コンテナランタイムのサポート

K3s は、K3s が起動する際に存在する場合、代替コンテナランタイムを自動的に検出します。サポートされているコンテナランタイムは次のとおりです:

crun, lunatic, nvidia, nvidia-cdi, nvidia-experimental, slight, spin, wasmedge, wasmer, wasmtime, wws

K3s は、コンテナランタイムの実行可能ファイルを検索するためにサービスの PATH 環境変数を使用します。 インストールされたコンテナランタイムが K3s によって検出されない場合は、一般的に次のようなシステムパスに存在することを確認してください:
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin

NVIDIA コンテナランタイム

NVIDIA GPU は、Pod 内で加速されたワークロードをスケジュールおよび実行するために、NVIDIA コンテナランタイムのインストールを必要とします。K3s で NVIDIA GPU を使用するには、次の手順を実行してください:

  1. ノードに nvidia-container パッケージリポジトリをインストールするには、次の手順に従ってください: https://nvidia.github.io/libnvidia-container/

  2. NVIDIA コンテナランタイムパッケージをインストールします。例えば: apt install -y nvidia-container-runtime cuda-drivers-fabricmanager-515 nvidia-headless-515-server

  3. K3sをインストールする、または既にインストールされている場合は再起動します。

  4. K3s によって NVIDIA コンテナランタイムが見つかったことを確認してください: grep nvidia /var/lib/rancher/k3s/agent/etc/containerd/config.toml

これらの手順が正しく実行されると、K3sは見つかったランタイム実行可能ファイルに応じて、NVIDIAランタイムをcontainerd構成に自動的に追加します。 K3sには、すべてのサポートされている代替ランタイムのためのKubernetes RuntimeClass定義が含まれています。これらの中から1つを選択して、k3s CLIまたは設定ファイルを介して`--default-runtime`の値を設定することで、ノードのデフォルトランタイムとして`runc`を置き換えることができます。

GPUノードでデフォルトランタイムを変更していない場合は、Pod仕様で`runtimeClassName: nvidia`を設定してNVIDIAランタイムを明示的に要求する必要があります:

apiVersion: v1
kind: Pod
metadata:
  name: nbody-gpu-benchmark
  namespace: default
spec:
  restartPolicy: OnFailure
  runtimeClassName: nvidia
  containers:
  - name: cuda-container
    image: nvcr.io/nvidia/k8s/cuda-sample:nbody
    args: ["nbody", "-gpu", "-benchmark"]
    resources:
      limits:
        nvidia.com/gpu: 1
    env:
    - name: NVIDIA_VISIBLE_DEVICES
      value: all
    - name: NVIDIA_DRIVER_CAPABILITIES
      value: all

NVIDIAコンテナランタイムは、上記のように`runtimeClassName: nvidia`を含むPod仕様を確実にするための修正を加えたhttps://github.com/NVIDIA/k8s-device-plugin/[NVIDIAデバイスプラグイン]と一緒に頻繁に使用されることに注意してください。

エージェントレスサーバーの実行(実験的)

この機能は実験的です。

`--disable-agent`フラグで起動すると、サーバーはkubelet、コンテナランタイム、またはCNIを実行しません。クラスタ内にノードリソースを登録せず、`kubectl get nodes`の出力に表示されません。 kubeletをホストしないため、ポッドを実行したり、クラスタノードを列挙することに依存するオペレーターによって管理されたりすることはできません。これには、組み込みのetcdコントローラーやシステムアップグレードコントローラーが含まれます。

エージェントレスサーバーを実行することは、管理者のオーバーヘッドが増加する代わりに、エージェントやワークロードによる制御プレーンノードの発見を隠す場合に有利です。

デフォルトでは、エージェントレスサーバーのapiserverは、クラスタ内で実行されている入場Webhookや集約されたapiservicesへの外部接続を行うことができません。これを解決するには、`--egress-selector-mode`サーバーフラグを`pod`または`cluster`に設定します。既存のクラスタでこのフラグを変更する場合は、オプションを有効にするためにクラスタ内のすべてのノードを再起動する必要があります。

ルートレスサーバーの実行(実験的)

この機能は実験的です。

ルートレスモードでは、K3sサーバーを特権のないユーザーとして実行できるため、ホスト上の実際のルートを潜在的なコンテナブレイクアウト攻撃から保護します。

ルートレスKubernetesについて詳しくはhttps://rootlesscontaine.rs/をご覧ください。

ルートレスモードの既知の問題

  • ポート

    ルートレスで実行する際には、新しいネットワークネームスペースが作成されます。 これは、K3sインスタンスがホストからかなり切り離されたネットワークで実行されていることを意味します。 ホストからK3sで実行されるサービスにアクセスする唯一の方法は、K3sネットワークネームスペースへのポートフォワードを設定することです。 ルートレスK3sには、6443および1024未満のサービスポートをホストに自動的にバインドするコントローラーが含まれています。オフセットは10000です。

    例えば、ポート80のサービスはホスト上で10080になりますが、8080はオフセットなしで8080のままです。現在、自動的にバインドされるのはLoadBalancerサービスのみです。

  • Cgroups

    Cgroup v1およびハイブリッドv1/v2はサポートされていません。純粋なCgroup v2のみがサポートされています。ルートレスで実行中にcgroupsが不足してK3sの起動に失敗した場合、ノードがハイブリッドモードにある可能性が高く、「不足している」cgroupsはv1コントローラーにまだバインドされています。

  • マルチノード/マルチプロセスクラスター

    マルチノードのルートレスクラスター、または同じノード上の複数のルートレスk3sプロセスは、現在サポートされていません。詳しくはhttps://github.com/k3s-io/k3s/issues/6488#issuecomment-1314998091[#6488]をご覧ください。

ルートレスサーバーの起動

  • cgroup v2の委任を有効にします。詳しくはhttps://rootlesscontaine.rs/getting-started/common/cgroup2/をご覧ください。 このステップは必須です。適切なcgroupsが委任されていないと、ルートレスkubeletは起動に失敗します。

  • k3s-rootless.service`をhttps://github.com/k3s-io/k3s/blob/main/k3s-rootless.service[`https://github.com/k3s-io/k3s/blob/<VERSION>/k3s-rootless.service]からダウンロードしてください。 `k3s-rootless.service`と`k3s`の同じバージョンを使用することを確認してください。

  • k3s-rootless.service`を~/.config/systemd/user/k3s-rootless.service`にインストールします。 このファイルをシステム全体のサービス(/etc/systemd/…​)としてインストールすることはサポートされていません。 `k3s`バイナリのパスによっては、ファイルの`ExecStart=/usr/local/bin/k3s …​`行を修正する必要があるかもしれません。

  • `systemctl --user daemon-reload`を実行します。

  • `systemctl --user enable --now k3s-rootless`を実行します。

  • `KUBECONFIG=~/.kube/k3s.yaml kubectl get pods -A`を実行し、ポッドが動作していることを確認してください。

ターミナルで`k3s server --rootless`を実行しないでください。ターミナルセッションではcgroup v2の委任が許可されていません。 ターミナルで試す必要がある場合は、`systemd-run --user -p Delegate=yes --tty k3s server --rootless`を使用してsystemdスコープにラップしてください。

高度なルートレス構成

ルートレスK3sは、https://github.com/rootless-containers/rootlesskit[rootlesskit]とhttps://github.com/rootless-containers/slirp4netns[slirp4netns]を使用して、ホストとユーザーネットワークネームスペース間で通信します。 rootlesskitとslirp4netnsで使用される設定の一部は、環境変数で設定できます。これらを設定する最良の方法は、k3s-rootless systemdユニットの`Environment`フィールドに追加することです。

[可変] デフォルト 説明

K3S_ROOTLESS_MTU

1500

slirp4netns仮想インターフェースのMTUを設定します。

K3S_ROOTLESS_CIDR

10.41.0.0/16

slirp4netns仮想インターフェースで使用されるCIDRを設定します。

K3S_ROOTLESS_ENABLE_IPV6

自動検出

slirp4netnsのIPv6サポートを有効にします。指定されていない場合、K3sがデュアルスタック操作に設定されている場合は自動的に有効になります。

K3S_ROOTLESS_PORT_DRIVER

ビルトイン

ルートレスポートドライバーを選択します。`builtin`または`slirp4netns`のいずれかです。ビルトインは高速ですが、受信パケットの元の送信元アドレスをマスカレードします。

K3S_ROOTLESS_DISABLE_HOST_LOOPBACK

true

ゲートウェイインターフェースを介してホストのループバックアドレスへのアクセスが有効かどうかを制御します。セキュリティ上の理由から、これを変更しないことをお勧めします。

ルートレスのトラブルシューティング

  • デーモンのステータスを確認するには、`systemctl --user status k3s-rootless`を実行してください。

  • デーモンのログを見るには、`journalctl --user -f -u k3s-rootless`を実行してください。

  • https://rootlesscontaine.rs/も参照してください。

ノードのラベルとテイント

K3sエージェントは、--node-label`および--node-taint`のオプションで構成でき、これによりkubeletにラベルとテイントが追加されます。これらの2つのオプションは、登録時にのみラベルおよび/またはテイントを追加するため、ノードがクラスターに最初に参加する際にのみ設定できます。

現在のKubernetesのすべてのバージョンは、`kubernetes.io`および`k8s.io`のプレフィックスを持つラベルでノードが登録されることを制限しており、特に`kubernetes.io/role`ラベルを含みます。許可されていないラベルでノードを起動しようとすると、K3sは起動に失敗します。Kubernetesの著者によると:

ノードは自分自身の役割ラベルを主張することは許可されていません。ノードの役割は通常、特権のあるノードやコントロールプレーンのタイプを識別するために使用され、ノードが自分自身をそのプールにラベル付けできるようにすると、侵害されたノードが特権の高い資格情報へのアクセスを付与するワークロード(コントロールプレーンのデーモンセットなど)を簡単に引き寄せることができます。

詳細については、https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/279-limit-node-access/README.md#proposal[SIG-Auth KEP 279]を参照してください。

ノード登録後にノードのラベルやテイントを変更したり、予約されたラベルを追加したりする場合は、`kubectl`を使用する必要があります。https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/[テイント]およびhttps://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#add-a-label-to-a-node[ノードラベル]を追加する方法の詳細については、公式のKubernetesドキュメントを参照してください。

インストールスクリプトを使用してサービスを開始する

インストールスクリプトは、OSがsystemdまたはopenrcを使用しているかを自動検出し、インストールプロセスの一部としてサービスを有効にして開始します。

  • openrcで実行する場合、ログは`/var/log/k3s.log`に作成されます。

  • systemdで実行する場合、ログは`/var/log/syslog`に作成され、journalctl -u k3s(またはエージェントでは`journalctl -u k3s-agent`)を使用して表示されます。

自動起動とサービス有効化を無効にするインストールスクリプトの例:

curl -sfL https://get.k3s.io | INSTALL_K3S_ARTIFACT_URL=<PRIME-ARTIFACTS-URL>/k3s INSTALL_K3S_SKIP_START=true INSTALL_K3S_SKIP_ENABLE=true sh -

DockerでK3sを実行する

DockerでK3sを実行する方法はいくつかあります:

  • K3d

  • Docker

k3dは、DockerでマルチノードK3sクラスターを簡単に実行するために設計されたユーティリティです。

k3dは、Kubernetesのローカル開発用にDockerでシングルノードおよびマルチノードK3sクラスターを非常に簡単に作成できます。

k3dのインストールと使用方法についての詳細は、https://k3d.io/#installation[インストール]ドキュメントを参照してください。

Dockerを使用するには、K3sサーバーとエージェントを実行するための`rancher/k3s`イメージも利用可能です。 `docker run`コマンドを使用する:

sudo docker run \
  --privileged \
  --name k3s-server-1 \
  --hostname k3s-server-1 \
  -p 6443:6443 \
  -d rancher/k3s:v1.24.10-k3s1 \
  server

有効なK3sバージョンをタグとして指定する必要があります。なお、latest`タグはメンテナンスされていません。
Dockerイメージではタグに
+記号を使用できないため、タグには代わりに-`を使用してください。

K3sが起動して稼働している状態になったら、Dockerコンテナからadmin kubeconfigをコピーして使用できます。

sudo docker cp k3s-server-1:/etc/rancher/k3s/k3s.yaml ~/.kube/config

SELinuxサポート

SELinuxがデフォルトで有効になっているシステム(CentOSなど)にK3sをインストールする場合、適切なSELinuxポリシーがインストールされていることを確認する必要があります。

  • 自動インストール

  • 手動インストール

インストールスクリプトは、互換性のあるシステムでエアギャップ(された)インストールを行っていない場合、Rancher RPMリポジトリからSELinux RPMを自動的にインストールします。自動インストールは`INSTALL_K3S_SKIP_SELINUX_RPM=true`を設定することでスキップできます。

必要なポリシーは、次のコマンドでインストールできます。

yum install -y container-selinux selinux-policy-base
yum install -y https://rpm.rancher.io/k3s/latest/common/centos/9/noarch/k3s-selinux-1.6-1.el9.noarch.rpm

インストールスクリプトが失敗するのではなく警告を記録するよう強制するには、次の環境変数を設定できます:INSTALL_K3S_SELINUX_WARN=true

SELinux強制の有効化

SELinuxを活用するには、K3sサーバーとエージェントを起動する際に`--selinux`フラグを指定するか、`K3S_SELINUX=true`環境変数を設定してください。

このオプションは、K3sの設定ファイルでも指定できます。

selinux: true

SELinuxの下でカスタム`--data-dir`を使用することはサポートされていません。これをカスタマイズするには、おそらく独自のカスタムポリシーを作成する必要があります。ガイダンスのために、https://github.com/containers/container-selinux[containers/container-selinux]リポジトリを参照することができます。これは、コンテナランタイム用のSELinuxポリシーファイルを含んでおり、https://github.com/k3s-io/k3s-selinux[k3s-io/k3s-selinux]リポジトリはK3s用のSELinuxポリシーを含んでいます。

eStargzのレイジプルを有効にする(実験的)

レイジプルとeStargzとは何ですか?

イメージをプルすることは、コンテナライフサイクルの中で時間がかかるステップの一つとして知られています。 Harter, et al.によると、

パッケージをプルすることはコンテナの起動時間の76%を占めますが、そのデータのうちわずか6.4%が読み取られています。

この問題に対処するために、k3sはイメージコンテンツの_レイジプル_を実験的にサポートしています。 これにより、k3sはイメージ全体がプルされる前にコンテナを起動することができます。 代わりに、必要なコンテンツのチャンク(例:個々のファイル)がオンデマンドで取得されます。 特に大きなイメージの場合、この技術はコンテナの起動遅延を短縮することができます。

レイジプルを有効にするには、ターゲットイメージをhttps://github.com/containerd/stargz-snapshotter/blob/main/docs/stargz-estargz.md[eStargz]としてフォーマットする必要があります。 これはOCIの代替ですが、レイジプルに対応した100% OCI互換のイメージフォーマットです。 互換性があるため、eStargzは標準のコンテナレジストリ(例:ghcr.io)にプッシュでき、eStargz非対応のランタイムでも_実行可能です_。

eStargzは、https://github.com/google/crfs[Google CRFSプロジェクトによって提案されたstargzフォーマット]に基づいて開発されていますが、コンテンツの検証やパフォーマンスの最適化などの実用的な機能を備えています。 レイジプルとeStargzの詳細については、https://github.com/containerd/stargz-snapshotter[Stargz Snapshotterプロジェクトリポジトリ]を参照してください。

eStargzのレイジプルのためにk3sを設定する

以下に示すように、k3sサーバーとエージェントには`--snapshotter=stargz`オプションが必要です。

k3s server --snapshotter=stargz

この設定を使用すると、eStargz形式のイメージに対してレイジプルを実行できます。 以下の例のPodマニフェストは、eStargz形式の`node:13.13.0`イメージ(ghcr.io/stargz-containers/node:13.13.0-esgz)を使用しています。 stargzスナップショッターが有効になっている場合、K3sはこのイメージに対してレイジプルを実行します。

apiVersion: v1
kind: Pod
metadata:
  name: nodejs
spec:
  containers:
  - name: nodejs-estargz
    image: ghcr.io/stargz-containers/node:13.13.0-esgz
    command: ["node"]
    args:
    - -e
    - var http = require('http');
      http.createServer(function(req, res) {
        res.writeHead(200);
        res.end('Hello World!\n');
      }).listen(80);
    ports:
    - containerPort: 80

追加のログソース

K3s用のhttps://documentation.suse.com/cloudnative/rancher-manager/latest/en/observability/logging/logging-helm-chart-options.html[Rancher logging]は、Rancherを使用せずにインストールできます。これを行うには、以下の手順を実行してください:

helm repo add rancher-charts https://charts.rancher.io
helm repo update
helm install --create-namespace -n cattle-logging-system rancher-logging-crd rancher-charts/rancher-logging-crd
helm install --create-namespace -n cattle-logging-system rancher-logging --set additionalLoggingSources.k3s.enabled=true rancher-charts/rancher-logging

追加のネットワークポリシーロギング

ネットワークポリシーによってドロップされたパケットはログに記録できます。パケットはiptables NFLOGアクションに送信され、パケットの詳細が表示されます。それには、それをブロックしたネットワークポリシーも含まれます。

トラフィックが多い場合、ログメッセージの数は非常に多くなる可能性があります。ポリシーごとにログレートを制御するには、次のアノテーションを該当するネットワークポリシーに追加して、`limit`および`limit-burst`のiptablesパラメータを設定します:

  • kube-router.io/netpol-nflog-limit=<LIMIT-VALUE>

  • kube-router.io/netpol-nflog-limit-burst=<LIMIT-BURST-VALUE>

デフォルト値は`limit=10/minute`と`limit-burst=10`です。これらのフィールドの形式と可能な値についての詳細は、https://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO-7.html#:~:text=restrict%20the%20rate%20of%20matches[iptablesマニュアル]を確認してください。

NFLOGパケットをログエントリに変換するには、ulogd2をインストールし、[log1]`を`group=100`で読み取るように設定します。次に、新しい設定が適用されるようにulogd2サービスを再起動します。 パケットがネットワークポリシールールによってブロックされると、/var/log/ulog/syslogemu.log`にログメッセージが表示されます。

NFLOGネットリンクソケットに送信されたパケットは、tcpdumpやtsharkなどのコマンドラインツールを使用して読み取ることもできます:

tcpdump -ni nflog:100

より簡単に入手できるtcpdumpは、パケットをブロックしたネットワークポリシーの名前を表示しません。代わりにwiresharkのtsharkコマンドを使用して、ポリシー名が含まれる`nflog.prefix`フィールドを含む完全なNFLOGパケットヘッダーを表示してください。

ドロップされたパケットのネットワークポリシーロギングは、https://github.com/k3s-io/k3s/issues/8008[空の`podSelector`を持つポリシー]をサポートしていません。診断または監査の目的でドロップされたパケットのログに依存する場合は、影響を受けたポッドに一致するポッドセレクターがポリシーに含まれていることを確認してください。