Kubernetesのメモ
opneSUSE Leap 15.5でKubernetes 1.29の高可用性クラスタ構築を目指すせませんでした。
結局 Debian GNU/Linux 12 (bookworm) に Kubernetes 1.28のクラスタを構築しました
パッケージのインストール(openSUSE)
失敗の記録として残しています。
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
パッケージのインストール(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
iptables
どっかの依存関係で勝手に入ってくるので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(ここがハマりポイント)
# 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
kube-vipインストール
コントローラとなるマシン全部でやる。
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
kubeadmでクラスタ作成
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 .....
Longhorn インストール
お手軽にいい感じの分散永続化ストレージを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.
Ingress Haproxy インストール
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バックエンドにつなぐ設定
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