搭建k8s高可用集群(Keepalived 和 HAproxy)

打印 上一主题 下一主题

主题 644|帖子 644|积分 1932

搭建k8s高可用集群
1、准备工作

记载一次搭建k8s高可用集群的过程,使用KubeSphere可视化界面引导安装集群。本次实验一共是10台机器,内网IP地址和配置如下图:
IP 地址主机名角色配置10.10.10.101keepalived1Keepalived & HAproxy2核2G,50GB10.10.10.102keepalived2Keepalived & HAproxy2核2G,50GB10.10.10.201k8s-master1master主节点, etcd4核8G,100GB10.10.10.202k8s-master2master主节点, etcd4核8G,100GB10.10.10.203k8s-master3master主节点, etcd4核8G,100GB10.10.10.211k8s-node1worker node工作节点6核8G,60GB10.10.10.212k8s-node2worker node工作节点4核8G,50GB10.10.10.213k8s-node3worker node工作节点8核16G,100GB10.10.10.214k8s-node4worker node工作节点6核8G,60GB10.10.10.215k8s-node5worker node工作节点6核8G,70GB 有2个keepalived节点,三个主节点和5个工作节点,另外准备用一个没被使用的IP10.10.10.200当虚拟ip地址。(10台安装了centos7的机器另加一个没被使用过的IP地址)
意在开始搭建集群前请停止全部机器的防火墙,而且确保机器之间能互相ssh连接访问:
  1. systemctl disable firewalld
  2. systemctl stop firewalld
复制代码
全部机器都运行如下下令同步时间:
  1. yum install -y ntpdate
  2. ntpdate ntp.aliyun.com
  3. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
复制代码
使用如下下令把主机名字设置好,每台机器设一个便于记忆的名字。我这里按表格中的设置了:
  1. #各个机器设置自己的域名
  2. hostnamectl set-hostname k8s-master1
复制代码
使用如下下令把全部的master节点和worker工作节点设置禁用swap,关闭selinux
  1. sudo setenforce 0
  2. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  3. #关闭swap
  4. swapoff -a  
  5. sed -ri 's/.*swap.*/#&/' /etc/fstab
  6. #允许 iptables 检查桥接流量
  7. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  8. br_netfilter
  9. EOF
  10. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  11. net.bridge.bridge-nf-call-ip6tables = 1
  12. net.bridge.bridge-nf-call-iptables = 1
  13. EOF
  14. sudo sysctl --system
复制代码
使用如下下令在全部的master节点和worker工作节点安装docker并配置docker镜像加快器。
  1. yum install -y yum-utils device-mapper-persistent-data lvm2 wget vim --skip-broken
  2. yum install -y conntrack socat
  3. # 设置docker镜像源
  4. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  
  5. sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
  6. yum makecache fast
  7. yum install -y docker-ce-20.10.10 docker-ce-cli-20.10.10  containerd.io-1.4.9
复制代码
全部的master节点和worker工作节点启动docker
  1. systemctl enable docker --now
复制代码
全部的master节点和worker工作节点配置docker镜像加快器(这里额外添加了docker的生产环境焦点配置cgroup)
  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4.   "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
  5.   "exec-opts": ["native.cgroupdriver=systemd"],
  6.   "log-driver": "json-file",
  7.   "log-opts": {
  8.     "max-size": "100m"
  9.   },
  10.   "storage-driver": "overlay2"
  11. }
  12. EOF
  13. sudo systemctl daemon-reload
  14. sudo systemctl restart docker
复制代码

全部的master节点和worker工作节点配置k8s源地址
  1. cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9.    http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF
  11. yum makecache fast
复制代码
2.在keepalived1和keepalived2上运行如下下令安装keepalived和haproxy:

  1. yum install keepalived haproxy psmisc -y
复制代码
安装完成keepalived和haproxy后编辑haproxy配置,

进入/etc/haproxy找到如上图文件编辑内容如下:
  1. global
  2.     log /dev/log  local0 warning
  3.     chroot      /var/lib/haproxy
  4.     pidfile     /var/run/haproxy.pid
  5.     maxconn     4000
  6.     user        haproxy
  7.     group       haproxy
  8.     daemon
  9.    stats socket /var/lib/haproxy/stats
  10. defaults
  11.   log global
  12.   option  httplog
  13.   option  dontlognull
  14.         timeout connect 5000
  15.         timeout client 50000
  16.         timeout server 50000
  17. frontend kube-apiserver
  18.   bind *:6443 #注意这里的6443是kube-apiserver的默认端口,一般不需要修改
  19.   mode tcp
  20.   option tcplog
  21.   default_backend kube-apiserver
  22. backend kube-apiserver
  23.     mode tcp
  24.     option tcplog
  25.     option tcp-check
  26.     balance roundrobin
  27.     default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  28.     server kube-apiserver-1 10.10.10.201:6443 check # 改成你自己的主节点IP,我是3个主节点,你有几个主节点就写几个
  29.     server kube-apiserver-2 10.10.10.202:6443 check # 改成你自己的主节点IP
  30.     server kube-apiserver-3 10.10.10.203:6443 check # 改成你自己的主节点IP
复制代码
注意这个修改haproxy配置文件是两个keepalived节点都要做的事变,配置过程完全一样。
两台keepalived都配置完成后运行如下下令重启kaproxy
  1. systemctl enable haproxy
  2. systemctl restart haproxy
复制代码
3、Keepalived配置

两台keepalived机器分别进入/etc/keepalived/文件夹下,编辑keepalived.conf文件,但是两台机器的配置文件内容略有不一样的地方,如下:
  1. global_defs {
  2.   notification_email {
  3.   }
  4.   router_id LVS_DEVEL
  5.   vrrp_skip_check_adv_addr
  6.   vrrp_garp_interval 0
  7.   vrrp_gna_interval 0
  8. }
  9. vrrp_script chk_haproxy {
  10.   script "killall -0 haproxy"
  11.   interval 2
  12.   weight 2
  13. }
  14. vrrp_instance haproxy-vip {
  15.   state BACKUP
  16.   priority 100
  17.   interface eth0 #这个是机器的网卡名字,就是你运行ip a命令看到的IP地址对应的网卡名
  18.   virtual_router_id 60
  19.   advert_int 1
  20.   authentication {
  21.     auth_type PASS
  22.     auth_pass 1111
  23.   }
  24.   unicast_src_ip 10.10.10.101 #这里填你现在编辑文件的这台keepalived机器的IP地址
  25.   unicast_peer {
  26.     10.10.10.102  #这是剩下那台keepalived机器的IP地址,
  27.   }                #因此2台keepalived机器的unicast_src_ip和unicast_peer正好相反
  28.   virtual_ipaddress {
  29.     10.10.10.200/24   #这是VirtulIp虚拟IP地址
  30.   }
  31.   track_script {
  32.     chk_haproxy
  33.   }
  34. }
复制代码


  • 为 unicast_src_ip 提供的 IP 地址是您当前机器的 IP 地址。
  • 对于也安装了 HAproxy 和 Keepalived 进行负载均衡的其他机器,必须在字段 unicast_peer 中输入其 IP 地址。
保存配置文件,重启2台keepalived机器:
  1. systemctl restart keepalived
  2. systemctl enable keepalived
复制代码
4、验证高可用性

在keepalived1 10.10.10.101机器上运行ip a s下令,输出如下:

如今把keepalived1 10.10.10.101机器关机,模仿机器故障。
然后在keepalived2 10.10.10.102机器上应该能看到如下:

如上图结果所示,高可用已经配置成功。
5、使用KubeKey引导创建k8s集群

在k8s-master1主节点上运行如下下令:
  1. export KKZONE=cn
  2. curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -
  3. chmod +x kk
复制代码
下载kubeKey后使用如下下令安装kubernetes1.23.10版本,您也可以更换其他版本:
  1. ./kk create config --with-kubesphere v3.4.1 --with-kubernetes v1.23.10
复制代码
运行上述下令后将会在当前路径创建配置文件config-sample.yaml,接下来编辑这个文件:

重点关注以下几个地方,如下图红色方框中的内容:

spec:hosts:中每一行代表一个机器,要把全部机器列出来,name:实例的主机名(就是第一步准备工作时设置的hostname),address和internalAddress是每个机器的IP地址,后面的user和password是能远程登录机器的用户名和暗码。
controlPlaneEndpoint 部门为高可用集群提供外部负载均衡器信息,上图中下方的红色方框中填那个虚拟IP的地址。
  1. apiVersion: kubekey.kubesphere.io/v1alpha2
  2. kind: Cluster
  3. metadata:
  4.   name: sample
  5. spec:
  6.   hosts:
  7.   - {name: k8s-master1, address: 10.10.10.201, internalAddress: 10.10.10.201, user: root, password: "123456789"}
  8.   - {name: k8s-master2, address: 10.10.10.202, internalAddress: 10.10.10.202, user: root, password: "123456789"}
  9.   - {name: k8s-master3, address: 10.10.10.203, internalAddress: 10.10.10.203, user: root, password: "123456789"}
  10.   - {name: k8s-node1, address: 10.10.10.211, internalAddress: 10.10.10.211, user: root, password: "123456789"}
  11.   - {name: k8s-node2, address: 10.10.10.212, internalAddress: 10.10.10.212, user: root, password: "123456789"}
  12.   - {name: k8s-node3, address: 10.10.10.213, internalAddress: 10.10.10.213, user: root, password: "123456789"}
  13.   - {name: k8s-node4, address: 10.10.10.214, internalAddress: 10.10.10.214, user: root, password: "123456789"}
  14.   - {name: k8s-node5, address: 10.10.10.215, internalAddress: 10.10.10.215, user: root, password: "123456789"}
  15.   roleGroups:
  16.     etcd:
  17.     - k8s-master1
  18.     - k8s-master2
  19.     - k8s-master3
  20.     control-plane:
  21.     - k8s-master1
  22.     - k8s-master2
  23.     - k8s-master3
  24.     worker:
  25.     - k8s-node1
  26.     - k8s-node2
  27.     - k8s-node3
  28.     - k8s-node4
  29.     - k8s-node5
  30.   controlPlaneEndpoint:
  31.     ## Internal loadbalancer for apiservers
  32.     # internalLoadbalancer: haproxy
  33.     domain: lb.kubesphere.local
  34.     address: 10.10.10.200 # The VIP address
  35.     port: 6443
  36.   kubernetes:
  37.     version: v1.23.10
  38.     clusterName: cluster.local
  39.     autoRenewCerts: true
  40.     containerManager: docker
  41.   etcd:
  42.     type: kubekey
  43.   network:
  44.     plugin: calico
  45.     kubePodsCIDR: 172.30.0.0/16
  46.     kubeServiceCIDR: 192.168.0.0/16
  47.     ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
  48.     multusCNI:
  49.       enabled: false
  50.   registry:
  51.     privateRegistry: ""
  52.     namespaceOverride: ""
  53.     registryMirrors: []
  54.     insecureRegistries: []
  55.   addons: []
  56. ---
  57. apiVersion: installer.kubesphere.io/v1alpha1
  58. kind: ClusterConfiguration
  59. metadata:
  60.   name: ks-installer
  61.   namespace: kubesphere-system
  62.   labels:
  63.     version: v3.4.1
  64. spec:
  65.   persistence:
  66.     storageClass: ""
  67.   authentication:
  68.     jwtSecret: ""
  69.   local_registry: ""
  70.   # dev_tag: ""
  71.   etcd:
  72.     monitoring: false
  73.     endpointIps: localhost
  74.     port: 2379
  75.     tlsEnable: true
  76.   common:
  77.     core:
  78.       console:
  79.         enableMultiLogin: true
  80.         port: 30880
  81.         type: NodePort
  82.     # apiserver:
  83.     #  resources: {}
  84.     # controllerManager:
  85.     #  resources: {}
  86.     redis:
  87.       enabled: false
  88.       enableHA: false
  89.       volumeSize: 2Gi
  90.     openldap:
  91.       enabled: false
  92.       volumeSize: 2Gi
  93.     minio:
  94.       volumeSize: 20Gi
  95.     monitoring:
  96.       # type: external
  97.       endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090
  98.       GPUMonitoring:
  99.         enabled: false
  100.     gpu:
  101.       kinds:
  102.       - resourceName: "nvidia.com/gpu"
  103.         resourceType: "GPU"
  104.         default: true
  105.     es:
  106.       # master:
  107.       #   volumeSize: 4Gi
  108.       #   replicas: 1
  109.       #   resources: {}
  110.       # data:
  111.       #   volumeSize: 20Gi
  112.       #   replicas: 1
  113.       #   resources: {}
  114.       enabled: false
  115.       logMaxAge: 7
  116.       elkPrefix: logstash
  117.       basicAuth:
  118.         enabled: false
  119.         username: ""
  120.         password: ""
  121.       externalElasticsearchHost: ""
  122.       externalElasticsearchPort: ""
  123.     opensearch:
  124.       # master:
  125.       #   volumeSize: 4Gi
  126.       #   replicas: 1
  127.       #   resources: {}
  128.       # data:
  129.       #   volumeSize: 20Gi
  130.       #   replicas: 1
  131.       #   resources: {}
  132.       enabled: true
  133.       logMaxAge: 7
  134.       opensearchPrefix: whizard
  135.       basicAuth:
  136.         enabled: true
  137.         username: "admin"
  138.         password: "admin"
  139.       externalOpensearchHost: ""
  140.       externalOpensearchPort: ""
  141.       dashboard:
  142.         enabled: false
  143.   alerting:
  144.     enabled: false
  145.     # thanosruler:
  146.     #   replicas: 1
  147.     #   resources: {}
  148.   auditing:
  149.     enabled: false
  150.     # operator:
  151.     #   resources: {}
  152.     # webhook:
  153.     #   resources: {}
  154.   devops:
  155.     enabled: false
  156.     jenkinsCpuReq: 0.5
  157.     jenkinsCpuLim: 1
  158.     jenkinsMemoryReq: 4Gi
  159.     jenkinsMemoryLim: 4Gi
  160.     jenkinsVolumeSize: 16Gi
  161.   events:
  162.     enabled: false
  163.     # operator:
  164.     #   resources: {}
  165.     # exporter:
  166.     #   resources: {}
  167.     ruler:
  168.       enabled: true
  169.       replicas: 2
  170.     #   resources: {}
  171.   logging:
  172.     enabled: false
  173.     logsidecar:
  174.       enabled: true
  175.       replicas: 2
  176.       # resources: {}
  177.   metrics_server:
  178.     enabled: false
  179.   monitoring:
  180.     storageClass: ""
  181.     node_exporter:
  182.       port: 9100
  183.       # resources: {}
  184.     # kube_rbac_proxy:
  185.     #   resources: {}
  186.     # kube_state_metrics:
  187.     #   resources: {}
  188.     # prometheus:
  189.     #   replicas: 1
  190.     #   volumeSize: 20Gi
  191.     #   resources: {}
  192.     #   operator:
  193.     #     resources: {}
  194.     # alertmanager:
  195.     #   replicas: 1
  196.     #   resources: {}
  197.     # notification_manager:
  198.     #   resources: {}
  199.     #   operator:
  200.     #     resources: {}
  201.     #   proxy:
  202.     #     resources: {}
  203.     gpu:
  204.       nvidia_dcgm_exporter:
  205.         enabled: false
  206.         # resources: {}
  207.   multicluster:
  208.     clusterRole: none
  209.   network:
  210.     networkpolicy:
  211.       enabled: false
  212.     ippool:
  213.       type: none
  214.     topology:
  215.       type: none
  216.   openpitrix:
  217.     store:
  218.       enabled: false
  219.   servicemesh:
  220.     enabled: false
  221.     istio:
  222.       components:
  223.         ingressGateways:
  224.         - name: istio-ingressgateway
  225.           enabled: false
  226.         cni:
  227.           enabled: false
  228.   edgeruntime:
  229.     enabled: false
  230.     kubeedge:
  231.       enabled: false
  232.       cloudCore:
  233.         cloudHub:
  234.           advertiseAddress:
  235.             - ""
  236.         service:
  237.           cloudhubNodePort: "30000"
  238.           cloudhubQuicNodePort: "30001"
  239.           cloudhubHttpsNodePort: "30002"
  240.           cloudstreamNodePort: "30003"
  241.           tunnelNodePort: "30004"
  242.         # resources: {}
  243.         # hostNetWork: false
  244.       iptables-manager:
  245.         enabled: true
  246.         mode: "external"
  247.         # resources: {}
  248.       # edgeService:
  249.       #   resources: {}
  250.   gatekeeper:
  251.     enabled: false
  252.     # controller_manager:
  253.     #   resources: {}
  254.     # audit:
  255.     #   resources: {}
  256.   terminal:
  257.     timeout: 600
复制代码
配置完成后保存。
运行如下下令启动kubekey引导k8s安装:
  1. ./kk create cluster -f config-sample.yaml
复制代码
输入yes确认安装。

整个安装过程大概需要 20 到 40 分钟,具体取决于您的盘算机和网络环境。
安装过程中会拉取很多镜像:

安装完成输出如下:
  1. #####################################################
  2. ###              Welcome to KubeSphere!           ###
  3. #####################################################
  4. Console: http://10.10.10.201:30880
  5. Account: admin
  6. Password: pass@6**
  7. NOTES:
  8.   1. After you log into the console, please check the
  9.      monitoring status of service components in
  10.      "Cluster Management". If any service is not
  11.      ready, please wait patiently until all components
  12.      are up and running.
  13.   2. Please change the default password after login.
  14. #####################################################
  15. https://kubesphere.io             2024-03-11 11:28:33
  16. #####################################################
复制代码
稍等半晌在浏览器中访问:http://10.10.10.201:30880 输入账号暗码

说明K8s安装成功。
参考https://kubesphere.io/zh/docs/v3.4/
参考:尚硅谷教程
如果我的文章对您有资助,还请您多多支持我。付出宝资助扫一下吧


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表