Kubernetes The Hard Way On VirtualBox 7日目
Kubernetesを雰囲気で使わないための修行Kubernetes The Hard Way On VirtualBoxの7日目。
今日はKubernetes のWorker Nodeを作成します。だいぶ来てますね。
Bootstrapping the Kubernetes Worker Nodes
今回はDockerがすでにインストールされたworkerノードにセットアップをしていきます。
以下のコンポーネントをインストールします。
- kubelet
- kube-proxy
Prerequisites
証明書や設定は master-1
ノードで作成し、 scp
を使ってworkerノードに転送します。
それが終わるとworker-1
でコマンドを実行します。worker-1
にはSSHターミナルを使ってログインします。
Provisioning Kubelet Client Certificates
Kubernetesは Node Authorizer
と呼ばれる認証モードを使います。これはKubeletsからのAPIリクエストを認証します。
Node Authorizer
に認証されるために、Kubeletsはsystem:node:<nodeName>
のユーザ名でsystem:nodes
グループにあることを識別する資格情報を使用する必要があります。
このセクションでは、Node Authorizer
の要件を満たす証明書を、Kubernetesワーカーノードごとに作成します。
1つのworkerノード用に証明書と秘密鍵を作成します。
master-1
で実行します。
cat > openssl-worker-1.cnf <<EOF [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = worker-1 IP.1 = 192.168.5.21 EOF
openssl genrsa -out worker-1.key 2048 openssl req -new -key worker-1.key -subj "/CN=system:node:worker-1/O=system:nodes" -out worker-1.csr -config openssl-worker-1.cnf openssl x509 -req -in worker-1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out worker-1.crt -extensions v3_req -extfile openssl-worker-1.cnf -days 1000
以下のファイルが作成されます。
worker-1.key worker-1.crt
The kubelet Kubernetes Configuration File
Kubelets用のkubeconfigファイルを生成する際には、Kubeletsのノード名に一致するクライアント証明書を使用する必要があります。
これにより、Kubernetes Node AuthorizerによってKubeletsが適切に認証されるようになります。
kub-api server load-balancer IP を設定
LOADBALANCER_ADDRESS=192.168.5.30
最初のワーカーノード用の kubeconfig ファイルを作成します。
master-1
で行います。
{ kubectl config set-cluster kubernetes-the-hard-way \ --certificate-authority=ca.crt \ --embed-certs=true \ --server=https://${LOADBALANCER_ADDRESS}:6443 \ --kubeconfig=worker-1.kubeconfig kubectl config set-credentials system:node:worker-1 \ --client-certificate=worker-1.crt \ --client-key=worker-1.key \ --embed-certs=true \ --kubeconfig=worker-1.kubeconfig kubectl config set-context default \ --cluster=kubernetes-the-hard-way \ --user=system:node:worker-1 \ --kubeconfig=worker-1.kubeconfig kubectl config use-context default --kubeconfig=worker-1.kubeconfig }
以下のファイルが作成されます
worker-1.kubeconfig
Copy certificates, private keys and kubeconfig files to the worker node:
master-1
で行います。
scp ca.crt worker-1.crt worker-1.key worker-1.kubeconfig worker-1:~/
Download and Install Worker Binaries
以下のコマンドは全て worker-1
ノードで行います
wget -q --show-progress --https-only --timestamping \ https://storage.googleapis.com/kubernetes-release/release/v1.22.0/bin/linux/amd64/kubectl \ https://storage.googleapis.com/kubernetes-release/release/v1.22.0/bin/linux/amd64/kube-proxy \ https://storage.googleapis.com/kubernetes-release/release/v1.22.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
落としたバイナリをインストールします
{ chmod +x kubectl kube-proxy kubelet sudo mv kubectl kube-proxy kubelet /usr/local/bin/ }
Configure the Kubelet
worker-1
ノードで行います
{ sudo mv ${HOSTNAME}.key ${HOSTNAME}.crt /var/lib/kubelet/ sudo mv ${HOSTNAME}.kubeconfig /var/lib/kubelet/kubeconfig sudo mv ca.crt /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.crt" authorization: mode: Webhook clusterDomain: "cluster.local" clusterDNS: - "10.96.0.10" resolvConf: "/run/systemd/resolve/resolv.conf" runtimeRequestTimeout: "15m" EOF
kubelet.service
というsystemd unit file を作成します
cat <<EOF | sudo tee /etc/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/kubernetes/kubernetes After=docker.service Requires=docker.service [Service] ExecStart=/usr/local/bin/kubelet \\ --config=/var/lib/kubelet/kubelet-config.yaml \\ --image-pull-progress-deadline=2m \\ --kubeconfig=/var/lib/kubelet/kubeconfig \\ --tls-cert-file=/var/lib/kubelet/${HOSTNAME}.crt \\ --tls-private-key-file=/var/lib/kubelet/${HOSTNAME}.key \\ --network-plugin=cni \\ --register-node=true \\ --v=2 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF
Configure the Kubernetes Proxy
worker-1
ノードで行います
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: "192.168.5.0/24" EOF
kube-proxy.service
というsystemd unit file を作成します
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
worker-1
ノードで行います
{ sudo systemctl daemon-reload sudo systemctl enable kubelet kube-proxy sudo systemctl start kubelet kube-proxy }
起動確認ヨシ!
agrant@worker-1:~$ sudo systemctl status kubelet ● kubelet.service - Kubernetes Kubelet Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2021-10-19 14:46:31 UTC; 7s ago Docs: https://github.com/kubernetes/kubernetes Main PID: 17678 (kubelet) Tasks: 10 (limit: 546) CGroup: /system.slice/kubelet.service └─17678 /usr/local/bin/kubelet --config=/var/lib/kubelet/kubelet-config.yaml --imag Oct 19 14:46:32 worker-1 kubelet[17678]: I1019 14:46:32.529456 17678 plugin_manager.go:112] Oct 19 14:46:32 worker-1 kubelet[17678]: I1019 14:46:32.529548 17678 plugin_manager.go:114] Oct 19 14:46:32 worker-1 kubelet[17678]: I1019 14:46:32.531274 17678 container_manager_linux Oct 19 14:46:32 worker-1 kubelet[17678]: E1019 14:46:32.531536 17678 eviction_manager.go:255 Oct 19 14:46:32 worker-1 kubelet[17678]: I1019 14:46:32.569573 17678 kubelet_node_status.go: Oct 19 14:46:33 worker-1 kubelet[17678]: I1019 14:46:33.142328 17678 apiserver.go:52] "Watch Oct 19 14:46:33 worker-1 kubelet[17678]: I1019 14:46:33.345623 17678 kubelet.go:2053] "SyncL Oct 19 14:46:33 worker-1 kubelet[17678]: I1019 14:46:33.419185 17678 reconciler.go:157] "Rec Oct 19 14:46:37 worker-1 kubelet[17678]: I1019 14:46:37.113377 17678 cni.go:239] "Unable to Oct 19 14:46:37 worker-1 kubelet[17678]: E1019 14:46:37.549652 17678 kubelet.go:2332] "Conta vagrant@worker-1:~$ sudo systemctl status kube-proxy ● kube-proxy.service - Kubernetes Kube Proxy Loaded: loaded (/etc/systemd/system/kube-proxy.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2021-10-19 14:46:31 UTC; 14s ago Docs: https://github.com/kubernetes/kubernetes Main PID: 17679 (kube-proxy) Tasks: 5 (limit: 546) CGroup: /system.slice/kube-proxy.service └─17679 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/kube-proxy-config.ya Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.938378 17679 conntrack.go:83] Set Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.958640 17679 conntrack.go:100] Se Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.958971 17679 conntrack.go:100] Se Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.963801 17679 config.go:315] Start Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.964052 17679 shared_informer.go:2 Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.964153 17679 config.go:224] Start Oct 19 14:46:32 worker-1 kube-proxy[17679]: I1019 14:46:32.964241 17679 shared_informer.go:2 Oct 19 14:46:32 worker-1 kube-proxy[17679]: E1019 14:46:32.991244 17679 event_broadcaster.go Oct 19 14:46:33 worker-1 kube-proxy[17679]: I1019 14:46:33.064980 17679 shared_informer.go:2 Oct 19 14:46:33 worker-1 kube-proxy[17679]: I1019 14:46:33.065520 17679 shared_informer.go:2 vagrant@worker-1:~$
Verification
master-1
ノードで行います
登録されたKubernetesノードをマスターノードから確認
kubectl get nodes --kubeconfig admin.kubeconfig
以下のように出力されればおK
vagrant@master-1:~$ kubectl get nodes --kubeconfig admin.kubeconfig NAME STATUS ROLES AGE VERSION worker-1 NotReady <none> 78s v1.22.0
NotReady
なのはネットワーク設定を行っていないからだそうです・
今回はここまで!
お読みいただきありがとうございました!