Conohaのサーバーにkubernetesクラスターを構築する
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ノードを分ける形にしていきたいなと思っています。