Kubernetes(k8s)をセットアップするとき 実稼働環境用にオンプレミスのクラスターを作成する場合は、高可用性でデプロイすることをお勧めします。ここでの高可用性とは、HAにKubernetesマスターまたはコントロールプレーンをインストールすることを意味します。この記事では、kubeadmユーティリティを使用してHA(高可用性)でKubernetes(k8s)クラスターをセットアップする方法を示します。
デモンストレーションでは、次の詳細を含む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をインストールしています。
HighlyK8sクラスターをセットアップするための最小要件
- Kubeadmをインストールします 、クベレット およびkubectl すべてのマスターノードとワーカーノードで
- マスターノードとワーカーノード間のネットワーク接続
- すべてのノードでのインターネット接続
- すべてのノードのrootクレデンシャルまたはsudo権限ユーザー
インストールと構成の手順に進みましょう
ステップ1)ホスト名を設定し、/ etc/hostsファイルにエントリを追加します
hostnamectlコマンドを実行して、各ノードにホスト名を設定します。k8s-master-1ノードの例を示します。
$ 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
ホストファイルで1つの追加エントリ「192.168.1.45vip-k8s-master」を使用しました。これは、haproxyとキープアライブをすべてのマスターノードで構成するときにこのIPとホスト名を使用するためです。この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スクリプトを作成すると次のコンテンツが作成されます
[[email protected] ~]$ 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ファイルのバックアップを取り、ファイルを切り捨てます。
[[email protected] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org [[email protected] ~]$ sudo sh -c '> /etc/keepalived/keepalived.conf'
次に、次の内容を/etc/keepalived/keepalived.confファイルに貼り付けます
[[email protected] ~]$ 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 [email protected]##D321! } virtual_ipaddress { 192.168.1.45/24 } track_script { check_apiserver } }
ファイルを保存して閉じます。
注: マスター2および3ノードでは、このファイルの2つのパラメーターのみを変更する必要があります。 州 SLAVEになります マスター2と3の場合、優先順位はそれぞれ254と253になります。
k8s-master-1ノードでHAProxyを構成し、その構成ファイルを編集して、次のコンテンツを追加します。
[[email protected] ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org
デフォルトセクションの後のすべての行を削除し、次の行を追加します
[[email protected] ~]$ 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ループを実行して、これらのファイルをマスター2および3にscpします
[[email protected] ~]$ for f in k8s-master-2 k8s-master-3; do scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [email protected]$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg [email protected]$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
これらのサービスが正常に開始されたら、キープアライブ構成ファイルで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)マスターノードとワーカーノードにContainer Run Time(CRI)Dockerをインストールする
すべてのマスターノードとワーカーノードにDocker(Container Run Time)をインストールし、次のコマンドを実行します。
$ 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クラスターを初期化します
次に、最初のマスターノード/コントロールプレーンに移動して、次のコマンドを発行します。
[[email protected] ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certs
上記のコマンドで、 –control-plane-endpoint ロードバランサー(kube-apiserver)のDNS名とポートを設定します。私の場合、この「 –upload-certs 」とは別に、DNS名は「vip-k8s-master」、ポートは「8443」です。 ’オプションは、マスターノード間で証明書を自動的に共有します
kubeadmコマンドの出力は次のようになります。
上記の出力は、Kubernetesクラスターが正常に初期化されたことを示しています。出力では、他のマスターノードとワーカーノードがクラスターに参加するためのコマンドも取得しました。
注: 後で参照できるように、この出力をテキストファイルにコピーすることをお勧めします。
次のコマンドを実行して、ローカルユーザーがkubectlコマンドを使用してクラスターと対話できるようにします。
[[email protected] ~]$ mkdir -p $HOME/.kube [[email protected] ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [[email protected] ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config [[email protected] ~]$
それでは、ポッドネットワーク(CNI – Container Network Interface)をデプロイしましょう。私の場合、calicoアドオンをポッドネットワークとしてデプロイし、kubectlコマンドに従って実行します
[[email protected] ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
ポッドネットワークが正常に展開されたら、残りの2つのマスターノードをクラスターに追加します。マスターノードのコマンドをコピーして出力からクラスターに参加させ、k8s-master-2とk8s-master-3に貼り付けるだけです。例を以下に示します
[[email protected] ~]$ 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でも同じコマンドを実行します
[[email protected] ~]$ 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ノードに移動して、以下のコマンドを実行してみましょう。
[[email protected] ~]$ 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 [[email protected] ~]$
完璧です。3つのマスタープレーンノードまたはコントロールプレーンノードすべての準備が整い、クラスターに参加します。
ステップ7)ワーカーノードをKubernetesクラスターに参加させる
ワーカーノードをクラスターに参加させるには、ワーカーノードのコマンドを出力からコピーして両方のワーカーノードに貼り付けます。例を以下に示します。
[[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5 [[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5
出力は次のようになります:
次に、k8s-master-1ノードに移動し、kubectlコマンドの下で実行して、ステータスワーカーノードを取得します。
[[email protected] ~]$ 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 [[email protected] ~]$
上記の出力は、両方のワーカーもクラスターに参加しており、準備完了状態にあることを確認しています。
以下のコマンドを実行して、kube-system名前空間にデプロイされているステータスインフラポッドを確認します。
[[email protected] ~]$ 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
kubeディレクトリを作成し、/ etc / kubernetes/admin.confファイルを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」コマンドを実行します
[[email protected] ~]$ 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 [[email protected] ~]$
nginx-labという名前のデプロイを作成しましょう 画像「nginx ’次に、このデプロイメントをタイプ「 NodePort」のサービスとして公開します 」
[[email protected] ~]$ kubectl create deployment nginx-lab --image=nginx deployment.apps/nginx-lab created [[email protected] ~]$ [[email protected] ~]$ kubectl get deployments.apps nginx-lab NAME READY UP-TO-DATE AVAILABLE AGE nginx-lab 1/1 1 1 59s [[email protected] ~]$ 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 [[email protected] ~]$
レプリカを1から4にスケーリングしてみましょう。次のコマンドを実行します、
[[email protected] ~]$ kubectl scale deployment nginx-lab --replicas=4 deployment.apps/nginx-lab scaled [[email protected] ~]$ [[email protected] ~]$ kubectl get deployments.apps nginx-lab NAME READY UP-TO-DATE AVAILABLE AGE nginx-lab 4/4 4 4 3m10s [[email protected] ~]$
次に、デプロイメントをサービスとして公開し、実行します
[[email protected] ~]$ kubectl expose deployment nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80 service/nginx-lab exposed [[email protected] ~]$
ポートの詳細を取得し、curlを使用してnginxWebサーバーにアクセスしてみてください
[[email protected] ~]$ 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 [[email protected] ~]$
nginx Webサーバーにアクセスするには、マスターノードまたはワーカーノードのIPとポートを「31766」として使用できます
[[email protected] ~]$ curl http://192.168.1.44:31766
出力は次のようになります:
完璧です。これは、CentOS7サーバーにkubeadmを使用した高可用性Kubernetesクラスターのデプロイに成功したことを示しています。貴重なフィードバックやコメントをお気軽に共有してください。
また読む :KubernetesでNGINXIngressControllerを設定する方法