Kubernetes the Hard Way on Azure : 9. ワーカーノード
こんにちは。
引き続き、Kubernetes the Hard Way on Azure を進めていきます。
9. Bootstrapping the Kubernetes Worker Nodes
このラボでは、3つのKubernetesワーカーノードをブートストラップします。
次のコンポーネントが各ノードにインストールされます:runc
container networking plugins
cri-containerd
kubelet
kube-proxy
今回はこの辺り。ワーカーノードは一気に構築します。
Prerequisites
このラボのコマンドは、各ワーカーインスタンス(worker-0、worker-1)で実行する必要があります。 Azure Instance Metadata Service を使用してカスタムプロパティを設定することはできません。各ワーカVMで タグ
を使用して、後で使用するPOD-CIDRを定義しました。
現在のコンピューティングインスタンスのPOD CIDR範囲を取得し、後で使用できるようにします。
az vm show -g kubernetes --name worker-0 --query "tags" -o tsv # 出力 10.200.0.0/24
Azコマンドを使用して各ワーカーインスタンスにログインし、パブリックIPとsshを見つけます。
WORKER=“worker-1" PUBLIC_IP_ADDRESS=$(az network public-ip show -g kubernetes \ -n ${WORKER}-pip --query "ipAddress" -otsv) ssh kuberoot@${PUBLIC_IP_ADDRESS}
Provisioning a Kubernetes Worker Node
※tmuxを使用して、複数のコンピューティングインスタンスで同時にコマンドを実行できます。詳細は 8.をご覧ください。
OSの依存関係をインストールします。Socatバイナリで kubectl port-forward
コマンドのサポートを有効化します。
{ sudo apt-get update sudo apt-get -y install socat conntrack ipset }
Download and Install Worker Binaries
ワーカーバイナリをダウンロードします。
wget -q --show-progress --https-only --timestamping \ https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.14.0/crictl-v1.14.0-linux-amd64.tar.gz \ https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc \ https://github.com/opencontainers/runc/releases/download/v1.0.0-rc8/runc.amd64\ https://github.com/containernetworking/plugins/releases/download/v0.8.1/cni-plugins-linux-amd64-v0.8.1.tgz \ https://github.com/containerd/containerd/releases/download/v1.2.7/containerd-1.2.7.linux-amd64.tar.gz \ https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl \ https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kube-proxy \ https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubelet
インストール用ディレクトリを作成します。
sudo mkdir -p \ /etc/cni/net.d \ /opt/cni/bin \ /var/lib/kubelet \ /var/lib/kube-proxy \ /var/lib/kubernetes \ /var/run/kubernetes
ワーカーバイナリをインストールします。
{ sudo mv runc.amd64 runc chmod +x kubectl kube-proxy kubelet runc runsc sudo mv kubectl kube-proxy kubelet runc runsc /usr/local/bin/ sudo tar -xvf crictl-v1.14.0-linux-amd64.tar.gz -C /usr/local/bin/ sudo tar -xvf cni-plugins-linux-amd64-v0.8.1.tgz -C /opt/cni/bin/ sudo tar -xvf containerd-1.2.7.linux-amd64.tar.gz -C / }
Configure CNI Networking
POD_CIDRをAzure VMタグから最初に取得したアドレスに置き換えて、bridge
ネットワーク構成ファイルを作成します。
POD_CIDR="$(echo $(curl --silent -H Metadata:true "http://169.254.169.254/metadata/instance/compute/tags?api-version=2017-08-01&format=text") | cut -d : -f2)" cat <<EOF | sudo tee /etc/cni/net.d/10-bridge.conf { "cniVersion": "0.2.0", "name": "bridge", "type": "bridge", "bridge": "cnio0", "isGateway": true, "ipMasq": true, "ipam": { "type": "host-local", "ranges": [ [{"subnet": "${POD_CIDR}"}] ], "routes": [{"dst": "0.0.0.0/0"}] } } EOF
loopback
ネットワーク構成ファイルを作成します。
cat <<EOF | sudo tee /etc/cni/net.d/99-loopback.conf { "cniVersion": "0.2.0", "name": "lo", "type": "loopback" } EOF
Configure containers
containerd
構成ファイルを作成します。
sudo mkdir -p /etc/containerd/ cat << EOF | sudo tee /etc/containerd/config.toml [plugins] [plugins.cri.containerd] snapshotter = "overlayfs" [plugins.cri.containerd.default_runtime] runtime_type = "io.containerd.runtime.v1.linux" runtime_engine = "/usr/local/bin/runc" runtime_root = "" [plugins.cri.containerd.untrusted_workload_runtime] runtime_type = "io.containerd.runtime.v1.linux" runtime_engine = "/usr/local/bin/runsc" runtime_root = "/run/containerd/runsc" [plugins.cri.containerd.gvisor] runtime_type = "io.containerd.runtime.v1.linux" runtime_engine = "/usr/local/bin/runsc" runtime_root = "/run/containerd/runsc" EOF
[containerd.service] systemd ユニットファイルを作成します。
cat <<EOF | sudo tee /etc/systemd/system/containerd.service [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target [Service] ExecStartPre=/sbin/modprobe overlay ExecStart=/bin/containerd Delegate=yes KillMode=process # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=infinity # Comment TasksMax if your systemd version does not supports it. # Only systemd 226 and above support this version. TasksMax=infinity [Install] WantedBy=multi-user.target EOF
Configure the Kubelet
使用するファイル群を必要な場所に配置します。
{ sudo mv ${HOSTNAME}-key.pem ${HOSTNAME}.pem /var/lib/kubelet/ sudo mv ${HOSTNAME}.kubeconfig /var/lib/kubelet/kubeconfig sudo mv ca.pem /var/lib/kubernetes/ }
[kubelet-config.yaml] 構成ファイルを作成します。
cat <<EOF | sudo tee /var/lib/kubelet/kubelet-config.yaml kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 authentication: anonymous: enabled: false webhook: enabled: true x509: clientCAFile: "/var/lib/kubernetes/ca.pem" authorization: mode: Webhook clusterDomain: "cluster.local" clusterDNS: - "10.32.0.10" podCIDR: "${POD_CIDR}" resolvConf: "/run/systemd/resolve/resolv.conf" runtimeRequestTimeout: "15m" tlsCertFile: "/var/lib/kubelet/${HOSTNAME}.pem" tlsPrivateKeyFile: "/var/lib/kubelet/${HOSTNAME}-key.pem" EOF
resolvConf
は、systemd-resolved
を実行しているシステムでのサービス検出にCoreDNSを使用する場合のループを回避するために使用されます。
[kubelet.service] 用systemd ユニットファイルを作成します。
cat <<EOF | sudo tee /etc/systemd/system/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 \\ --container-runtime=remote \\ --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \\ --image-pull-progress-deadline=2m \\ --kubeconfig=/var/lib/kubelet/kubeconfig \\ --network-plugin=cni \\ --register-node=true \\ --v=2 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF
Configure the Kubernetes Proxy
kubeconfig を移動します。
sudo mv kube-proxy.kubeconfig /var/lib/kube-proxy/kubeconfig
[kube-proxy-config.yaml] 構成ファイルを作成します。
cat <<EOF | sudo tee /var/lib/kube-proxy/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
[kube-proxy.service] 用systemd ユニットファイルを作成します。
cat <<EOF | sudo tee /etc/systemd/system/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
Start the Worker Services
いよいよワーカーサービスを起動します。
{ sudo systemctl daemon-reload sudo systemctl enable containerd kubelet kube-proxy sudo systemctl start containerd kubelet kube-proxy }
※ここまでの過程を全てのワーカーノードで実行してください。
Verification
いずれかのコントローラノードにログインします。
CONTROLLER="controller-0" PUBLIC_IP_ADDRESS=$(az network public-ip show -g kubernetes \ -n ${CONTROLLER}-pip --query "ipAddress" -otsv) ssh kuberoot@${PUBLIC_IP_ADDRESS}
登録されたKubernetes Node 一覧を表示します。
kubectl get nodes # 出力 NAME STATUS ROLES AGE VERSION worker-0 Ready <none> 2m32s v1.15.0 worker-1 Ready <none> 2m38s v1.15.0
無事に、2つのコンピュートインスタンスがワーカーノードとして登録されました!
Kubernetesらしくなってきた。
まとめ
* ワーカーノードに必要なコンポーネントをインストール
* runc
* container networking plugins
* containerd
* kubelet
* kube-proxy
10.に続きます。