Fork me on GitHub

Herr Knedel/コンテナですごいこと:KubenetesクラスタとNFSストレージ

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Sat, 02 Apr 2022 15:22:59 +0000 Schwierigkeitsgrad: Sehr sportlich

2447 Words

今日は新しいKubenetesクラスタをインストールするのですが、やることがたくさんあります。

そのために、これらの部品を注文しました。

さあ、行こう!

Raspian Liteのインストールをベースに、インストール用のイメージを独自に作成しました。私のユーザー/公開鍵はすでにこのイメージに保存されており、「/boot/config.txt」ファイルは私のLEDに適合するように作られています。

# meine Server brauchen kein HDMI, WLAN und Bluetooth
dtoverlay=disable-bt
dtoverlay=disable-wifi
disable_splash=1
hdmi_blanking=1
hdmi_ignore_hotplug=1
hdmi_ignore_composite=1
 
 
# Status-LEDs an GPIO weiterleiten
dtoverlay=act-led,gpio=21
dtparam=act_led_trigger=cpu0

サーバー1 - マウントディスク

まず、「Server 1」にNFSサービスをインストールする。このストレージは、後で私のコンテナ・クラスタに使用することができます。USBハードディスクを「サーバー1」に接続し、以下の説明を参考にEXT4でフォーマットしてみました。https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/。 そして、USBディスクのマウントポイントを作成しました。

x
+
Terminal

$ sudo mkdir /media/usb-platte

新しいファイルシステムを「/etc/fstab」ファイルに以下のように入力しました。

/dev/sda1 /media/usb-platte ext4 defaults 0 2

sudo mount -a」で設定を確認できます。これで、USBディスクが「/media/usb-disk」以下にマウントされるはずです。

NFSのインストール

このパッケージは、NFSに必要です。

x
+
Terminal

$ sudo apt-get install nfs-kernel-server -y

さらに、USBディスクに新しいフォルダが作成されました

x
+
Terminal

$ sudo mkdir /media/usb-platte/nfsshare
$ sudo chown -R pi:pi /media/usb-platte/nfsshare/
$ sudo find /media/usb-platte/nfsshare/ -type d -exec chmod 755 {} \;
$ sudo find /media/usb-platte/nfsshare/ -type f -exec chmod 644 {} \;

次に、"/etc/exports “ファイルを編集する必要があります。そこには、パス、ユーザーID、グループIDが入力されています。

/media/usb-platte/nfsshare *(rw,all_squash,insecure,async,no_subtree_check,anonuid=1000,anongid=1000)

これで、以下のように設定を採用することができます。

x
+
Terminal

$ sudo exportfs -ra

NFSをマウントするにはどうしたらいいですか?

以下のように、ボリュームをマウントすることができます。

x
+
Terminal

$ sudo mount -t nfs SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs

または、"/etc/fstab” ファイルに永久に入力します。

SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs/ nfs defaults 0 0

ここでも「sudo mount -a」が使える。

Kubernetesのインストール

サーバー1、サーバー2、サーバー3では、以下のコマンドを実行する必要があります。まず、Dockerをインストールし、ユーザー「PI」をDockerグループに追加します。

x
+
Terminal

$ curl -sSL get.docker.com | sh
$ sudo usermod pi -aG docker

その後、すべてのサーバーでスワップサイズの設定がゼロになります。つまり、「/etc/dphys-swapfile」ファイルを編集して、「CONF_SWAPSIZE」属性を「0」に設定するのです。

また、「/boot/cmdline.txt」ファイルの「Control-Group」設定も調整する必要があります。

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

ご覧ください。

これですべてのRaspberryが一度再起動し、Kubernetesをインストールする準備が整いました。

x
+
Terminal

$ sudo reboot

再起動後、これらのパッケージをサーバー1、サーバー2、サーバー3にインストールします。
x
+
Terminal

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
$ sudo apt-get update -q && sudo apt-get install -qy kubeadm

# サーバー1のみ

これでKubenetesのマスターが初期化できるようになりました。

x
+
Terminal

$ sudo kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16

初期化に成功した後、設定を受け入れる。ワーカーノードを接続するために表示される「kubeadm join」コマンドを覚えています。
x
+
Terminal

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

さて、残念なことに、ネットワークのために何かしなければならないことがあります。
x
+
Terminal

$ kubectl apply https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
$ sudo systemctl daemon-reload
$ systemctl restart kubelet

コマンド “kubectl get nodes” で “Master” が “Ready” 状態であることが表示されるようになりました。

Kubernetes - ノードの追加

ここで、Kubenetesの初期化で出てきた「kubeadm join」コマンドを用意します。このコマンドを「サーバー2」と「サーバー3」に入力します。

x
+
Terminal

$ kubeadm join master-ip:port --token r4fddsfjdsjsdfomsfdoi --discovery-token-ca-cert-hash sha256:1adea3bfxfdfddfdfxfdfsdffsfdsdf946da811c27d1807aa

ここで再度「Server 1」から「kubectl get nodes」コマンドを入力すると、これらのノードはおそらく「Not Ready」というステータスで表示されます。ここにも、マスターが抱えていたネットワークの問題がある。もう一度、先ほどのコマンドを実行しますが、今度はforceの「f」を追加します。
x
+
Terminal

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

その後、すべてのノードが使用可能な状態になっているのがわかります。

小規模テスト運用(サーバー1/Kubenetes-Master)

自分で小さなテストデプロイメントを書いて、機能を確認します。以下の内容で「nginx.yml」ファイルを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
 selector:
   matchLabels:
     run: my-nginx
 replicas: 2
 template:
   metadata:
     labels:
       run: my-nginx
   spec:
     containers:
     - name: my-nginx
       image: nginx
       ports:
       - containerPort: 80

今、私はディプリーションを開始します。

x
+
Terminal

$ kubectl apply -f nginx.yml
$ kubectl rollout status deployment/my-nginx
$ kubectl get deplyments

グレート!

サービスを作成し、コンテナを呼び出すことができるんだ。 20個の「レプリカ」まで一旦スケールアップしています。
x
+
Terminal

$ kubectl scale deployment my-nginx --replicas=0; kubectl scale deployment my-nginx --replicas=20

ご覧ください。

テストデプリメントのクリーンアップ

片付けるために、deplymentとserviceを再度削除します。

x
+
Terminal

$ kubectl delete service example-service
$ kubectl delete deplyments my-nginx

ご覧ください。