Conohaのサーバーにkubernetesクラスターを構築する

2023年6月5日

conohaのVPSを契約したので、kubernetesの勉強も含めて構築してみようかなと思います。大分昔に記載したものでかなりざっくりとしたものになっているが、メモ程度に残しておこうと思う。

dockerとkubeadmのインストール

  • conohaサーバーに接続する
$ ssh conoha
  • docker インストールする
$ sudo apt-get update -y
$ sudo apt-get install -y docker.io
$ sudo systemctl enable docker.service

# 現在ログインしているユーザがdockerコマンドを実行できるようにしておく
$ sudo gpasswd -a "${USER}" docker
  • kubeadmインストール

こちらを参考

$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

kubeadmの初期化を行う

必要なツールのインストールが完了したら、kubeadmでクラスターの構築を行います。

  • スワップをオフにする (有効になっているとkubeadmを初期化できないため)
$ sudo swapoff -a
  • kubeadm を初期化する
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • kubernetesの設定を書き込む
$ mkdir -p $HOME/.kube
$ sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

ネットワークの設定をする

次にkubernetesのネットワーク設定を行います。FlannelでPod間ネットワークを構築します。

  • conohaでプライベートネットワークを設定する

こちらを参考に追加していきます。

追加後の設定
  • flannelをデプロイする
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml

マスターノードにPodを設定できるようにする

kubernetesではマスターノードとワーカーノードに分けますが、サーバーを1台しか借りていないので、全てマスターノードで管理するように設定します。

  • マスターノードにPodをスケジューリングできるように以下のコマンドを実行する
$ kubectl taint nodes --all node-role.kubernetes.io/master-

起動時にサービスが起動するように設定する

  • 起動時にkubernetesサービスが起動するようにする
$ sudo systemctl enable kubelet.service

動作確認

  • 簡単に動作確認を行います。
$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml
$ kubectl get deployment 
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           73s

正常にnginxがデプロイされていることがわかると思います。

その他

Podへのコネクションエラーが出た場合の対処法

  • pod取得したり、node取得した際に以下のようなエラーが出る場合
$ kubectl get pod -n manmaru
The connection to the server ***.**.**.**:6443 was refused - did you specify the right host or port?

ここ参考

  • 解決方法
  • dockerとkubeletのサービスを再起動してみる
$ sudo service docker restart
$ sudo systemctl restart kubelet

corednsのpodが起動しない場合の対処法

  • 全てのPODが正しく起動しているか確認する
-- corednsが「0/1」となっていて、起動できていない
$ kubectl get pods -o wide --all-namespaces
NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
kube-system   coredns-74ff55c5b-92lfg                0/1     Running   0          85s   10.244.0.2     111-11-11-11   <none>           <none>
kube-system   coredns-74ff55c5b-g7nbv                0/1     Running   0          85s   10.244.0.3     111-11-11-11   <none>           <none>
kube-system   etcd-111-11-11-11                      1/1     Running   0          92s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-apiserver-111-11-11-11            1/1     Running   0          92s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-controller-manager-111-11-11-11   1/1     Running   0          92s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-flannel-ds-amd64-kmjls            1/1     Running   0          49s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-proxy-gvkzm                       1/1     Running   0          85s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-scheduler-111-11-11-11            1/1     Running   0          92s   111.11.11.11   111-11-11-11   <none>
  • codednsのpodを確認する
$ kubectl describe pod coredns -n kube-system
$ kubectl logs coredns-74ff55c5b-92lfg -n kube-system
E0114 07:20:08.901219       1 reflector.go:178] pkg/mod/k8s.io/client-go@v0.18.3/tools/cache/reflector.go:125: Failed to list *v1.Endpoints: Get "<https://10.96.0.1:443/api/v1/endpoints?limit=500&resourceVersion=0>": dial tcp 10.96.0.1:443: connect: no route to host
  • kube-api-serverに接続ができていないと言うエラーが発生しているっぽい
dial tcp 10.96.0.1:443: connect: no route to host
  • 解決方法

解決策のリンク

  • IPTableの設定を初期化する
$ sudo systemctl stop kubelet
$ sudo systemctl stop docker
$ sudo iptables --flush
$ sudo iptables -tnat --flush
$ sudo systemctl start kubelet
$ sudo systemctl start docker
  • これでみてみると正しく起動されている
$ kubectl get pods -o wide --all-namespaces
NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE     IP             NODE           NOMINATED NODE   READINESS GATES
kube-system   coredns-74ff55c5b-hzj65                1/1     Running   0          105s    10.244.0.6     111-11-11-11   <none>           <none>
kube-system   coredns-74ff55c5b-zb7dg                1/1     Running   0          78s     10.244.0.7     111-11-11-11   <none>           <none>
kube-system   etcd-111-11-11-11                      1/1     Running   1          6m55s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-apiserver-111-11-11-11            1/1     Running   1          6m55s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-controller-manager-111-11-11-11   1/1     Running   1          6m55s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-flannel-ds-amd64-kmjls            1/1     Running   1          6m12s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-proxy-gvkzm                       1/1     Running   1          6m48s   111.11.11.11   111-11-11-11   <none>           <none>
kube-system   kube-scheduler-111-11-11-11            1/1     Running   1          6m55s   111.11.11.11   111-11-11-11   <none>           <none>

まとめ

これでconohaのVPSでkubernetesが構築できました。感想としては簡単にサクッとインストールできたという印象はなく、大分エラーと格闘しながら構築した気がします。構築した環境には個人的に作成したサービスをデプロイしたりと、現在でも運用を続けています。個人的には安価で構築できるので、勉強するには最適だと思います。サーバーのスペックが貧弱なので、そのうちスペックをあげるなり、masterノード、workerノードを分ける形にしていきたいなと思っています。