実稼働環境用にローカルでKubernetes(k8s)クラスターをセットアップする場合は、高可用性でデプロイすることをお勧めします。高可用性とは、HAにKubernetesマスターノードまたはワーカーノードをインストールすることを意味します。この記事では、kubeadmユーティリティを使用して可用性の高いKubernetesクラスターをセットアップする方法を示します。
デモンストレーションのために、次の詳細を備えた5つのCentOS7システムを使用しました。
- k8s-master-1 –最小CentOS 7 – 192.168.1.40 – 2GB RAM、2vCPU、40GBディスク
- k8s-master-2 –最小CentOS 7 – 192.168.1.41 – 2GB RAM、2vCPU、40GBディスク
- k8s-master-3 –最小CentOS 7 – 192.168.1.42 – 2GB RAM、2vCPU、40GBディスク
- k8s-worker-1 –最小CentOS 7 – 192.168.1.43 – 2GB RAM、2vCPU、40GBディスク
- k8s-worker-2 –最小CentOS 7 – 192.168.1.44 – 2GB RAM、2vCPU、40GBディスク
注:etcdクラスターはマスターノードの外部で形成することもできますが、このために追加のハードウェアが必要になるため、マスターノードにetcdをインストールしました。
K8sクラスターの高可用性の最小要件を設定します。
- すべてのマスターノードとワーカーノードにKubeadm、kubelet、kubectlをインストールします
- マスターノードとワーカーノード間のネットワーク接続
- すべてのノードでのインターネット接続
- すべてのノードのルート資格情報またはsudo特権ユーザー
インストールと構成の手順はスキップしましょう。
手順1.ホスト名を設定し、/ etc / hostsファイルにエントリを追加します
hostnamectl
コマンドを実行して、各ノードにホスト名を設定します。たとえば、次の例はK8sマスターノードを示しています。
$ hostnamectl set-hostname "k8s-master-1"
$ exec bash
同様に、残りのノードで上記のコマンドを実行し、それぞれのホスト名を設定します。すべてのマスターノードと作業ノード/etc/hosts
にホスト名を設定した後、すべてのノードのファイルに次のエントリを追加します。
192.168.1.40 k8s-master-1
192.168.1.41 k8s-master-2
192.168.1.42 k8s-master-3
192.168.1.43 k8s-worker-1
192.168.1.44 k8s-worker-2
192.168.1.45 vip-k8s-master
haproxyを構成し、すべてのマスターノードで接続を維持するときにこのIPとホスト名を使用するため、hostsファイルで別のエントリ「192.168.1.45vip-k8s-master」を使用しました。このIPは、kube-apiserverロードバランサーIPとして使用されます。すべてのkube-apiserverリクエストはこのIPに到達し、リクエストはバックエンドの実際のkube-apiserverノードに配信されます。
手順2.すべてのマスター/ワーカーノードにKeepaliveとHAProxyをインストールして構成します
次のyum
コマンドを使用して、各マスターノードにkeepalivedとhaproxyをインストールします。
$ sudo yum install haproxy keepalived -y
まず、k8s-master-1でKeepalivedを構成します。作成check_apiserver.sh
スクリプトは、次のコンテンツを取得します。
[kadmin@k8s-master-1 ~]$ sudo vi /etc/keepalived/check_apiserver.sh
#!/bin/sh
APISERVER_VIP=192.168.1.45
APISERVER_DEST_PORT=6443
errorExit() {
echo "*** $*" 1>&2
exit 1
}
curl --silent --max-time 2 --insecure https://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET https://localhost:${APISERVER_DEST_PORT}/"
if ip addr | grep -q ${APISERVER_VIP}; then
curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"
fi
ファイルを保存して終了し、実行権限を設定します。
$ sudo chmod + x /etc/keepalived/check_apiserver.sh
keepalived.conf
ファイルをバックアップしてから、ファイルを空にします。
[kadmin@k8s-master-1 ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org
[kadmin@k8s-master-1 ~]$ sudo sh -c '> /etc/keepalived/keepalived.conf'
次に、以下を/etc/keepalived/keepalived.conf
ファイルに貼り付けます
[kadmin@k8s-master-1 ~]$ sudo vi /etc/keepalived/keepalived.conf
! /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 151
priority 255
authentication {
auth_type PASS
auth_pass P@##D321!
}
virtual_ipaddress {
192.168.1.45/24
}
track_script {
check_apiserver
}
}
ファイルを保存して閉じます。
注:マスター2および3ノードの場合、変更する必要があるのはこのファイルの2つのパラメーターのみです。マスターノード2と3のステータスは、SLAVE
それぞれ優先度254と253に変わります。
k8s-master-1ノードでHAProxyを構成し、その構成ファイルを編集して、次のコンテンツを追加します。
[kadmin@k8s-master-1 ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org
デフォルトセクションの後のすべての行を削除し、次の行を追加します
[kadmin@k8s-master-1 ~]$ sudo vi /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# apiserver frontend which proxys to the masters
#---------------------------------------------------------------------
frontend apiserver
bind *:8443
mode tcp
option tcplog
default_backend apiserver
#---------------------------------------------------------------------
# round robin balancing for apiserver
#---------------------------------------------------------------------
backend apiserver
option httpchk GET /healthz
http-check expect status 200
mode tcp
option ssl-hello-chk
balance roundrobin
server k8s-master-1 192.168.1.40:6443 check
server k8s-master-2 192.168.1.41:6443 check
server k8s-master-3 192.168.1.42:6443 check
ファイルを保存して終了します。
次に、これら3つのファイル(check_apiserver.sh、keepalived.conf、haproxy.cfg)をk8s-master-1からk8s-master-2および3にコピーします。
次のforループを実行して、これらのファイルscpをマスター2および3にコピーします。
[kadmin@k8s-master-1 ~]$ for f in k8s-master-2 k8s-master-3; do scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf root@$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg root@$f:/etc/haproxy; done
注:k8s-master-2および3について上記で説明したkeepalived.conf
ファイルの2つのパラメーターを変更することを忘れないでください。
ファイアウォールがマスターノードで実行されている場合は、3つのマスターノードすべてに次のファイアウォールルールを追加します
$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
$ sudo firewall-cmd --permanent --add-port=8443/tcp
$ sudo firewall-cmd --reload
次に、次のコマンドを使用して、3つのマスターノードすべてでkeepalivedサービスとhaproxyサービスを開始して有効にします。
$ sudo systemctl enable keepalived --now
$ sudo systemctl enable haproxy --now
これらのサービスが正常に開始されたら、keepalived構成ファイルでk8s-master-1をMASTERノードとしてマークしているため、k8s-master-1ノードでVIP(仮想IP)が有効になっているかどうかを確認してください。
上記の出力は、K8s-master-1でVIPが有効になっていることを確認しています。
手順3.スワップパーティションを無効にし、SELinuxをプライマリノードとセカンダリノードのアクセス許可ルールとファイアウォールルールとして設定します
すべてのノード(作業ノードを含む)のスワップスペースを無効にするには、次のコマンドを実行します。
$ sudo swapoff -a
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
すべてのマスターノードと作業ノードでSELinuxをPermissiveに設定し、次のコマンドを実行します。
$ sudo setenforce 0
$ sudo sed -i's / ^ SELINUX = enforcing $ / SELINUX = permissive /'/ etc / selinux / config
マスターノードのファイアウォールルール:
ファイアウォールがマスターノードで実行されている場合、次のポートがファイアウォールで許可されます
すべてのマスターノードで次のfirewall-cmdコマンドを実行します。
$ sudo firewall-cmd --permanent --add-port=6443/tcp
$ sudo firewall-cmd --permanent --add-port=2379-2380/tcp
$ sudo firewall-cmd --permanent --add-port=10250/tcp
$ sudo firewall-cmd --permanent --add-port=10251/tcp
$ sudo firewall-cmd --permanent --add-port=10252/tcp
$ sudo firewall-cmd --permanent --add-port=179/tcp
$ sudo firewall-cmd --permanent --add-port=4789/udp
$ sudo firewall-cmd --reload
$ sudo modprobe br_netfilter
$ sudo sh -c "echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables"
$ sudo sh -c "echo '1' > /proc/sys/net/ipv4/ip_forward"
作業ノードのファイアウォールルール:
ファイアウォールがワーカーノードで実行されている場合は、すべてのワーカーノードのファイアウォールで次のポートを許可します
すべてのワーカーノードで次のコマンドを実行します。
$ sudo firewall-cmd --permanent --add-port=10250/tcp
$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp
$ sudo firewall-cmd --permanent --add-port=179/tcp
$ sudo firewall-cmd --permanent --add-port=4789/udp
$ sudo firewall-cmd --reload
$ sudo modprobe br_netfilter
$ sudo sh -c "echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables"
$ sudo sh -c "echo '1' > /proc/sys/net/ipv4/ip_forward"
手順4.マスターノードとワーカーノードにContainerOperation(CRI)Dockerをインストールします
すべてのマスターノードとワーカーノードにDockerをインストールし、次のコマンドを実行します
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce -y
次のsystemctlコマンドを実行して、dockerサービスを開始して有効にします(すべてのマスターノードとワーカーノードでもこのコマンドを実行します)
$ sudo systemctl enable docker --now
それでは、次のステップでkubeadm、kubelet、kubectlをインストールしましょう。
手順5.Kubeadm、kubelet、およびkubectlをインストールします
すべてのプライマリノードとセカンダリノードにkubeadm、kubelet、およびkubectlをインストールします。これらのパッケージを最初にインストールする前に、Kubernetesリポジトリリポジトリを構成し、各マスターノードとワーカーノードで次のコマンドを実行する必要があります
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
次に、yumコマンドで実行して、これらのパッケージをインストールします
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
次のsystemctlコマンドを実行して、すべてのノード(マスターノードとワーカーノード)でkubeletサービスを有効にします。
$ sudo systemctl enable kubelet --now
手順6.最初のマスターノードからKubernetesクラスターを初期化します
次に、最初のマスターノードターミナルに移動して、次のコマンドを実行します
[kadmin@k8s-master-1 ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certs
上記のコマンドで--control-plane-endpoint
は、ロードバランサー(kube-apiserver)のdns名とポートが設定されています。私の場合、dns名は「vip-k8s-master」、ポートは「8443」です。ただし、この--upload-certs
オプションは自動的に設定されます。マスターノード間で証明書を共有します。
kubeadmコマンドの出力は次のとおりです。
上記の出力は、Kubernetesクラスターが正常に初期化されたことを確認します。出力では、他のマスターノードとワーカーノードがクラスターに参加するためのコマンドも取得しました。
注:後で参照できるように、この出力をテキストファイルにコピーすることをお勧めします。
次のコマンドを実行して、ローカルユーザーがkubectlコマンドを使用してクラスターと対話できるようにします。
[kadmin@k8s-master-1 ~]$ mkdir -p $HOME/.kube
[kadmin@k8s-master-1 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[kadmin@k8s-master-1 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
[kadmin@k8s-master-1 ~]$
それでは、ポッドネットワーク(CNIコンテナネットワークインターフェイス)をデプロイしましょう。私の場合は、calicoプラグインをポッドネットワークとしてデプロイします。kubectlコマンドに従って実行してください。
[kadmin@k8s-master-1 ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
ポッドネットワークが正常に展開されたら、残りの2つのマスターノードをクラスターに追加します。出力からマスターノードのコマンドをコピーしてクラスターに参加し、それをk8s-master-2とk8s-master-3に貼り付けるだけです。例を以下に示します。
[kadmin@k8s-master-2 ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5 --control-plane --certificate-key a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4
出力は次のとおりです。
上記の出力は、k8s-master-3も正常にクラスターに参加したことを確認します。kubectlコマンドからmaster-1ノードへのノードステータスを確認し、次のコマンドを実行してみましょう。
[kadmin@k8s-master-1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 31m v1.18.6
k8s-master-2 Ready master 10m v1.18.6
k8s-master-3 Ready master 3m47s v1.18.6
[kadmin@k8s-master-1 ~]$
完璧です。3つのマスターノードはすべて準備ができており、クラスターに参加しています。
手順7.ワーカーノードをKubernetesクラスターに参加させる
ワーカーノードをクラスターに参加させるには、ワーカーノードのコマンドを出力からコピーして、両方のワーカーノードに貼り付けます。例を以下に示します。
[kadmin@k8s-worker-1 ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5
[kadmin@k8s-worker-2 ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5
出力は次のとおりです。
次に、k8s-master-1ノードに移動し、kubectlコマンドで実行して、ステータスワーカーノードを取得します。
[kadmin@k8s-master-1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 43m v1.18.6
k8s-master-2 Ready master 21m v1.18.6
k8s-master-3 Ready master 15m v1.18.6
k8s-worker-1 Ready <none> 6m11s v1.18.6
k8s-worker-2 Ready <none> 5m22s v1.18.6
[kadmin@k8s-master-1 ~]$
上記の出力は、両方の作業ノードがクラスターに参加し、準備完了状態にあることを確認します。
次のコマンドを実行して、kube-system名前名での展開のステータスを確認します。
[kadmin@k8s-master-1 ~]$ kubectl get pods -n kube-system
ステップ8.Kubernetesクラスターの高可用性をテストします
ロードバランサーのdns名とポートを使用して、リモートコンピューター(CentOSシステム)からクラスターに接続してみましょう。まず、リモートコンピュータに、kubectlパッケージをインストールする必要があります。次のコマンドを実行して、kubernetesソフトウェアウェアハウスをセットアップします。
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
$ sudo yum install -y kubectl --disableexcludes=kubernetes
次に、/etc/host
ファイルに次のエントリを追加します。
192.168.1.45 vip-k8s-master
/etc/kubernetes/admin.conf
kubeディレクトリを作成し、ファイルをk8s-master-1ノードからにコピーします。$HOME/.kube/config
$ mkdir -p $HOME/.kube
$ scp [email protected]:/etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
次に、「kubectlgetnodes」コマンドを実行します。
[kadmin@localhost ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 3h5m v1.18.6
k8s-master-2 Ready master 163m v1.18.6
k8s-master-3 Ready master 157m v1.18.6
k8s-worker-1 Ready <none> 148m v1.18.6
k8s-worker-2 Ready <none> 147m v1.18.6
[kadmin@localhost ~]$
イメージ「nginx」を使用してnginx-labというデプロイメントを作成し、デプロイメントをタイプ「NodePort」のサービスとして公開してみましょう。
[kadmin@localhost ~]$ kubectl create deployment nginx-lab --image=nginx
deployment.apps/nginx-lab created
[kadmin@localhost ~]$
[kadmin@localhost ~]$ kubectl get deployments.apps nginx-lab
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-lab 1/1 1 1 59s
[kadmin@localhost ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-lab-5df4577d49-rzv9q 1/1 Running 0 68s
test-844b65666c-pxpkh 1/1 Running 3 154m
[kadmin@localhost ~]$
コピーを1から4に拡張してみましょう。次のコマンドを実行します。
[kadmin@localhost ~]$ kubectl scale deployment nginx-lab --replicas=4
deployment.apps/nginx-lab scaled
[kadmin@localhost ~]$
[kadmin@localhost ~]$ kubectl get deployments.apps nginx-lab
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-lab 4/4 4 4 3m10s
[kadmin@localhost ~]$
ここで、デプロイメントをサービスとして公開するには、次のコマンドを実行します。
[kadmin@localhost ~]$ kubectl expose deployment nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80
service/nginx-lab exposed
[kadmin@localhost ~]$
ポートの詳細を取得し、curlを使用してnginxWebサーバーにアクセスしてみてください
[kadmin@localhost ~]$ kubectl get svc nginx-lab
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-lab NodePort 10.102.32.29 <none> 80:31766/TCP 60s
[kadmin@localhost ~]$
nginx Webサーバーにアクセスするには、任意のマスターノードまたは作業ノードのIPとポートを「31766」として使用できます。
[kadmin@localhost ~]$ curl http://192.168.1.44:31766
出力は次のとおりです。
完璧です、これは深刻です。CentOS7サーバーにkubeadmを使用して、可用性の高いKubernetesクラスターを正常にデプロイしました。
著者:Pradeep Kumar翻訳者:Yue Yong
原文:https://www.linuxtechi.com/setup-highly-available-kubernetes-cluster-kubeadm