Skip to content

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の設定