ぐるっとぐりっど

日曜プログラマがいろいろ試してみたことを、後の自分のためにまとめておく場所

高可用性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ポートフォワーディングで確認。

f:id:grugrut:20190623142246p:plain

とりあえず今日のところはここまで

*1:動的メモリの設定してるので参考程度。これ書きながら確認したらマスタに3GiB割り当てられてた。