文章へ移動
Shemolk8sクラスターのインストールとKubeEdgeデプロイ前の準備
流程记录 / 云原生

k8sクラスターのインストールとKubeEdgeデプロイ前の準備

実験環境:Debian GNU/Linux 12 (bookworm) x86_64

containerd のインストール

k8s を入れる前に、まずcontainerd をインストールする。kubeedge のエッジ側は containerd だけでよく、クラウド側は k8s が必要。

k8s インストール前の準備

トラフィック転送を設定する

iptables の設定をいじって、「br_netfilter」モジュールを有効にする。こうすると kubernetes がネットワークトラフィックを検査して転送できるようになる。

shell
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system

Linux の Swap パーティションをオフにする

セキュリティ上の理由(公式ドキュメントでは Secret はメモリ上でのみ読み書きされ、ディスクには落ちないと約束されている)や、ノード同期の一貫性を保つためなど、1.8 から Kubernetes はドキュメントでデフォルトでは Swap をサポートしないと明言している。Swap を切っていないマシンでは、クラスタは起動すらしなくなる。
shell
sudo cp /etc/fstab /etc/fstab_bak
sudo swapoff -a
sudo sed -ri '/\\sswap\\s/s/^#?/#/' /etc/fstab

apt リポジトリを登録する

清華ミラーを選んだ。公式ドキュメント:https://mirrors.tuna.tsinghua.edu.cn/help/kubernetes/

shell
sudo apt install -y apt-transport-https ca-certificates curl

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg <https://packages.cloud.google.com/apt/doc/apt-key.gpg>

/etc/apt/sources.list.d/kubernetes.list を新規作成して、中身はこう:

shell
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] <https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt> kubernetes-xenial main

それから

shell
sudo apt update

kubeadm、kubelet、kubectl のインストール

この3つのツールの役割は自分で調べてほしい。

shell
sudo apt install kubeadm kubelet kubectl

自分はバージョンをピン止めしていない。ピン止めが必要なら、参考記事を読んでほしい。

インストール結果を確認:

shell
cloud@cloud:~$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.10", GitCommit:"21be1d76a90bc00e2b0f6676a664bdf097224155", GitTreeState:"clean", BuildDate:"2024-05-14T10:51:30Z", GoVersion:"go1.21.9", Compiler:"gc", Platform:"linux/amd64"}
cloud@cloud:~$ kubectl version
Client Version: v1.28.10
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?
cloud@cloud:~$ kubelet --version
Kubernetes v1.28.10

このあと必要なイメージのバージョンを確認:

shell
cloud@cloud:~$ sudo kubeadm config images list --kubernetes-version v1.28.10
registry.k8s.io/kube-apiserver:v1.28.10
registry.k8s.io/kube-controller-manager:v1.28.10
registry.k8s.io/kube-scheduler:v1.28.10
registry.k8s.io/kube-proxy:v1.28.10
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0
registry.k8s.io/coredns/coredns:v1.10.1

クラスタのコントロールプレーンを初期化する

  1. kubelet を起動し、ブート時にも動くようにする
shell
sudo systemctl start kubelet
sudo systemctl enable kubelet
  1. デプロイ開始。ここでは root アカウントに切り替えた
shell
kubeadm init \\
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \\
--pod-network-cidr=10.10.0.0/16 \\
--apiserver-advertise-address=10.129.196.8 \\
--kubernetes-version=v1.28.10 \\
--v=5

パラメータの説明(ここは元の参考記事からそのまま抜粋した):

  • -image-repository:上で必要なベースイメージを Aliyun から取る。設定しないと Google のサーバから取ることになる;
  • -pod-network-cidr:クラスタ内 Pod のネットワークアドレス帯。あとでネットワークプラグイン Flannel を入れるときに使う;
  • -kubernetes-version:Kubernetes のバージョンを指定;
  • -v=5:詳細なトレースログを出す。ここを参考に;
  • -apiserver-advertise-address:api-server の IP アドレスを指定する。NIC が複数あるなら、どれを使うか明示すること。apiserver は Kubernetes クラスタでかなり大事で、ConfigMap などの設定にこのアドレスがそのまま入っていることが多く、あとから変えるとすごく面倒なので慎重に。
  1. ログの指示に従って kube config を設定する

自分のやり方は root の下でやること。あとで kubeedge をデプロイするとき、デフォルトの config ファイルは $HOME/.kube/config、つまり /root/.kube/config にある。

shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

ネットワークプラグインを入れる

k8s のネットワークプラグインについては自分で勉強してほしい。自分ももう少し勉強しないと...

ここでは元の参考記事と同じく Flannel を選ぶ。

Github からインストールファイル kube-flannel.yml を取ってきて、編集する:

plain text
net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

上の Network を、さっきクラスタ初期化で設定した pod 網段に合わせる:

yaml
net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

最後に kubectl apply で入れる:

plain text
kubectl apply -f kube-flannel.yml

flannel 公式のやり方で直接やるのもあり

shell
kubectl apply -f <https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml>

バージョンはどちらでも大差ない気がする。ただ、どっちにせよ pod の網段は設定しておくべき。

ひとつ小さな注意点

あとで edgemesh のテストケースを動かしているとき、エッジ側にデプロイした pod がずっと ContainerCreating のままなのに気づいた。エッジの edgecore ログを見ると原因は /run/flannel/subnet.env が存在しないこと。クラウド側のこのファイルの中身をエッジにコピーしたら、やっと普通にデプロイできた。なのでこの問題は覚えておいて、edgemesh をデプロイするときにもう一度話す。

イメージについて

containerd のプロキシを設定する前、flannel のイメージが pull できない問題にぶつかった。自分が使った国内ミラーへの置き換え方をひとつ紹介する。

渡渡鸟镜像同步站 で関連イメージを検索して、kubectl edit pod/deployment/daemonset ** -n ** で国内のイメージに直接差し替える。渡渡鸟に該当イメージがなければ、サイトの使い方ガイドに従って追加もできる。

master の taint を外す

taint を外すのは、master ノードに業務サービスを載せられるようにするため。cloudcore をデプロイしていたとき、まさにこの問題で時間を食った...

shell
kubectl taint nodes cloud node-role.kubernetes.io/control-plane:NoSchedule-

参考記事にある NodePort 範囲の調整は、今のところ困っていないのでスキップした。必要なら参考記事を読んでほしい。

Worker ノードを足すのも今は必要ない。必要なら参考記事を読んでほしい。

Docker のインストール

あと、連合推論のサンプルを動かすときは、ヘルメット検出の大小モデルのイメージをビルドする必要がある(サンプルの build_image.sh スクリプトを実行する。これもあとで話す)ので、docker ce を入れておく。

清華ミラーで docker ce を入れる。公式ドキュメント:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

Docker もプロキシと国内ミラーを設定した方がいい。やり方は自分で検索してほしい。

参考記事