[クラウドネイティブ] バイナリ k8s クラスター (下) は高可用性マスター ノードを展開します

 この展開の手順

 前回の記事でバイナリk8sクラスタのデプロイは完了しましたが、スタンドアロンマスタは実際のエンタープライズでの利用には適していません(スタンドアロンマスタではノードサーバのディスパッチコマンドとしてマスタが1つしか使用されていないため、一度ダウンするとクラスタ全体が麻痺することを意味するため、成熟したk8sクラスタではマスタの高可用性を考慮する必要があります。エンタープライズアプリケーションには通常少なくとも2つ以上のマスタが必要です。追加を繰り返す手順を追加します)。マスターを追加した後、keepalived+nginx アーキテクチャを使用して高可用性マスターを実現します [haproxy+keepalived または keepalived+lvs を使用することもできます (手順が複雑すぎるため、推奨されません)]

さらに、k8sのui管理インターフェースも構築します。

この展開のアーキテクチャ コンポーネント 

 

アーキテクチャの説明:

ノードノードのkubeletは1つのマスターノードのapiserverにのみ接続でき、複数のマスターノードのapiserverに同時に接続することはできません。つまり、ノード セクションは、それを率いるマスターを 1 人だけ持つことができます。

Kubelet と kube-proxy は、kubelet.kubeconfig ファイルと kube-proxy.kubeconfig ファイルのサーバー パラメーターを介してマスター ノードに接続します。

そのため、複数のマスターノードが存在する環境では、スケジューリングにnginxロードバランサーが必要となり、マスターノードの障害によりk8sクラスター全体が利用できなくなることを防ぐため、キープアライブによる高可用性構築(マスター/スレーブ2ノード)が必要となります。
 

 1. 新しいマスターノードの構築

 

 1.1 master02の初期設定

conf << EOF #ブリッジ モードを有効にします。これにより、ブリッジのトラフィックを iptables チェーンに渡すことができます。



 



 



 










 



net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#Close ipv6 プロトコル
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
 
sysctl --system
 
 
#time synchronization
yum install ntpdate -y
ntpdate ntp.aliyun.com
 
#time 同期ronization 操作がスケジュールされたタスクに追加され、すべてのノードで時刻同期が保証されるようになります。 crontab
-e
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
crontab -l
 

 1.2 master01の設定をmaster02に移行する

 ##--------------- 1. Master01 ノード、ファイルを master02 にコピー ----------------------------- #
 証明書ファイル、各マスターコンポーネントの設定ファイル、サービス管理ファイルを master01 ノードから master02 ノードにコピー
 scp -r /opt/etcd/ [email protected]:/opt/ scp -r
 /opt/kubernetes/ [email protected] 0:/opt/ scp /usr/ lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service [email protected]:/usr/lib/systemd/system
 /
 scp -r /root/.kube/ master02:/root
 /

 ##----------- 2、 master02节点,修改配置文件并启动相关服务-------------------------
 
 #修改配置文件kube-apiserver中的IP
 vim /opt/kubernetes/cfg/kube-apiserver
 KUBE_APISERVER_OPTS="--logtostderr=true \        #输出日志,false表示标准错误不输出到屏幕,而是输出到日志中。true表示标准错误会输出到屏幕。
 --v=4 \                                          #日志级别
 --etcd-servers=https://192.168.73.105:2379,https://192.168.73.106:2379,https://192.168.73.107:2379 \      #etcd节点的IP通信地址
 --bind-address=192.168.73.110 \              #修改,当前绑定的内网IP监听的地址
 --secure-port=6443 \                                                                #基于HPPTS开放端口
 --advertise-address=192.168.73.110 \         #修改,内网通告地址,让其他node节点地址通信
 ......
 ​
 #在 master02 节点上启动各服务并设置开机自启
 systemctl enable --now kube-apiserver.service
 systemctl enable --now kube-controller-manager.service
 systemctl enable --now kube-scheduler.service
 ​
 #将可执行文件,创建软链接
 ln -s /opt/kubernetes/bin/* /usr/local/bin/
 ​
 #查看node节点状态
 kubectl get nodes
 kubectl get nodes -o wide           #-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
 #此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来

2. ロードバランシングの導入

 #配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
 ​
 #----------------- 1、两台负载均衡器配置nginx -------------------------------------
 ​
 #配置nginx的官方在线yum源,配置本地nginx的yum源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF
 ​
 yum install nginx -y
 ​
 #修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
 vim /etc/nginx/nginx.conf
 events {
     worker_connections  1024;
 }
 ​
 #添加
 stream {
     log_format main '$remote_addr $upstream_addr - [$time_local] $status 
     $upstream_bytes_sent';
     
     access_log /var/log/nginx/k8s-access.log main;
 アップストリーム
     k8s-apiserver {          サーバー 192.168.73.105:6443; #master01サーバー          192.1 68.73.110:6443; # master02      }      server {          listen 6443;          proxy_pass k8s-apiserver;      }  }  http  {  ......  #    設定ファイルの構文を確認します  nginx -t    #  nginx サービスを  開始  start nginx  systemctl Enable nginx  ss -lntp|grep nginx 



















  

 ​
 ​

 

 #--------------- 2. 2 つのロード バランサーで keepalived を構成する ----------------------------


 ​
 #部署keepalived服务
 yum install keepalived -y
 ​
 #修改keepalived配置文件
 vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   router_id nginx_master
}
 
vrrp_script check_nginx {
   script "/etc/nginx/check_nginx.sh"   #指定检测脚本的路径,并且该脚本充当心跳检测脚本
}
 
vrrp_instance VI_1 {
    state MASTER        #指定状态为master节点,109为BACKUP备用节点
    interface ens33
    virtual_router_id 51
    priority 100    #108优先级为100 109为90,优先级决定着主备的位置
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.73.66
    }
    track_script {
     check_nginx        #追踪脚本的进程
    }
}
 
#将该文件 发送给备用调度器,并且将其中的配置修改为备用调度器的属性
cd /etc/keepalived/
scp keepalived.conf  [email protected]:`pwd`
 ​
 ​
#创建nginx状态检查脚本 
vim /etc/nginx/check_nginx.sh
 
#!/bin/bash
killall -0 nginx &>/dev/null
if [ $? -ne 0 ];then
  systemctl stop keepalived
fi
 
 ​
 chmod +x /etc/nginx/check_nginx.sh  #为脚本增加执行权限
 
#将该脚本发送给备用调度器
cd /etc/nginx
scp check_nginx.conf  [email protected]:`pwd`
 
 
 
 ​
 #2 つのアクティブおよびスタンバイ スケジューラーが keepalived サービスを開始します (最初に nginx サービスを開始し、次に keepalived サービスを開始する必要があります)
 systemctl start keepalived
 systemctl enable keepalived
 ip addr #マスター ノードの VIP
 が生成されている
 

 

 

 

 #---------------- 3. マスター ノードの nginx サービスをシャットダウンし、障害をシミュレートし、keepalived をテストします----------------------
 #
 マスター ノード lb01 の Nginx サービスをシャットダウンし、ダウンタイムをシミュレートし、VIP がスタンバイ ノードにドリフトするかどうかを観察します systemctl stop
 nginx
 ip addr
 systemctl status keepalived #この時点で、keepalived はスクリプトによって強制終了されます# スタンバイ ノードは   
 VIP
 ip addr が生成されるかどうかを確認します
 #この時点で、 VIP はスタンバイ ノード
 lb0 2

 

 

 #プライマリ ノードを復元します
 systemctl start nginx #nginx を最初に起動し
 ます systemctl start keepalived #keepalived
 ip addrを再起動します

 

 

 3.  k8s Web UIインターフェースの構築

//在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS 
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001     #添加
  type: NodePort          #添加
  selector:
    k8s-app: kubernetes-dashboard
 
 
#通过recommended.yaml资源配置清单,使用kubectl apply创建资源,-f指定资源配置清单文件
 kubectl apply -f recommended.yaml
 
#サービス アカウントを作成し、デフォルトのクラスター管理者クラスター ロールをバインドします。
kubectl create serviceaccount crashboard-admin -n kube-system
 
kubectl create clusterrolebinding dumpboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin #
 
 トークン値
を取得します kubectl description secrets -n kube-system $(kubect l -n kube-system get secret | awk '/dashboard-admin/{print $1}') #出力トークンを使用してダッシュボードにログインし、ノードノード https://192.168.73.106:30001 にアクセスし
 
ます

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/zhangchang3/article/details/131347571
おすすめ