高可用性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割り当てられてた。