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 refkubeadmと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システム設定変更
Section titled “システム設定変更”スワップ無効、ネットワークの設定とかは省略する。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOF
sudo modprobe overlaysudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1EOF
sudo sysctl --systemiptables
Section titled “iptables”どっかの依存関係で勝手に入ってくるのでlegacyに変える。
もしiptablesが入ってなければとりあえず飛ばす。
# update-alternatives --config iptablesalternative iptables (/usr/sbin/iptables を提供) には 2 個の選択肢があります。
選択肢 パス 優先度 状態------------------------------------------------------------ 0 /usr/sbin/iptables-nft 20 自動モード* 1 /usr/sbin/iptables-legacy 10 手動モード 2 /usr/sbin/iptables-nft 20 手動モード
現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 2containerd(ここがハマりポイント)
Section titled “containerd(ここがハマりポイント)”# mkdir -p /etc/containerdcontainerdのconfigの初期化# containerd config default | sudo tee /etc/containerd/config.tomlruncのcgroupドライバー# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.tomlsandbox 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 containerdkube-vipインストール
Section titled “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.yamlkubeadmでクラスタ作成
Section titled “kubeadmでクラスタ作成”1台目
$ sudo kubeadm init \--control-plane-endpoint "192.168.100.98:6443" \--pod-network-cidr=10.1.0.0/16 \--upload-certs2~3台目 1台目のクラスタ作成後に表示されるコマンドでjoin
$ sudo kubeadm join .....Longhorn インストール
Section titled “Longhorn インストール”お手軽にいい感じの分散永続化ストレージをk8sクラスタに追加してくれる頼もしいやつ!!!
データベースサーバ等まともなStorageClassが実装されていることを動作の条件にしているものがあるのでインストールする。
k8sが動作してるマシンすべてに必要なパッケージを入れる$ sudo apt install nfs-common open-iscsi
インストール$ kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/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 インストール
Section titled “Ingress Haproxy インストール”apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
helmCharts:- name: kubernetes-ingress valuesFile: values.yaml releaseName: public version: 1.38.2 repo: https://haproxytech.github.io/helm-chartsh2cのngxinxバックエンドにつなぐ設定
Section titled “h2cのngxinxバックエンドにつなぐ設定”kind: ServiceapiVersion: v1metadata: name: nextcloudspec: 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/v1kind: Ingressmetadata: 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: defaultspec: ingressClassName: public-haproxy rules: - host: nc.junk-labs.net http: paths: - backend: service: name: nextcloud port: name: h2c path: / pathType: Prefix