高可用性k8sクラスタをkubeadmで構築してみる
はじめに
最近コンテナに入学したので、おうちクラスタを作ってみることにした。PCのメモリ64Gまで増強したので仮想マシンばんばん建てる体力もあるし。
といいつつ、シングルマスタのクラスタは、昔はやったラズパイクラスタ作るときに体験済で、せっかくなのでマルチマスタクラスタを組んでみることにした。 苦労はしたけど、苦労したポイントが
- ドキュメントを右往左往させられる
- タイポしてた
が大半なので、ほぼドキュメントへのリンク集。
構成
同一WindowsマシンのHyper-V上の仮想マシンとして構築した
用途 | ホスト名 | OS | CPU | メモリ *1 |
---|---|---|---|---|
マスターノード | master01.mshome.net | Fedora 30 | 2コア | 2GiB |
master02.mshome.net | Fedora 30 | 2コア | 2GiB | |
master03.mshome.net | Fedora 30 | 2コア | 2GiB | |
コンピュートノード | node01.mshome.net | Fedora 30 | 4コア | 4GiB |
node02.mshome.net | Fedora 30 | 4コア | 4GiB | |
node03.mshome.net | Fedora 30 | 4コア | 4GiB | |
ロードバランサ | lb01.mshome.net | Fedora 30 | 2コア | 2GiB |
どこの設定か調べてないけど、mshome.netにするとホストのWindows機からも、追加設定なしに名前解決できて便利だったので、FQDNはそのように設定した。
インストール
仮想マシンの作成
Hyper-Vは仮想マシンの複製が、(簡単には)できないので、めんどくさい。
docker-ceのインストール
基本的にはドキュメントの通り。fedoraではyumのかわりにdnfが採用されて、基本的にyumコマンドが使えるのだけど、yum-utils
は使えないのでレポジトリ追加は、 yum-config-manager
のかわりに、
$ sudo dnf config-manager --add-repo url
とする必要がある。
Yum-utils package has been deprecated, use dnf instead. See 'man yum2dnf' for more information.
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. http://dummy
みたいな出力なので、docker-ceのrepoファイルがおかしいのかと思ってたら、そうではなかった。
master/computeの構築
ドキュメントのとおり。後述の問題のとおり、weaveを使う場合は、構築自体は完了するが、その後問題がおきるので要注意。
Creating Highly Available clusters with kubeadm - Kubernetes
ロードバランサの設定
apiをmasterに分散するために、ロードバランサが必要になる。今回はhaproxyを使った。 /etc/haproxy/haproxy.cfgに適当に設定書いた。
frontend k8s bind *:6443 mode tcp default_backend k8s backend k8s balance roundrobin mode tcp option tcp-check server master01 master01.mshome.net:6443 check server master02 master02.mshome.net:6443 check server master03 master03.mshome.net:6443 check
問題点
corednsが動かない
kubectl get podで見てみる、corednsだけが動いてない(きづかずkubernetes-dashboardもdeployしてから気付いた)
$ kubectl get all -n kube-system NAME READY STATUS RESTARTS AGE pod/coredns-5c98db65d4-phqkw 0/1 ContainerCreating 0 71m pod/coredns-5c98db65d4-tznld 0/1 ContainerCreating 0 71m pod/etcd-master01.mshome.net 1/1 Running 0 70m pod/etcd-master02.mshome.net 1/1 Running 0 32m pod/etcd-master03.mshome.net 1/1 Running 0 33m pod/kube-apiserver-master01.mshome.net 1/1 Running 0 70m pod/kube-apiserver-master02.mshome.net 1/1 Running 0 32m pod/kube-apiserver-master03.mshome.net 1/1 Running 0 33m pod/kube-controller-manager-master01.mshome.net 1/1 Running 1 70m pod/kube-controller-manager-master02.mshome.net 1/1 Running 0 32m pod/kube-controller-manager-master03.mshome.net 1/1 Running 0 33m pod/kube-proxy-kdfbj 1/1 Running 1 54m pod/kube-proxy-ndcdt 1/1 Running 1 55m pod/kube-proxy-qvpkr 1/1 Running 1 54m pod/kube-proxy-spwnw 1/1 Running 0 33m pod/kube-proxy-vhjtg 1/1 Running 0 32m pod/kube-proxy-vw4w5 1/1 Running 0 71m pod/kube-scheduler-master01.mshome.net 1/1 Running 1 70m pod/kube-scheduler-master02.mshome.net 1/1 Running 0 32m pod/kube-scheduler-master03.mshome.net 1/1 Running 0 33m pod/kubernetes-dashboard-7d75c474bb-9rp8z 0/1 ContainerCreating 0 28m pod/weave-net-5kf5b 2/2 Running 2 54m pod/weave-net-5rbgf 2/2 Running 2 55m pod/weave-net-69v4x 2/2 Running 2 54m pod/weave-net-bc4sb 2/2 Running 0 32m pod/weave-net-jql64 2/2 Running 0 59m pod/weave-net-k6d2h 2/2 Running 0 33m
より詳しく見てみるとこんな感じ
$ kubectl describe po coredns-5c98db65d4-phqkw -n kube-system Name: coredns-5c98db65d4-phqkw Namespace: kube-system Priority: 2000000000 Priority Class Name: system-cluster-critical Node: master01.mshome.net/192.168.112.71 Start Time: Sun, 23 Jun 2019 09:07:10 +0900 Labels: k8s-app=kube-dns pod-template-hash=5c98db65d4 Annotations: <none> Status: Pending IP: Controlled By: ReplicaSet/coredns-5c98db65d4 Containers: coredns: Container ID: Image: k8s.gcr.io/coredns:1.3.1 Image ID: Ports: 53/UDP, 53/TCP, 9153/TCP Host Ports: 0/UDP, 0/TCP, 0/TCP Args: -conf /etc/coredns/Corefile State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Limits: memory: 170Mi Requests: cpu: 100m memory: 70Mi Liveness: http-get http://:8080/health delay=60s timeout=5s period=10s #success=1 #failure=5 Readiness: http-get http://:8080/health delay=0s timeout=1s period=10s #success=1 #failure=3 Environment: <none> Mounts: /etc/coredns from config-volume (ro) /var/run/secrets/kubernetes.io/serviceaccount from coredns-token-kwrq4 (ro) Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: config-volume: Type: ConfigMap (a volume populated by a ConfigMap) Name: coredns Optional: false coredns-token-kwrq4: Type: Secret (a volume populated by a Secret) SecretName: coredns-token-kwrq4 Optional: false QoS Class: Burstable Node-Selectors: beta.kubernetes.io/os=linux Tolerations: CriticalAddonsOnly node-role.kubernetes.io/master:NoSchedule node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 60m (x11 over 74m) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. Normal Scheduled 60m default-scheduler Successfully assigned kube-system/coredns-5c98db65d4-phqkw to master01.mshome.net Warning FailedCreatePodSandBox 60m kubelet, master01.mshome.net Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "cfeba2e58c4cbca0af13ce92e804804077f336ca4f5f11bfb8aca05f1822164a" network for pod "coredns-5c98db65d4-phqkw": NetworkPlugin cni failed to set up pod "coredns-5c98db65d4-phqkw_kube-system" network: failed to find plugin "loopback" in path [/opt/cni/bin], failed to clean up sandbox container "cfeba2e58c4cbca0af13ce92e804804077f336ca4f5f11bfb8aca05f1822164a" network for pod "coredns-5c98db65d4-phqkw": NetworkPlugin cni failed to teardown pod "coredns-5c98db65d4-phqkw_kube-system" network: failed to find plugin "portmap" in path [/opt/cni/bin]] Normal SandboxChanged 5m29s (x257 over 60m) kubelet, master01.mshome.net Pod sandbox changed, it will be killed and re-created. Normal SandboxChanged 15s (x12 over 2m20s) kubelet, master01.mshome.net Pod sandbox changed, it will be killed and re-created.
failed to find plugin "portmap" in path [/opt/cni/bin]
とあるので、そうなんでしょう、と調べてみると、今回使った(ドキュメントどおりにやってくと導入される)CNIは、weave netなんだけど、これはportmapが不要なので導入しても一緒には入らないので、必要なら自分で入れろ、ということのようだ。
https://www.weave.works/docs/net/latest/kubernetes/kube-addon/
バイナリダウンロードしてきて配置して無事起動した(正確には、loopbackも必要だった)
ダッシュボード
デフォルトではWebUIは存在せず、cliだけなので、ダッシュボードを入れた
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
NodePortかなんか使えば外から見れると思うけど、一旦,kubectl proxyして、sshポートフォワーディングで確認。
とりあえず今日のところはここまで
*1:動的メモリの設定してるので参考程度。これ書きながら確認したらマスタに3GiB割り当てられてた。