Skip to content

helmを使いながらのkubernetesのセットアップ

Posted on:April 20, 2024 at 07:26 AM

kubernetes のセットアップ

インフラ構成

ハードウェア

ネットワーク構成

ホスト OS の基本設定

hosts の設定

各ノードで設定しておく

192.168.5.12 control-plane1 # コントロールプレーン
192.168.5.11 worker2
192.168.5.10 worker1

ファイアウォールの設定

性善説

ネットワークモジュール設定

次のコマンドを実行して、カーネル モジュール \overlay\ および \br_netfilter\ を有効にします。

modprobe overlay
modprobe br_netfilter
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

永続化

sysctl --system

スワップ無効化

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff -a
free -m #確認

ただ、上記の設定をしても reboot した時に復活することがある。

その場合は以下の systemd コマンドでスワップのサービスをマスクする

dev-swap.swapの名前は適宜systemctl --type swapにて確認可能

sudo systemctl mask "dev-swap.swap"

quote: https://qiita.com/zembutsu/items/2d8a7f5caa4885d08591

containerd インストール

apt で入れるのが丸い

apt install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install containerd.io

参考: https://docs.docker.com/engine/install/ubuntu/

Ubuntu
Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.
Ubuntu favicon https://docs.docker.com/engine/install/ubuntu/
Ubuntu

Systemd cgroup ドライバを有効化

ubuntu 22.04 では containerd のランタイムで systemd cgroup ドライバを有効化することを推奨されている

インストールが完了したら、次のコマンドを実行して containerd サービスを停止。

systemctl stop containerd

containerd のコンフィグファイルを生成、編集

containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml

以下のSystemdCgroup = falsetrueにする。出現箇所は containerd v1.7.3 時点で 1 箇所

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
-    SystemdCgroup = false
+    SystemdCgroup = true

修正完了したら起動

systemctl start containerd

確認し、active ならお k

systemctl status containerd

kubeadm のインストール

apt install apt-transport-https ca-certificates curl -y
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

kubernetes のパッケージ群をインストールし、バージョン固定

apt update
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

クラスターの初期化

kubeadm init コマンドを利用し、control-plane1 上で kubernetes クラスタを初期化する

 kubeadm init --service-cidr=10.2.0.0/16  --pod-network-cidr=10.1.0.0/16 --cri-socket=unix:///run/containerd/containerd.sock --apiserver-advertise-address=192.168.5.12

https://www.infraexpert.com/study/ip5.html によると private ip は 10 系が幅を取りやすいので、pod, service のネットワークは 10.1・10.2 系の/16 とした。

IPアドレス - グローバルIPアドレスとプライベートIPアドレス
IPアドレス - グローバルIPアドレスとプライベートIPアドレスについて解説。
IPアドレス - グローバルIPアドレスとプライベートIPアドレス favicon https://www.infraexpert.com/study/ip5.html

うまくいくと他のノードがクラスタに join するためのコマンドが表示される。

kubeadm join 192.168.5.12:6443 --token <token> \
        --discovery-token-ca-cert-hash sha256:<hash>

他のワーカーノードを参加させる

worker1, worker2 ノードで実行する。

root@worker1 $ kubeadm join 192.168.5.12:6443 --token <token> \
        --discovery-token-ca-cert-hash sha256:<hash>
root@worker2 $ kubeadm join 192.168.5.12:6443 --token <token> \
        --discovery-token-ca-cert-hash sha256:<hash>

ネットワーク環境の構築

ここからユーザー権限に戻る。

以下のユーザーレベルでもクラスタに繋げるようにするコマンドを実行する。

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

MetalLB

helm 用に values を作成

ingress-nginx による LoadBalancer を外部公開するために必要

frr ではなく native モードでインストールしたいのでmetallb/values.ymlを以下の通りに作成

speaker:
  frr:
    enabled: false

helm インストール

helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb -f metallb/values.yml -n metallb-system

公開する IP に応じて metallb/configrations.yml の中身を編集

adresses を LoadBalancer で外部公開するための IP レンジにする

自分の場合は 10.0.0.3 を外部との接続に使いたい

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.0.0.3/32
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default-advertisement
  namespace: metallb-system
EOF

metaldb/configrations.yamlを適用

kubectl apply -f metallb/configrations.yml

calico のインストール

helm の repository add

helm repo add projectcalico https://docs.tigera.io/calico/charts

calico をインストールするための設定ファイルをダウンロード

curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml -O

vim かなんかで弄る

vim custom-resources.yaml

以下のようにする

cidr はkubeadm initで設定したpod-cidrの値を設定

nodeAddressAutodetectionV4 はほっといてもよしなにやってくれるが、一応こっちで LAN network を指定しておく

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
      - blockSize: 26
        cidr: 10.1.0.0/16
        encapsulation: VXLANCrossSubnet
        natOutgoing: Enabled
        nodeSelector: all()
    nodeAddressAutodetectionV4:
      cidrs:
        - "192.168.5.0/24"
---
# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}

クラスタに適用

kubectl create -f custom-resources.yaml

helm install

helm install calico projectcalico/tigera-operator --version v3.27.3 --namespace tigera-operator

確認する

watch kubectl get pods -n calico-system

こういうのが出てたらお k

NAMESPACE     NAME                READY   STATUS                  RESTARTS         AGE
kube-system   calico-node-txngh   1/1     Running                   0              54s
Policy	IPAM	CNI	Overlay	Routing	Datastore

ingress-nginx のインストール

helm install

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace