最初に
この記事は下記urlの続きである。
HA構成をする前にsingle controller構成を構築した。
この記事ではここまでに作成したconfigを書き換えて構築する。
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が構築できた。
参考