Kubernetesのメモ

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

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

元ネタ

失敗の記録として残しています。

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

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

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
必須パッケージのインストール
# 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
# 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

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