在 VMware vSphere 安装 KubeSphere

    本教程介绍如何使用 Keepalived + HAProxy 对 kube-apiserver 进行负载均衡,实现高可用 Kubernetes 集群。

    • 参考,确保您已经知道如何安装多节点 KubeSphere 集群。本教程重点介绍如何配置负载均衡器实现高可用。
    • 您需要一个 VMware vSphere 帐户来创建 VM 资源。
    • 考虑到数据的持久性,对于生产环境,我们建议您准备持久化存储。若搭建开发和测试环境,可以直接使用默认集成的 OpenEBS 的 LocalPV。

    部署架构

    本示例创建 8 台 CentOS Linux release 7.6.1810(Core) 的虚拟机部署默认的最小化安装,每台配置为 2 Core,4 GB,40 G 即可。

    备注

    vip 所在的是虚拟 IP,并不需要创建主机,所以只需要创建 8 台虚拟机。

    1. 选择可创建的资源池,点击右键,选择新建虚拟机(创建虚拟机入口有好几个,请自己选择)

      0-1-新创

    2. 选择创建类型,创建新虚拟机。

    3. 填写虚拟机名称和存放文件夹。

      0-1-2-name

    4. 选择计算资源。

    5. 选择存储。

      0-1-4-存储

    6. 选择兼容性,这里是 ESXi 7.0 及更高版本。

    7. 选择客户机操作系统,Linux CentOS 7 (64 位)。

      0-1-6-系统

    8. 即将完成页面上可查看为虚拟机选择的配置。

      0-1-8

    部署 keepalived 和 HAproxy

    生产环境需要单独准备负载均衡器,例如 NGINX、F5、Keepalived + HAproxy 这样的私有化部署负载均衡器方案。如果您是准备搭建开发或测试环境,无需准备负载均衡器,可以跳过此小节。

    在主机为 lb-0 和 lb-1 中部署 Keepalived + HAProxy 即 IP 为与10.10.71.66的服务器上安装部署 HAProxy 和 psmisc。

    在 IP 为 10.10.71.7710.10.71.66 的服务器上按如下参数配置 HAProxy (两台 lb 机器配置一致即可,注意后端服务地址)。

    1. # HAProxy Configure /etc/haproxy/haproxy.cfg
    2. global
    3. log 127.0.0.1 local2
    4. chroot /var/lib/haproxy
    5. pidfile /var/run/haproxy.pid
    6. maxconn 4000
    7. user haproxy
    8. group haproxy
    9. daemon
    10. # turn on stats unix socket
    11. stats socket /var/lib/haproxy/stats
    12. #---------------------------------------------------------------------
    13. # common defaults that all the 'listen' and 'backend' sections will
    14. # use if not designated in their block
    15. #---------------------------------------------------------------------
    16. defaults
    17. log global
    18. option httplog
    19. option dontlognull
    20. timeout connect 5000
    21. timeout client 5000
    22. timeout server 5000
    23. #---------------------------------------------------------------------
    24. # main frontend which proxys to the backends
    25. #---------------------------------------------------------------------
    26. frontend kube-apiserver
    27. bind *:6443
    28. mode tcp
    29. option tcplog
    30. default_backend kube-apiserver
    31. #---------------------------------------------------------------------
    32. # round robin balancing between the various backends
    33. #---------------------------------------------------------------------
    34. backend kube-apiserver
    35. mode tcp
    36. option tcplog
    37. balance roundrobin
    38. default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    39. server kube-apiserver-1 10.10.71.214:6443 check
    40. server kube-apiserver-2 10.10.71.73:6443 check
    41. server kube-apiserver-3 10.10.71.62:6443 check

    启动之前检查语法是否有问题

    1. haproxy -f /etc/haproxy/haproxy.cfg -c

    启动 Haproxy,并设置开机自启动

    1. systemctl restart haproxy && systemctl enable haproxy

    停止 Haproxy

    1. systemctl stop haproxy

    主 HAProxy 77 lb-0-10.10.71.77 (/etc/keepalived/keepalived.conf)

    1. global_defs {
    2. notification_email {
    3. }
    4. router_id LVS_DEVEL01 ##相当于给这个服务器起个昵称
    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 20
    13. }
    14. vrrp_instance haproxy-vip {
    15. state MASTER #主服务器 是MASTER
    16. priority 100 #主服务器优先级要比备服务器高
    17. interface ens192 #实例绑定的网卡
    18. virtual_router_id 60 #定义一个热备组,可以认为这是60号热备组
    19. advert_int 1 #1秒互相通告一次,检查对方死了没。
    20. authentication {
    21. auth_type PASS #认证类型
    22. auth_pass 1111 #认证密码 这些相当于暗号
    23. unicast_src_ip 10.10.71.77 #当前机器地址
    24. unicast_peer {
    25. 10.10.71.66 #peer中其它机器地址
    26. }
    27. virtual_ipaddress {
    28. #vip地址
    29. 10.10.71.67/24
    30. }
    31. track_script {
    32. chk_haproxy
    33. }
    34. }

    备 HAProxy 66 lb-1-10.10.71.66 (/etc/keepalived/keepalived.conf)

    1. global_defs {
    2. notification_email {
    3. }
    4. router_id LVS_DEVEL02 ##相当于给这个服务器起个昵称
    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 20
    13. }
    14. vrrp_instance haproxy-vip {
    15. state BACKUP #备份服务器 是 backup
    16. priority 90 #优先级要低(把备份的90修改为100)
    17. interface ens192 #实例绑定的网卡
    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.71.66 #当前机器地址
    25. unicast_peer {
    26. 10.10.71.77 #peer 中其它机器地址
    27. }
    28. virtual_ipaddress {
    29. #加/24
    30. 10.10.71.67/24
    31. }
    32. track_script {
    33. chk_haproxy
    34. }
    35. }

    启动 keepalived,设置开机自启动

    开启 keepalived服务

    1. systemctl start keepalivedb

    使用ip a s查看各 lb 节点 vip 绑定情况

    1. ip a s

    暂停 vip 所在节点 HAProxy

    1. systemctl stop haproxy

    再次使用ip a s查看各 lb 节点 vip 绑定情况,查看 vip 是否发生漂移

    1. ip a s

    或者使用下面命令查看

    1. systemctl status -l keepalived

    下载可执行安装程序 kk 至一台目标机器:

    GitHub Release Page 下载 KubeKey 或直接使用以下命令。

    1. curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.0 sh -

    执行以下命令下载 KubeKey。

    1. curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.0 sh -

    备注

    在您下载 KubeKey 后,如果您将其传至新的机器,且访问 Googleapis 同样受限,在您执行以下步骤之前请务必再次执行 export KKZONE=cn 命令。

    备注

    执行以上命令会下载最新版 KubeKey (v1.2.0),您可以修改命令中的版本号下载指定版本。

    kk 添加可执行权限:

    1. chmod +x kk

    创建多节点集群

    您可以使用高级安装来控制自定义参数或创建多节点集群。具体来说,通过指定配置文件来创建集群。

    创建配置文件(一个示例配置文件)。

      备注

      • 安装 KubeSphere 3.2.0 的建议 Kubernetes 版本:v1.19.x、v1.20.x、v1.21.x 或 v1.22.x(实验性支持)。如果不指定 Kubernetes 版本,KubeKey 将默认安装 Kubernetes v1.21.5。有关受支持的 Kubernetes 版本的更多信息,请参见支持矩阵

      • 如果您在这一步的命令中不添加标志 --with-kubesphere,则不会部署 KubeSphere,只能使用配置文件中的 addons 字段安装,或者在您后续使用 ./kk create cluster 命令时再次添加这个标志。

      • 如果您添加标志 --with-kubesphere 时不指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。

      默认文件 config-sample.yaml 创建后,根据您的环境修改该文件。

      1. vi ~/config-sample.yaml
      1. apiVersion: kubekey.kubesphere.io/v1alpha1
      2. kind: Cluster
      3. metadata:
      4. spec:
      5. hosts:
      6. - {name: master1, address: 10.10.71.214, internalAddress: 10.10.71.214, password: [email protected]!}
      7. - {name: master2, address: 10.10.71.73, internalAddress: 10.10.71.73, password: [email protected]!}
      8. - {name: master3, address: 10.10.71.62, internalAddress: 10.10.71.62, password: [email protected]!}
      9. - {name: node1, address: 10.10.71.75, internalAddress: 10.10.71.75, password: [email protected]!}
      10. - {name: node2, address: 10.10.71.76, internalAddress: 10.10.71.76, password: [email protected]!}
      11. - {name: node3, address: 10.10.71.79, internalAddress: 10.10.71.79, password: [email protected]!}
      12. roleGroups:
      13. etcd:
      14. - master1
      15. - master2
      16. - master3
      17. master:
      18. - master1
      19. - master2
      20. - master3
      21. worker:
      22. - node1
      23. - node2
      24. - node3
      25. controlPlaneEndpoint:
      26. domain: lb.kubesphere.local
      27. # vip
      28. address: "10.10.71.67"
      29. port: "6443"
      30. kubernetes:
      31. version: v1.21.5
      32. imageRepo: kubesphere
      33. clusterName: cluster.local
      34. masqueradeAll: false # masqueradeAll tells kube-proxy to SNAT everything if using the pure iptables proxy mode. [Default: false]
      35. maxPods: 110 # maxPods is the number of pods that can run on this Kubelet. [Default: 110]
      36. nodeCidrMaskSize: 24 # internal network node size allocation. This is the size allocated to each node on your network. [Default: 24]
      37. proxyMode: ipvs # mode specifies which proxy mode to use. [Default: ipvs]
      38. network:
      39. plugin: calico
      40. calico:
      41. ipipMode: Always # IPIP Mode to use for the IPv4 POOL created at start up. If set to a value other than Never, vxlanMode should be set to "Never". [Always | CrossSubnet | Never] [Default: Always]
      42. vxlanMode: Never # VXLAN Mode to use for the IPv4 POOL created at start up. If set to a value other than Never, ipipMode should be set to "Never". [Always | CrossSubnet | Never] [Default: Never]
      43. vethMTU: 1440 # The maximum transmission unit (MTU) setting determines the largest packet size that can be transmitted through your network. [Default: 1440]
      44. kubePodsCIDR: 10.233.64.0/18
      45. kubeServiceCIDR: 10.233.0.0/18
      46. registry:
      47. registryMirrors: []
      48. insecureRegistries: []
      49. addons: []
      50. ···
      51. # 其它配置可以在安装后之后根据需要进行修改

      持久化存储配置

      如本文开头的前提条件所说,对于生产环境,我们建议您准备持久性存储,可参考以下说明进行配置。若搭建开发和测试环境,您可以跳过这小节,直接使用默认集成的 OpenEBS 的 LocalPV 存储。

      继续编辑上述config-sample.yaml文件,找到[addons]字段,这里支持定义任何持久化存储的插件或客户端,如 NFS Client、Ceph、GlusterFS、CSI,根据您自己的持久化存储服务类型,并参考 持久化存储服务 中对应的示例 YAML 文件进行设置。

      执行创建集群

      使用上面自定义的配置文件创建集群:

      1. ./kk create cluster -f config-sample.yaml

      根据表格的系统依赖的前提条件检查,如果相关依赖都显示 ,则可以输入 yes 继续执行安装。

      验证安装结果

      此时可以看到安装日志自动输出,或者可以再打开一个 SSH 手动检查安装日志,然后等待安装成功。

      如果最后返回Welcome to KubeSphere,则表示已安装成功。

      1. **************************************************
      2. #####################################################
      3. ### Welcome to KubeSphere! ###
      4. #####################################################
      5. Console: http://10.10.71.214:30880
      6. Account: admin
      7. Password: [email protected]
      8. NOTES
      9. 1. After you log into the console, please check the
      10. monitoring status of service components in
      11. the "Cluster Management". If any service is not
      12. ready, please wait patiently until all components
      13. are up and running.
      14. 2. Please change the default password after login.
      15. #####################################################
      16. https://kubesphere.io 2020-08-15 23:32:12
      17. #####################################################

      登录 console 界面

      上面的示例演示了默认的最小安装过程,对于可插拔组件,可以在安装之前或之后启用它们。有关详细信息,请参见启用可插拔组件