• [云原生] 二进制k8s集群(下)部署高可用master节点


    在上一篇文章中,就已经完成了二进制k8s集群部署的搭建,但是单机master并不适用于企业的实际运用(因为单机master中,仅仅只有一台master作为节点服务器的调度指挥,一旦宕机。就意味着整个集群的瘫痪,所以成熟的k8s的集群一定要考虑到master的高可用。)企业的运用一般至少存在两台master及其以上的部署,本次将根据前面的部署,再添加一台master(三个master或者更多,也可以根据本次添加步骤重复添加)。添加master后,我们会将借助keepalived+nginx的架构,来实现高可用的master【也可以使用haproxy+keepalived或则是keepalived+lvs(不推荐,步骤过于复杂)

    本次部署的架构组件 

                                                                      mater节点
    mater01192.168.73.100kube-apiserver kube-controller-manager kube-scheduler 
    master02192.168.73.130kube-apiserver kube-controller-manager kube-scheduler 
                                                                       node节点
    node01192.168.73.110kubelet kube-proxy docker (容器引擎)
    node02192.168.73.120kubelet kube-proxy docker (容器引擎)
                                                                  etcd  cluster集群
    etcd节点1192.168.73.100(mater01)etcd
    etcd节点2192.168.73.110(node01)etcd
    etcd节点3192.168.73.120(node02)etcd
                                                           load balance(高可用调度器)
    主调度器192.168.73.140nginx,keepalived
    从调度器192.168.73.150nginx,keepalived

     架构说明:

    • node节点的kubelet只能对接一个master节点的apiserver,不可能同时对接多个master节点的apiserver。简而言之,node节只能有一个master来领导。

    • kubelet和kube-proxy是通过kubelet.kubeconfig和kube-proxy.kubeconfig文件中的server参数进行对接 master节点的。

    • 所以在多master节点的环境下,需要有nginx负载均衡器来进行调度,而且需要进行keepalived高可用的构建(主从两个节点) ,防止主节点宕机导致整个k8s集群的不可用。

     一、新master节点的搭建

    1.1 对master02 进行初始化配置

    1. #关闭防火墙
    2. systemctl stop firewalld
    3. systemctl disable firewalld
    4. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    5. #关闭selinux
    6. setenforce 0
    7. sed -i 's/enforcing/disabled/' /etc/selinux/config
    8. #关闭swap
    9. swapoff -a
    10. sed -ri 's/.*swap.*/#&/' /etc/fstab
    11. #根据规划设置主机名
    12. hostnamectl set-hostname master02
    13. su
    14. #在master添加hosts(添加到整个k8s集群的主机上,保证其他主机均有该映射)
    15. cat >> /etc/hosts << EOF
    16. 192.168.73.105 master01
    17. 192.168.73.110 master02
    18. 192.168.73.106 node01
    19. 192.168.73.107 node02
    20. EOF
    21. #调整内核参数
    22. cat > /etc/sysctl.d/k8s.conf << EOF
    23. #开启网桥模式,可将网桥的流量传递给iptables链
    24. net.bridge.bridge-nf-call-ip6tables = 1
    25. net.bridge.bridge-nf-call-iptables = 1
    26. #关闭ipv6协议
    27. net.ipv6.conf.all.disable_ipv6=1
    28. net.ipv4.ip_forward=1
    29. EOF
    30. sysctl --system
    31. #时间同步
    32. yum install ntpdate -y
    33. ntpdate ntp.aliyun.com
    34. #将时间同步的操作添加到计划性任务,确保所有节点保证时间的同步
    35. crontab -e
    36. */30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
    37. crontab -l

     

     1.2  将master01的配置移植到master02 

    1. ##------------ 1、 master01节点,拷贝文件到master02 -------------------------------
    2. #从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
    3. scp -r etcd/ master02:`pwd`
    4. scp -r kubernetes/ master02:`pwd`
    5. scp /usr/lib/systemd/system/kube-* master02:/usr/lib/systemd/system/
    6. scp -r /root/.kube/ master02:/root/

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

     

     

    二、负载均衡的部署 

    1. #配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
    2. #----------------- 1、两台负载均衡器配置nginx -------------------------------------
    3. #配置nginx的官方在线yum源,配置本地nginx的yum源
    4. cat > /etc/yum.repos.d/nginx.repo << 'EOF'
    5. [nginx]
    6. name=nginx repo
    7. baseurl=http://nginx.org/packages/centos/7/$basearch/
    8. gpgcheck=0
    9. EOF
    10. yum install nginx -y
    11. #修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
    12. vim /etc/nginx/nginx.conf
    13. events {
    14. worker_connections 1024;
    15. }
    16. #添加
    17. stream {
    18. log_format main '$remote_addr $upstream_addr - [$time_local] $status
    19. $upstream_bytes_sent';
    20. access_log /var/log/nginx/k8s-access.log main;
    21. upstream k8s-apiserver {
    22. server 192.168.73.105:6443; #master01
    23. server 192.168.73.110:6443; #master02
    24. }
    25. server {
    26. listen 6443;
    27. proxy_pass k8s-apiserver;
    28. }
    29. }
    30. http {
    31. ......
    32. #检查配置文件语法
    33. nginx -t
    34. #启动nginx服务,查看已监听6443端口
    35. systemctl start nginx
    36. systemctl enable nginx
    37. ss -lntp|grep nginx

     

     

    1. #------------------ 2、两台负载均衡器配置keepalived ------------------------------
    2. #部署keepalived服务
    3. yum install keepalived -y
    4. #修改keepalived配置文件
    5. vim /etc/keepalived/keepalived.conf
    6. ! Configuration File for keepalived
    7. global_defs {
    8. router_id nginx_master
    9. }
    10. vrrp_script check_nginx {
    11. script "/etc/nginx/check_nginx.sh" #指定检测脚本的路径,并且该脚本充当心跳检测脚本
    12. }
    13. vrrp_instance VI_1 {
    14. state MASTER #指定状态为master节点,109为BACKUP备用节点
    15. interface ens33
    16. virtual_router_id 51
    17. priority 100 #108优先级为100 10990,优先级决定着主备的位置
    18. advert_int 1
    19. authentication {
    20. auth_type PASS
    21. auth_pass 1111
    22. }
    23. virtual_ipaddress {
    24. 192.168.73.66
    25. }
    26. track_script {
    27. check_nginx #追踪脚本的进程
    28. }
    29. }
    30. #将该文件 发送给备用调度器,并且将其中的配置修改为备用调度器的属性
    31. cd /etc/keepalived/
    32. scp keepalived.conf root@192.168.73.109:`pwd`
    33. #创建nginx状态检查脚本
    34. vim /etc/nginx/check_nginx.sh
    35. #!/bin/bash
    36. killall -0 nginx &>/dev/null
    37. if [ $? -ne 0 ];then
    38. systemctl stop keepalived
    39. fi
    40. chmod +x /etc/nginx/check_nginx.sh #为脚本增加执行权限
    41. #将该脚本发送给备用调度器
    42. cd /etc/nginx
    43. scp check_nginx.conf root@192.168.73.109:`pwd`
    44. #两台主备调度器启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)
    45. systemctl start keepalived
    46. systemctl enable keepalived
    47. ip addr #查看主节点的VIP是否生成

     nginx心跳检测脚本说明:

    killall -0 可以用来检测程序是否执行
    如果服务未执行的情况下 会进行报错
    并且 $?的返回码 为非0值
     

    1. vim /etc/keepalived/keepalived.conf
    2. scp /etc/keepalived/keepalived.conf 192.168.136.150:/etc/keepalived/
    3. systemctl enable --now keepalived.service
    4. systemctl status keepalived.service
    5. systemctl restart nginx keepalived.service
    6. ip a

     

    1. #---------------- 3、关闭主节点的nginx服务,模拟故障,测试keepalived-----------------------
    2. #关闭主节点lb01的Nginx服务,模拟宕机,观察VIP是否漂移到备节点
    3. systemctl stop nginx
    4. ip addr
    5. systemctl status keepalived #此时keepalived被脚本杀掉了
    6. #备节点查看是否生成了VIP
    7. ip addr #此时VIP漂移到备节点lb02

     

    1. //修改所有node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
    2. [root@node01 /opt/kubernetes/cfg]#vim bootstrap.kubeconfig
    3. [root@node01 /opt/kubernetes/cfg]#vim kubelet.kubeconfig
    4. [root@node01 /opt/kubernetes/cfg]#vim kube-proxy.kubeconfig

    1. //重启node节点kubelet和kube-proxy服务
    2. systemctl restart kubelet.service
    3. systemctl restart kube-proxy.service

    1. //在 lb01 上查看 nginx 和 node 、 master 节点的连接状态
    2. netstat -natp | grep nginx

    三、k8s的web UI界面的搭建 

    1. //在 master01 节点上操作
    2. #上传 recommended.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS
    3. cd /opt/k8s
    4. vim recommended.yaml
    5. #默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
    6. kind: Service
    7. apiVersion: v1
    8. metadata:
    9. labels:
    10. k8s-app: kubernetes-dashboard
    11. name: kubernetes-dashboard
    12. namespace: kubernetes-dashboard
    13. spec:
    14. ports:
    15. - port: 443
    16. targetPort: 8443
    17. nodePort: 30001 #添加
    18. type: NodePort #添加
    19. selector:
    20. k8s-app: kubernetes-dashboard
    21. #通过recommended.yaml资源配置清单,使用kubectl apply创建资源,-f指定资源配置清单文件
    22. kubectl apply -f recommended.yaml
    23. #创建service account并绑定默认cluster-admin管理员集群角色
    24. kubectl create serviceaccount dashboard-admin -n kube-system
    25. kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    26. #获取token值
    27. kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    28. #使用输出的token登录Dashboard,访问node节点
    29. https://192.168.136.110:30001

     

     

     

     

  • 相关阅读:
    mysql数据库之字段类型
    【Django】model模型—模型继承
    环境配置 - Conda虚拟环境下配置jupyter notebook
    数据结构之二叉搜索树
    浏览器多开,数据之间相互不干扰
    C++ day7
    浅谈Python在人工智能领域的应用
    区块链技术在金融领域的应用场景
    dotnet 8 preview 1 即将发布
    Python 集成 Nacos 配置中心
  • 原文地址:https://blog.csdn.net/Cnm_147258/article/details/136250527