• 云原生Kubernetes:二进制部署K8S多Master架构(三)


    目录

     一、理论

    1.K8S多Master架构

    2.配置master02

    3.master02 节点部署

    4.负载均衡部署

    二、实验

    1.环境

    2.配置master02

     3.master02 节点部署

    4.负载均衡部署

    三、总结


     一、理论

    1.K8S多Master架构

    (1) 场景

           Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失效状态自动在其他Node拉起Pod,实现了应用层的高可用性。
           针对Kubernetes集群,高可用性还应包含以下两个层面的考虑:Etcd数据库的高可用性和Kubernetes Master组件的高可用性。 而Etcd在单Master项目中已经采用3个节点组建集群实现高可用,所以需要对Master节点高可用进行说明和实施。
            Master节点扮演着总控中心的角色,通过不断与工作节点上的Kubelet和kube-proxy进行通信来维护整个集群的健康工作状态。如果Master节点故障,将无法使用kubectl工具或者API做任何集群管理。
            Master节点主要有三个服务kube-apiserver、kube-controller-manager和kube-scheduler,其中kube-controller-manager和kube-scheduler组件自身通过选择机制已经实现了高可用,所以Master高可用主要针对kube-apiserver组件,而该组件是以HTTP API提供服务,因此对它高可用与Web服务器类似,增加负载均衡器对其负载均衡即可,并且可水平扩容。
     

    (2)架构

    (3)Nginx+Keepalived高可用负载均衡器

     ① 架构

    ② 场景

    1)Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡。
    Keepalived是一个主流高可用软件,基于VIP绑定实现服务器双机热备,在上述拓扑中,               2)Keepalived主要根据Nginx运行状态判断是否需要故障转移(漂移VIP),例如当Nginx主节点挂掉,VIP会自动绑定在Nginx备节点,从而保证VIP一直可用,实现Nginx高可用。
    3)如果项目部署在公有云上,一般都不支持keepalived,可以直接用它们的负载均衡器产品,直接负载均衡多台Master kube-apiserver,架构与上面一样。
    在两台Master节点操作。

     

    2.配置master02

    (1)环境

    1. 关闭防火墙
    2. systemctl stop firewalld
    3. systemctl disable firewalld
    4. 关闭selinux
    5. setenforce 0 #临时关闭
    6. sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
    7. 关闭swap
    8. swapoff -a
    9. sed -ri 's/.*swap.*/#&/' /etc/fstab
    10. 设置主机名
    11. hostnamectl set-hostname master02
    12. 在各节点添加hosts
    13. cat >> /etc/hosts << EOF
    14. 192.168.204.176 master02
    15. 192.168.204.171 master01
    16. 192.168.204.173 node01
    17. 192.168.204.175 node02
    18. EOF
    19. 将桥接的IPv4流量传递到iptables的链
    20. cat > /etc/sysctl.d/k8s.conf << EOF
    21. net.bridge.bridge-nf-call-ip6tables = 1
    22. net.bridge.bridge-nf-call-iptables =1
    23. EOF
    24. sysctl --system #重新载入一下
    25. 时间同步
    26. yum install ntpdate -y
    27. ntpdate time.windows.com

    3.master02 节点部署

    (1)从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点

    1. scp -r /opt/etcd/ root@192.168.204.176:/opt/
    2. scp -r /opt/kubernetes/ root@192.168.204.176:/opt
    3. scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.204.176:/usr/lib/systemd/system/

    (2)修改配置文件kube-apiserver中的IP

    1. vim /opt/kubernetes/cfg/kube-apiserver
    2. KUBE_APISERVER_OPTS="--logtostderr=true \
    3. --v=4 \
    4. --etcd-servers=https://192.168.204.171:2379,https://192.168.204.173:2379,https://192.168.204.175:2379 \
    5. --bind-address=192.168.204.176 \ #修改
    6. --secure-port=6443 \
    7. --advertise-address=192.168.204.176 \ #修改
    8. ......

    (3)在 master02 节点上启动各服务并设置开机自启

    1. systemctl start kube-apiserver.service
    2. systemctl enable kube-apiserver.service
    3. systemctl start kube-controller-manager.service
    4. systemctl enable kube-controller-manager.service
    5. systemctl start kube-scheduler.service
    6. systemctl enable kube-scheduler.service

    (4)查看node节点状态

    1. ln -s /opt/kubernetes/bin/* /usr/local/bin/
    2. kubectl get nodes
    3. kubectl get nodes -o wide

    4.负载均衡部署

    配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)

    (1)在lb01、lb02节点上操作

    配置nginx的官方在线yum源,配置本地nginx的yum源

    1. cat > /etc/yum.repos.d/nginx.repo << 'EOF'
    2. [nginx]
    3. name=nginx repo
    4. baseurl=http://nginx.org/packages/centos/7/$basearch/
    5. gpgcheck=0
    6. EOF
    yum install nginx -y
    

    修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口

    1. vim /etc/nginx/nginx.conf
    2. events {
    3. worker_connections 1024;
    4. }
    5. #添加
    6. stream {
    7. log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    8. access_log /var/log/nginx/k8s-access.log main;
    9. upstream k8s-apiserver {
    10. server 192.168.111.171:6443;
    11. server 192.168.111.176:6443;
    12. }
    13. server {
    14. listen 6443;
    15. proxy_pass k8s-apiserver;
    16. }
    17. }
    18. http {
    19. ......

    检查配置文件语法

    nginx -t   
    

    启动nginx服务,查看已监听6443端口

    1. systemctl start nginx
    2. systemctl enable nginx
    3. netstat -natp | grep nginx

    部署keepalived服务

    yum install keepalived -y
    

    修改keepalived配置文件

    1. vim /etc/keepalived/keepalived.conf
    2. ! Configuration File for keepalived
    3. global_defs {
    4. # 接收邮件地址
    5. notification_email {
    6. acassen@firewall.loc
    7. failover@firewall.loc
    8. sysadmin@firewall.loc
    9. }
    10. # 邮件发送地址
    11. notification_email_from Alexandre.Cassen@firewall.loc
    12. smtp_server 127.0.0.1
    13. smtp_connect_timeout 30
    14. router_id NGINX_MASTER #lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
    15. }
    16. #添加一个周期性执行的脚本
    17. vrrp_script check_nginx {
    18. script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
    19. }
    20. vrrp_instance VI_1 {
    21. state MASTER #lb01节点的为 MASTER,lb02节点的为 BACKUP
    22. interface ens33 #指定网卡名称 ens33
    23. virtual_router_id 51 #指定vrid,两个节点要一致
    24. priority 100 #lb01节点的为 100,lb02节点的为 90
    25. advert_int 1
    26. authentication {
    27. auth_type PASS
    28. auth_pass 1111
    29. }
    30. virtual_ipaddress {
    31. 192.168.204.100/24 #指定 VIP
    32. }
    33. track_script {
    34. check_nginx #指定vrrp_script配置的脚本
    35. }
    36. }

    创建nginx状态检查脚本

    1. vim /etc/nginx/check_nginx.sh
    2. #!/bin/bash
    3. #egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID
    4. count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
    5. if [ "$count" -eq 0 ];then
    6. systemctl stop keepalived
    7. fi
    8. chmod +x /etc/nginx/check_nginx.sh

    启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)

    1. systemctl start keepalived
    2. systemctl enable keepalived
    3. ip a #查看VIP是否生成

    修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP

    1. cd /opt/kubernetes/cfg/
    2. vim bootstrap.kubeconfig
    3. server: https://192.168.204.100:6443
    4. vim kubelet.kubeconfig
    5. server: https://192.168.204.100:6443
    6. vim kube-proxy.kubeconfig
    7. server: https://192.168.204.100:6443

    node节点重启kubelet和kube-proxy服务

    1. systemctl restart kubelet.service 
    2. systemctl restart kube-proxy.service

    在 lb01 上查看 nginx 和 node 、 master 节点的连接状态

    netstat -natp | grep nginx

    (2)在 master01 节点上操作

    测试创建pod

    kubectl run nginx --image=nginx
    

    查看Pod的状态信息

    kubectl get pods

    在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问

    curl 172.17.14.2

    这时在master01节点上查看nginx日志,发现没有权限查看

     kubectl logs nginx-dbddb74b8-n2zbw

    在master01节点上,将cluster-admin角色授予用户system:anonymous

    kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
    

    这时在master01节点上查看nginx日志

     kubectl logs nginx-dbddb74b8-n2zbw

    二、实验

    由实验:二进制部署K8S单Master架构(二)继续进行

    1.环境

    表1 K8S环境

    主机IP软件硬件
    k8s集群master01 192.168.204.171kube-apiserver kube-controller-manager kube-scheduler etcd4核4G
    k8s集群node1 192.168.204.173kubelet kube-proxy docker flannel4核4G
    k8s集群node2 192.168.204.175kubelet kube-proxy docker flannel4核4G
    k8s集群master02192.168.204.176kube-apiserver kube-controller-manager kube-scheduler etcd4核4G
    负载均衡器1(lb01)192.168.204.177nginx,keepalived2核2G
    负载均衡器2(lb02)192.168.204.178nginx,keepalived2核2G

    2.配置master02

    (1)环境

    关闭防火墙

    关闭selinux

    关闭swap

    设置主机名

    在各节点添加hosts

    将桥接的IPv4流量传递到iptables的链

    重新载入一下

    时间同步

     3.master02 节点部署

    (1)从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点

    (2)修改配置文件kube-apiserver中的IP

    (3)在 master02 节点上启动各服务并设置开机自启

    (4)查看node节点状态

    4.负载均衡部署

    配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)

    (1)在lb01、lb02节点上操作

    配置nginx的官方在线yum源,配置本地nginx的yum源

    修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口

    检查配置文件语法

    启动nginx服务,查看已监听6443端口

    部署keepalived服务

    修改keepalived配置文件

    创建nginx状态检查脚本

    启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)

    vip已在lb01生成

    修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP

    node1:

    node2:

    重启kubelet和kube-proxy服务

    在 lb01 上查看 nginx 和 node 、 master 节点的连接状态

    (2)在 master01 节点上操作

    测试创建pod

    查看Pod的状态信息

    正在创建中

    创建完成,运行中

    READY为1/1,表示这个Pod中有1个容器

    在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问

    这时在master01节点上查看nginx日志,发现没有权限查看

    在master01节点上,将cluster-admin角色授予用户system:anonymous

    这时在master01节点上查看nginx日志

    三、总结

    kube-controller-manager和kube-scheduler组件自身通过选择机制已经实现了高可用,所以Master高可用主要针对kube-apiserver组件。

    nginx实现负载均衡,keepalived实现双机热备。

    启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)。

  • 相关阅读:
    新老电脑的文件/数据同步记录
    java计算机毕业设计快滴预约平台源码+系统+mysql数据库+lw文档+部署
    es的检索-DSL语法和Java-RestClient实现
    教你实现物联网HMI/网关的趋势功能
    Python日期和时间库datetime
    问题 A: 二叉排序树 - 文本输出
    QFramework引入Command
    IP协议从0到1
    功能安全 ISO26262
    数据采集中的基本参数
  • 原文地址:https://blog.csdn.net/cronaldo91/article/details/132632271