コンテンツにスキップ

Kubernetesのメモ

opneSUSE Leap 15.5でKubernetes 1.29の高可用性クラスタ構築を目指すせませんでした。

結局 Debian GNU/Linux 12 (bookworm) に Kubernetes 1.28のクラスタを構築しました

元ネタ

パッケージのインストール(openSUSE)

Section titled “パッケージのインストール(openSUSE)”

<WRAP center round alert 60%> 失敗の記録として残しています。

opneSUSE Leap ではkubeadmが引っ張ってくるイメージがことごとく消滅しているのでどうしようもありませんでした

Tumbleweedを使うかkubic以外の安定したリポジトリがあればなんとかなるかもしれません </WRAP>

Leapのままだといろいろ足りなかったり古かったりしているのでSUSEが開発しているKubernetesディストリビューションであるkubicのパッケージを拝借する

kubicのリポジトリを追加
# zypper addrepo https://download.opensuse.org/repositories/devel:/kubic/15.5/ kubic
# zypper ref
kubeadmとContainerdをインストール
# zypper in kubernetes1.28-kubeadm containerd-ctr conntrackd
必要に応じてkubctlをインストール
# zypper in kubernetes1.28-client kubernetes1.28-client-bash-completion
その他パッケージ
# zypper in glusterfs jq
# systemctl enable containerd
# systemctl start containerd

パッケージのインストール(Debian)

Section titled “パッケージのインストール(Debian)”
必須パッケージのインストール
# apt update
# apt install -y containerd apt-transport-https ca-certificates curl gnupg2
リポジトリの追加(Ubuntuと全く同じものが使える)(20240224 https://apt.kubernetes.io/ がサ終したため公式ドキュメントの手順に更新)
# curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/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.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# apt update
パッケージのバージョンを確認する
# apt list kubeadm -a
バージョン指定してインストールする。
# apt install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00
バージョン固定!!!
# apt-mark hold kubelet kubeadm kubectl

スワップ無効、ネットワークの設定とかは省略する。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo 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
sudo sysctl --system

どっかの依存関係で勝手に入ってくるのでlegacyに変える。

もしiptablesが入ってなければとりあえず飛ばす。

# update-alternatives --config iptables
alternative iptables (/usr/sbin/iptables を提供) には 2 個の選択肢があります。
選択肢 パス 優先度 状態
------------------------------------------------------------
0 /usr/sbin/iptables-nft 20 自動モード
* 1 /usr/sbin/iptables-legacy 10 手動モード
2 /usr/sbin/iptables-nft 20 手動モード
現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 2

containerd(ここがハマりポイント)

Section titled “containerd(ここがハマりポイント)”
# mkdir -p /etc/containerd
containerdのconfigの初期化
# containerd config default | sudo tee /etc/containerd/config.toml
runcのcgroupドライバー
# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sandbox imageのバージョンを推奨のバージョンにあわせる
# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.k8s.io/pause:3.9"#g' /etc/containerd/config.toml
# systemctl restart containerd

コントローラとなるマシン全部でやる。

kubeadm resetの対象なのでどっかでつまずいてリセットしたらここからやり直す。

ロードバランサーのIPアドレスを指定(セグメントが同じであれば好きなものに)
# export VIP=192.168.100.98
ロードバランサーのトラフィックを流すインターフェイスの指定
# export INTERFACE=eth1
kube-vipの最新バージョンの取得(jqコマンドがないと言われたらaptで入れるか目grepする)
# KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")
設定ファイルを生成して保存
# alias kube-vip="containerd-ctr image pull ghcr.io/kube-vip/kube-vip:$KVVERSION; containerd-ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"
# kube-vip manifest pod \
--interface $INTERFACE \
--address $VIP \
--controlplane \
--services \
--arp \
--leaderElection | tee /etc/kubernetes1.29/manifests/kube-vip.yaml

1台目

$ sudo kubeadm init \
--control-plane-endpoint "192.168.100.98:6443" \
--pod-network-cidr=10.1.0.0/16 \
--upload-certs

2~3台目 1台目のクラスタ作成後に表示されるコマンドでjoin

$ sudo kubeadm join .....

公式サイト

お手軽にいい感じの分散永続化ストレージをk8sクラスタに追加してくれる頼もしいやつ!!!

データベースサーバ等まともなStorageClassが実装されていることを動作の条件にしているものがあるのでインストールする。

k8sが動作してるマシンすべてに必要なパッケージを入れる
$ sudo apt install nfs-common open-iscsi
インストール
$ kubectl apply -f https://raw.githubusercontent.com/longhorn/longho
rn/v1.6.0/deploy/longhorn.yaml
longhorn-managerがCrashLoopBackOffになった場合はホスト側に必須パッケージが足りないので入れる
$ curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.6.0/scripts/environment_check.sh | bash
[INFO] Required dependencies are installed.
[INFO] Waiting for longhorn-environment-check pods to become ready (0/0)...
[INFO] Waiting for longhorn-environment-check pods to become ready (0/2)...
[INFO] All longhorn-environment-check pods are ready (2/2).
[ERROR] nfs-common is not found in k8s-master2.
[ERROR] open-iscsi is not found in k8s-master2.
[ERROR] nfs-common is not found in k8s-master3.
[ERROR] open-iscsi is not found in k8s-master3.
[ERROR] Please install missing packages.
[INFO] Cleaning up longhorn-environment-check pods...
[INFO] Cleanup completed.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
helmCharts:
- name: kubernetes-ingress
valuesFile: values.yaml
releaseName: public
version: 1.38.2
repo: https://haproxytech.github.io/helm-charts

h2cのngxinxバックエンドにつなぐ設定

Section titled “h2cのngxinxバックエンドにつなぐ設定”

https://www.haproxy.com/documentation/kubernetes-ingress/community/configuration-reference/ingress/#server-proto

kind: Service
apiVersion: v1
metadata:
name: nextcloud
spec:
type: ClusterIP
selector:
app: nextcloud
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
- name: h2c
protocol: TCP
port: 8080
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
haproxy.org/server-proto: "h2"
# haproxy.org/server-ssl: "true"
# haproxy.org/ssl-passthrough: "true"
name: nextcloud
namespace: default
spec:
ingressClassName: public-haproxy
rules:
- host: nc.junk-labs.net
http:
paths:
- backend:
service:
name: nextcloud
port:
name: h2c
path: /
pathType: Prefix