KubernetesをalmalinuxでHA構成で構築する④ HA構成編

# 最初に
この記事は下記urlの続きである。
HA構成をする前にsingle controller構成を構築した。
この記事ではここまでに作成したconfigを書き換えて構築する。

https://qiita.com/nyahahanoha/items/a4f3d1f630d4504b60e0

# LBの構築
control nodeを分散させるためにHAProxyでLBを構築する。
これはload balancer nodeで実行する。
```
$ sudo vim /etc/selinux/config

SELINUX=disabled

$ sudo reboot
$ sudo firewall-cmd --add-port=6443/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo dnf install haproxy -y
$ sudo mv /etc/haproxy/haproxy.conf /etc/haproxy/haproxy.conf.default
$ sudo vim /etc/haproxy/haproxy.conf

 global
    log         127.0.0.1 local2 info
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     256
    user        haproxy
    group       haproxy
    daemon

defaults
    mode               tcp
    log                global
    option             tcplog
    timeout connect    10s
    timeout client     30s
    timeout server     30s

frontend k8s
    bind *:6443
    mode               tcp
    default_backend    k8s_backend

backend k8s_backend
    balance            roundrobin
    server             k8s-master1 <control node0のip>:6443 check
    server             k8s-master2 <control node1のip>:6443 check
    server             k8s-master3 <control node2のip>:6443 check

$ sudo systemctl enable --now haproxy
```

# kubernetesの構成の変更
これはcontrol nodeで実行する。
```
$ sudo rm -r .kube
$ sudo kubeadm reset
$ vim kubeadm-config.yml

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: <control nodeのip>
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: control-node0 # 自由に変更
  taints: null
  kubeletExtraArgs:
    node-ip: <control nodeのip>
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.29.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.2.0.0/16
  podSubnet: 10.1.0.0/16
scheduler: {}
controlPlaneEndpoint: <LBのip>:6443 # ここが追加されている。
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

$ sudo kubeadm init --config kubeadm-default.yml

#前回作成したflannelのconfigを読み込む
$ sudo kubeadm apply -f kubeadm-flannel.yml
```

# 他nodeの設定

control nodeでtokenやkeyの変更を行う。jj：w
これはcontrol nodeで行う。
```
$ sudo kubeadm token delete abcdef.0123456789abcdef
$ sudo kubeadm token create
<token>
$ sudo kubeadm init phase upload-certs --upload-certs
<certs>
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'
<hash>
```

## cotrol nodeのcluserへの参加
上記のcontrol node以外のcontrol nodeをclusterに参加させる。
```
$ vim kubeadm-config.yml

apiVersion: kubeadm.k8s.io/v1beta3
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: <load balancerのip>:6443
    token: <token>
    caCertHashes:
    - sha256:<hash>
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: <token>
kind: JoinConfiguration
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: control-node1 # 自由に変更
  taints: null
  kubeletExtraArgs:
    node-ip: <このnodeのip>
controlPlane:
  localAPIEndpint:
    advertiseAddress: <このnodeのip>
    bindPort: 6443
  certificateKey: <certs>

$ sudo kubeadm join --config kubeadm-config.yml
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

## worker nodeのcluserへの参加
すでに一度clusterに参加させたworker nodeでは下記を実行する。
```
$ sudo kubeadm reset
```

worker nodeをclusterに参加させる。
```
$ vim kubeadm-config.yml

apiVersion: kubeadm.k8s.io/v1beta3
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: <load balancerのip>:6443
    token: <token>
    caCertHashes:
    - sha256:<hash>
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: <token>
kind: JoinConfiguration
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: worker-node0 # 自由に変更
  taints: null
  kubeletExtraArgs:
    node-ip: <worker nodeのip>

$ sudo kubeadm join --config kubeadm-config.yml
```

これでHA構成のkubernetes clusterが構築できた。

# 参考
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/