8. ワーカーノードの構築
下記をインストールしてワーカーノードを構築します。
事前準備
設定ファイルを作成します。
cat << EOF > configs/99-loopback.conf
{
"cniVersion": "1.1.0",
"name": "lo",
"type": "loopback"
}
EOF
cat << EOF > configs/containerd-config.toml
version = 2
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
EOF
cat << EOF > configs/kube-proxy-config.yaml
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
clientConnection:
kubeconfig: "/var/lib/kube-proxy/kubeconfig"
mode: "iptables"
clusterCIDR: "10.200.0.0/16"
EOF
cat << EOF > configs/kubelet-config.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: "0.0.0.0"
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "/var/lib/kubelet/ca.crt"
authorization:
mode: Webhook
cgroupDriver: systemd
containerRuntimeEndpoint: "unix:///var/run/containerd/containerd.sock"
enableServer: true
failSwapOn: false
maxPods: 16
memorySwap:
swapBehavior: NoSwap
port: 10250
resolvConf: "/etc/resolv.conf"
registerNode: true
runtimeRequestTimeout: "15m"
tlsCertFile: "/var/lib/kubelet/kubelet.crt"
tlsPrivateKeyFile: "/var/lib/kubelet/kubelet.key"
EOF
mkdir configs/temp
cat << EOF > configs/temp/10-bridge.conf
{
"cniVersion": "1.0.0",
"name": "bridge",
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"ranges": [
[{"subnet": "SUBNET"}]
],
"routes": [{"dst": "0.0.0.0/0"}]
}
}
EOF
cat << EOF > units/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=/sbin/modprobe overlay
ExecStart=/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
EOF
cat << EOF > units/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service
[Service]
ExecStart=/usr/local/bin/kubelet \
--config=/var/lib/kubelet/kubelet-config.yaml \
--kubeconfig=/var/lib/kubelet/kubeconfig \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat << EOF > units/kube-proxy.service
[Unit]
Description=Kubernetes Kube Proxy
Documentation=https://github.com/kubernetes/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-proxy \
--config=/var/lib/kube-proxy/kube-proxy-config.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
バイナリファイルおよびsystemdユニットファイルをkube-w01、kube-w02にコピーします。
for HOST in kube-w01 kube-w02; do
SUBNET=$(grep ${HOST} machines.txt | cut -d " " -f 4)
sed "s|SUBNET|$SUBNET|g" configs/temp/10-bridge.conf > configs/10-bridge.conf
scp configs/10-bridge.conf configs/kubelet-config.yaml nob@${HOST}:~/
done
for HOST in kube-w01 kube-w02; do
scp \
downloads/worker/* \
downloads/client/kubectl \
configs/99-loopback.conf \
configs/containerd-config.toml \
configs/kube-proxy-config.yaml \
units/containerd.service \
units/kubelet.service \
units/kube-proxy.service \
nob@${HOST}:~/
done
for HOST in kube-w01 kube-w02; do
scp \
downloads/cni-plugins/* \
nob@${HOST}:~/cni-plugins/
done
ワーカーノードの設定
kube-w01、kube-w02それぞれで実行します。
export WORKER=kube-w0x
バイナリのインストール
OSの依存関係をインストールします。
ssh nob@${WORKER} "sudo apt update"
ssh nob@${WORKER} "sudo apt install -y socat conntrack ipset kmod"
スワップを無効にします。
ssh nob@${WORKER} "sudo swapoff -a"
インストールディレクトリを作成します。
ssh nob@${WORKER} "sudo mkdir -p \
/etc/cni/net.d \
/opt/cni/bin \
/var/lib/kubelet \
/var/lib/kube-proxy \
/var/lib/kubernetes \
/var/run/kubernetes"
ワーカーバイナリをインストールします。
ssh nob@${WORKER} "sudo mv crictl kube-proxy kubelet runc /usr/local/bin/"
ssh nob@${WORKER} "sudo mv containerd containerd-shim-runc-v2 containerd-stress /bin/"
ssh nob@${WORKER} "sudo mv cni-plugins/* /opt/cni/bin/"
CNIネットワークの設定
ブリッジネットワーク設定ファイルを配置します。
ssh nob@${WORKER} "sudo mv 10-bridge.conf 99-loopback.conf /etc/cni/net.d/"
カーネルモジュールをロードします。
ssh nob@${WORKER} "sudo modprobe br-netfilter"
ssh nob@${WORKER} "echo br-netfilter | sudo tee -a /etc/modules-load.d/modules.conf"
ssh nob@${WORKER} 'echo "net.bridge.bridge-nf-call-iptables = 1" | sudo tee -a /etc/sysctl.d/kubernetes.conf'
ssh nob@${WORKER} 'echo "net.bridge.bridge-nf-call-ip6tables = 1" | sudo tee -a /etc/sysctl.d/kubernetes.conf'
ssh nob@${WORKER} "sudo sysctl -p /etc/sysctl.d/kubernetes.conf"
containerdの設定
containerd設定ファイルを配置します。
ssh nob@${WORKER} "sudo mkdir -p /etc/containerd/"
ssh nob@${WORKER} "sudo mv containerd-config.toml /etc/containerd/config.toml"
ssh nob@${WORKER} "sudo mv containerd.service /etc/systemd/system/"
kubeletの設定
kubelet設定ファイルを配置します。
ssh nob@${WORKER} "sudo mv kubelet-config.yaml /var/lib/kubelet/"
ssh nob@${WORKER} "sudo mv kubelet.service /etc/systemd/system/"
kube-proxyの設定
kube-proxy設定ファイルを配置します。
ssh nob@${WORKER} "sudo mv kube-proxy-config.yaml /var/lib/kube-proxy/"
ssh nob@${WORKER} "sudo mv kube-proxy.service /etc/systemd/system/"
ワーカーノードの起動
各種サービスを起動します。それぞれのサービスが起動しているかを確認するにはsudo systemctl status xxxコマンドを実行してください。ログを表示する場合はjournalctl -u xxxコマンドを実行してください。
kube-w01、kube-w02それぞれで実行します。
export WORKER=kube-w0x
ssh nob@${WORKER} "sudo systemctl daemon-reload"
ssh nob@${WORKER} "sudo systemctl enable containerd kubelet kube-proxy"
ssh nob@${WORKER} "sudo systemctl start containerd kubelet kube-proxy"
動作確認
ワーカーノードが正常に起動、動作していることを確認します。
ssh nob@kube-c01 "kubectl get nodes --kubeconfig admin.kubeconfig"
$ ssh nob@kube-c01 "kubectl get nodes --kubeconfig admin.kubeconfig"
NAME STATUS ROLES AGE VERSION
kube-w01 Ready <none> 17s v1.32.3
kube-w02 Ready <none> 10s v1.32.3
次: kubectlの設定