1

以下の構成で lxc コンテナーで Kubespray を実行しました: (server_ram:8G | ubuntu のすべてのノード:18.04)

|  NAME   |  STATE  |         IPV4  
+---------+---------+-------------------         
| ansible | RUNNING | 10.21.185.23 (eth0)  
| node1   | RUNNING | 10.21.185.158 (eth0)  
| node2   | RUNNING | 10.21.185.186 (eth0)   
| node3   | RUNNING | 10.21.185.65 (eth0)  
| node4   | RUNNING | 10.21.185.106 (eth0)  
| node5   | RUNNING | 10.21.185.14 (eth0) 

root@ansible で: kubespray コマンドを実行してクラスターを構築すると、次のエラーが発生しました:


TASK [kubernetes/preinstall : Disable swap] ******************
fatal: [node1]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.020302", "end": "2020-05-13 07:21:24.974910", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:24.954608", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node2]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.010084", "end": "2020-05-13 07:21:25.051443", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.041359", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node3]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.008382", "end": "2020-05-13 07:21:25.126695", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.118313", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node4]: FAILED! => {"changed": true, "cmd": ["/sbin/swapoff", "-a"], "delta": "0:00:00.006829", "end": "2020-05-13 07:21:25.196145", "msg": "non-zero return code", "rc": 255, "start": "2020-05-13 07:21:25.189316", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

lxc コンテナーの構成:(include:node1、node2、node3、node4、node5)

architecture: x86_64
config:
  image.architecture: amd64
  image.description: ubuntu 18.04 LTS amd64 (release) (20200506)
  image.label: release
  image.os: ubuntu
  image.release: bionic
  image.serial: "20200506"
  image.version: "18.04"
  limits.cpu: "2"
  limits.memory: 2GB
  limits.memory.swap: "false"
  linux.kernel_modules: ip_tables,ip6_tables,netlink_diag,nf_nat,overlay
  raw.lxc: "lxc.apparmor.profile=unconfined\nlxc.cap.drop= \nlxc.cgroup.devices.allow=a\nlxc.mount.auto=proc:rw
    sys:rw"
  security.nesting: "true"
  security.privileged: "true"
  volatile.base_image: 93b9eeb85479af2029203b4a56a2f1fdca6a0e1bf23cdc26b567790bf0f3f3bd
  volatile.eth0.hwaddr: 00:16:3e:5a:91:9a
  volatile.idmap.base: "0"
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

ノードで手動でスワップオフしようとすると、何も受信しません。

root@node1:~# /sbin/swapoff -a
root@node1:~#

誰かがアイデアを持っているととても役に立ちます。

4

1 に答える 1

2

この回答を2つの部分に分けました:

  • TL;DR Kubespray が失敗する理由swapoff -a
  • LXC コンテナーに Kubespray を使用して Kubernetes をインストールする方法

TL;DR

Kubespray実行時に非終了ゼロ コード (255) を受け取るため、失敗しますswapoff -a

ゼロ以外の終了ステータスは失敗を示します。この一見直感に反するスキームが使用されるため、成功を示す明確に定義された 1 つの方法と、さまざまな失敗モードを示すさまざまな方法があります。

Gnu.org: 終了ステータス

limits.memory.swap: "false"コンテナーに関連付けられたプロファイルを設定しても、このエラーが発生します。

ホストシステムでスワップを無効にすることで回避できます。次の方法で実行できます。

  • $ swapoff -a
  • スワップインに関連付けられた行を削除/etc/fstab
  • $ reboot

その後、コンテナは発行時に ゼロの終了コードを生成する必要があります$ swapoff -a


LXC コンテナーに Kubespray を使用して Kubernetes をインストールする方法

lxcコンテナを作成し、コンテナへの完全な ssh アクセス権を持っていると仮定すると、実行する前に考慮すべきことがまだありますkubespray

コンテナを実行kubesprayしたところ、次の問題に遭遇しました。lxc

  • 収納スペース
  • ドッカーパッケージ
  • kmsg
  • カーネルモジュール
  • conntrack

収納スペース

ストレージ プール内に十分なストレージがあることを確認してください。ストレージが不足すると、クラスターのプロビジョニングに失敗します。デフォルトのストレージ プール サイズは、5 つのノードを保持するには十分な大きさではない可能性があります。

Docker パッケージ

クラスターをプロビジョニングするときは、最新バージョンが利用可能であることを確認してくださいkubespray。古いバージョンでは docker パッケージが互いに互換性がないという問題があったためです。

Kmsg

/dev/kmsg キャラクター デバイス ノードは、カーネルの printk バッファーへのユーザー空間アクセスを提供します。

Kernel.org: ドキュメント: dev-kmsg

デフォルトでは、ノード (lxc コンテナー) で が利用できないkubespray場合、クラスターのプロビジョニングに失敗します。/dev/kmsg

/dev/kmsgコンテナで利用できないため、プロビジョニングlxcが失敗します。kubespray

それには回避策があります。lxcコンテナで次を実行します

# Hack required to provision K8s v1.15+ in LXC containers
mknod /dev/kmsg c 1 11
chmod +x /etc/rc.d/rc.local
echo 'mknod /dev/kmsg c 1 11' >> /etc/rc.d/rc.local

Github.com: Justmeandopensource: lxd-provisioning: bootstrap-kube.sh

次のような他の回避策を試しました。

  • 追加lxc.kmsg = 1-/etc/lxc/default.conf推奨
  • echo 'L /dev/kmsg - - - - /dev/console' > /etc/tmpfiles.d/kmsg.confコンテナ内で実行してから再起動systemd-journaldすると、コアの使用率が 100% になります。

カーネル モジュール

LXC/LXD システム コンテナーは、独自に使用するためにカーネル モジュールをロードしません。あなたがすることは、カーネルモジュールをロードするホストを取得することです。このモジュールはコンテナで利用できる可能性があります。

Linuxcontainers.org: LXC コンテナーにカーネル モジュールを追加する方法

Kubesprayノード内で特定のカーネルモジュールが利用可能かどうかを確認します。

ホストに次のモジュールを追加する必要があります。

  • ip_vs
  • ip_vs_sh
  • ip_vs_rr
  • ip_vs_wrr

上記のモジュールを追加するには、次の$ modprobe MODULE_NAMEリンクを使用するか、Cyber​​citi.biz: Linux how to load a kernel module automatically をたどります

コントラック

conntrack次の名前のモジュールをインストールしてロードする必要がありますnf_conntrack

  • $ apt install conntrack -y
  • modprobe nf_conntrack

上記のコマンドkubesprayがないと、 の可用性を確認するステップで失敗しますconntrack

この変更により、環境kubespray内でKubernetes クラスターを実行し、次のようなノードの出力を取得できるようになります。lxc

root@k8s1:~# kubectl get nodes -o wide
NAME   STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
k8s1   Ready    master   14h   v1.18.2   10.224.47.185   <none>        Ubuntu 18.04.4 LTS   5.4.0-31-generic   docker://18.9.7
k8s2   Ready    master   14h   v1.18.2   10.224.47.98    <none>        Ubuntu 18.04.4 LTS   5.4.0-31-generic   docker://18.9.7
k8s3   Ready    <none>   14h   v1.18.2   10.224.47.46    <none>        Ubuntu 18.04.4 LTS   5.4.0-31-generic   docker://18.9.7
k8s4   Ready    <none>   14h   v1.18.2   10.224.47.246   <none>        Ubuntu 18.04.4 LTS   5.4.0-31-generic   docker://18.9.7 
于 2020-05-28T10:32:27.203 に答える