本番環境向けKubernetesクラスター構築:マスターノードの高可用性構成ガイド

Ubuntu 22.04での高可用性Kubernetes v1.31.0構築手順

環境構成

ホスト名IPアドレススペック
k8s-master01192.168.10.1014vCPU/4GB
k8s-master02192.168.10.1024vCPU/4GB
k8s-master03192.168.10.1034vCPU/4GB
lb01192.168.10.1044vCPU/4GB
lb02192.168.10.1054vCPU/4GB
VIP192.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

タグ: Kubernetes HAProxy Keepalived etcd Ubuntu

10月15日 04:22 投稿