涅槃を目指す in はてな

人生に迷う様を書きます

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

KubernetesNode 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 なのはネットワーク設定を行っていないからだそうです・

今回はここまで!

お読みいただきありがとうございました!