Ubuntu 22.04での高可用性Kubernetes v1.31.0構築手順
環境構成
| ホスト名 | IPアドレス | スペック |
|---|---|---|
| k8s-master01 | 192.168.10.101 | 4vCPU/4GB |
| k8s-master02 | 192.168.10.102 | 4vCPU/4GB |
| k8s-master03 | 192.168.10.103 | 4vCPU/4GB |
| lb01 | 192.168.10.104 | 4vCPU/4GB |
| lb02 | 192.168.10.105 | 4vCPU/4GB |
| VIP | 192.168.10.100 | - |
ロードバランサー構築
ネットワーク設定
静的IPアドレスの設定を行います。
cat > /etc/netplan/01-netcfg.yaml <<'EOF'
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.10.104/24
routes:
- to: default
via: 192.168.10.2
nameservers:
addresses:
- 223.5.5.5
- 114.114.114.114
EOF
HAProxyの導入
両方のロードバランサーサーバーにHAProxyをインストールします。
apt-get update && apt-get install -y keepalived haproxy psmisc
HAProxyの設定ファイルを作成します。
cat > /etc/haproxy/haproxy.cfg <<'EOF'
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend kube-api-fe
bind *:6443
mode tcp
option tcplog
default_backend kube-api-be
backend kube-api-be
mode tcp
balance roundrobin
option tcp-check
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server master-01 192.168.10.101:6443 check
server master-02 192.168.10.102:6443 check
server master-03 192.168.10.103:6443 check
EOF
設定ファイルの構文チェックとサービス起動を行います。
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl enable haproxy --now
Keepalivedの設定
プライマリロードバランサー(lb01)の設定:
cat > /etc/keepalived/keepalived.conf <<'EOF'
global_defs {
router_id K8S_LB_01
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script haproxy_check {
script "killall -0 haproxy"
interval 2
weight 20
}
vrrp_instance K8S_VIP {
state MASTER
interface ens33
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass k8s_ha_pass
}
unicast_src_ip 192.168.10.104
unicast_peer {
192.168.10.105
}
virtual_ipaddress {
192.168.10.100/24
}
track_script {
haproxy_check
}
}
EOF
セカンダリロードバランサー(lb02)の設定:
cat > /etc/keepalived/keepalived.conf <<'EOF'
global_defs {
router_id K8S_LB_02
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script haproxy_check {
script "killall -0 haproxy"
interval 2
weight 20
}
vrrp_instance K8S_VIP {
state BACKUP
interface ens33
virtual_router_id 60
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass k8s_ha_pass
}
unicast_src_ip 192.168.10.105
unicast_peer {
192.168.10.104
}
virtual_ipaddress {
192.168.10.100/24
}
track_script {
haproxy_check
}
}
EOF
Keepalivedサービスを起動します。
systemctl enable keepalived --now
Kubernetesマスターノードのデプロイ
共通設定スクリプト
全マスターノードで実行する初期化スクリプトを作成します。
#!/usr/bin/env bash
set -euo pipefail
K8S_VER="1.31.0"
K8S_BRANCH="v1.31"
VIP_ENDPOINT="192.168.10.100:6443"
# APTソースの設定
configure_apt_mirror() {
local codename=$(lsb_release -cs)
cp /etc/apt/sources.list /etc/apt/sources.list.bak
cat > /etc/apt/sources.list <<EOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename} main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-security main restricted universe multiverse
EOF
}
# カーネルパラメータの最適化
setup_sysctl() {
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.max_map_count = 262144
EOF
modprobe br_netfilter
echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
sysctl --system
}
# Swapの無効化
disable_swap() {
swapoff -a
sed -i '/swap/d' /etc/fstab
}
# Containerdのインストール
install_containerd() {
apt-get install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# systemd cgroupの有効化
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's|sandbox_image = .*|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"|' /etc/containerd/config.toml
# ミラーサイトの設定
sed -i 's#registry.k8s.io#registry.aliyuncs.com/google_containers#' /etc/containerd/config.toml
systemctl enable containerd --now
}
# Kubernetesコンポーネントのインストール
install_k8s_components() {
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_BRANCH}/deb/Release.key | \
gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_BRANCH}/deb/ /" > \
/etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubeadm=${K8S_VER}-1.1 kubelet=${K8S_VER}-1.1 kubectl=${K8S_VER}-1.1
}
# クラスターの初期化(最初のマスターノードのみ)
init_cluster() {
kubeadm init \
--kubernetes-version=${K8S_VER} \
--image-repository=registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=${VIP_ENDPOINT} \
--upload-certs
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# Flannelネットワークプラグインの適用
kubectl apply -f https://gitee.com/mirrors/flannel/raw/master/Documentation/kube-flannel.yml
}
# メイン処理
main() {
configure_apt_mirror
setup_sysctl
disable_swap
install_containerd
install_k8s_components
}
main "$@"
最初のマスターノードでの実行
bash k8s-setup.sh
kubeadm init \
--kubernetes-version=1.31.0 \
--image-repository=registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=192.168.10.100:6443 \
--upload-certs
追加マスターノードの参加
2台目、3台目のマスターノードで、まず証明書を転送します。
# ディレクトリの作成
mkdir -p /etc/kubernetes/pki/etcd $HOME/.kube
# 証明書の転送(master01から)
scp root@192.168.10.101:/etc/kubernetes/pki/ca.* /etc/kubernetes/pki/
scp root@192.168.10.101:/etc/kubernetes/pki/sa.* /etc/kubernetes/pki/
scp root@192.168.10.101:/etc/kubernetes/pki/front-proxy-ca.* /etc/kubernetes/pki/
scp root@192.168.10.101:/etc/kubernetes/pki/etcd/ca.* /etc/kubernetes/pki/etcd/
クラスターへ参加します。
kubeadm join 192.168.10.100:6443 \
--token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH> \
--control-plane
# kubeconfigの設定
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
ワーカーノードの参加
kubeadm join 192.168.10.100:6443 \
--token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
動作確認
etcdクラスタの状態確認
apt-get install -y etcd-client
ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
member list -w table
クラスター状態確認
kubectl get nodes -o wide
kubectl get pods -A
コマンド補完の設定
apt-get install -y bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc