実験環境:Debian GNU/Linux 12 (bookworm) x86_64
containerd のインストール
k8s を入れる前に、まずcontainerd をインストールする。kubeedge のエッジ側は containerd だけでよく、クラウド側は k8s が必要。
k8s インストール前の準備
トラフィック転送を設定する
iptables の設定をいじって、「br_netfilter」モジュールを有効にする。こうすると kubernetes がネットワークトラフィックを検査して転送できるようになる。
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 を切っていないマシンでは、クラスタは起動すらしなくなる。
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/
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 を新規作成して、中身はこう:
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] <https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt> kubernetes-xenial main
それから
sudo apt update
kubeadm、kubelet、kubectl のインストール
この3つのツールの役割は自分で調べてほしい。
sudo apt install kubeadm kubelet kubectl
自分はバージョンをピン止めしていない。ピン止めが必要なら、参考記事を読んでほしい。
インストール結果を確認:
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
このあと必要なイメージのバージョンを確認:
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
クラスタのコントロールプレーンを初期化する
- kubelet を起動し、ブート時にも動くようにする
sudo systemctl start kubelet
sudo systemctl enable kubelet
- デプロイ開始。ここでは root アカウントに切り替えた
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 などの設定にこのアドレスがそのまま入っていることが多く、あとから変えるとすごく面倒なので慎重に。
- ログの指示に従って kube config を設定する
自分のやり方は root の下でやること。あとで kubeedge をデプロイするとき、デフォルトの config ファイルは $HOME/.kube/config、つまり /root/.kube/config にある。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
ネットワークプラグインを入れる
k8s のネットワークプラグインについては自分で勉強してほしい。自分ももう少し勉強しないと...
ここでは元の参考記事と同じく Flannel を選ぶ。
Github からインストールファイル kube-flannel.yml を取ってきて、編集する:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
上の Network を、さっきクラスタ初期化で設定した pod 網段に合わせる:
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
最後に kubectl apply で入れる:
kubectl apply -f kube-flannel.yml
flannel 公式のやり方で直接やるのもあり
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 をデプロイしていたとき、まさにこの問題で時間を食った...
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 もプロキシと国内ミラーを設定した方がいい。やり方は自分で検索してほしい。
参考記事
- Kubernetes クラスタインストール(Debian 版):https://demonlee.tech/archives/2212002#移除-master-上的污点