Kubernetes集群部署

预备知识

如果你不知道以下是做什么的,那么请参考下面链接(包括但不限于)进行学习:

前置要求与约定

  1. 集群会使用到的端口号

  2. 各服务器时间与时区需一致,集群内服务器间时间差值不能大于1秒。

  3. 文档以 4 个 CentOS 7.4 系统服务器安装高可用 Kubernetes 集群进行讲解。

  4. 按照本文档安装 Kubernetes 集群时,Ansible 脚本会将服务器上防火墙关闭,请使用安全组进行网络权限控制。

  5. Master(s) 服务器为 Kubernetes 控制服务器;Worker(s) 服务器为 Kubernetes 运算服务器;Etcd 服务器为组建Etcd 集群的服务器,Etcd 官方建议 Etcd 集群服务器个数为奇数个(比如1、3、5)以防止脑裂。

  6. 为安全考虑按本教程安装的 Kubernetes 集群只会在 Master(s) 服务器上配置 kubectl 命令所需 kubeconfig,故 Worker(s) 服务器默认是无法使用 kubectl 命令的。

集群安装示例

环境准备

  1. # 安装 git 命令行
  2. sudo yum install git -y
  3. # 克隆本项目代码
  4. git clone https://github.com/open-hand/kubeadm-ha.git
  5. # 进入项目目录
  6. cd kubeadm-ha
  7. # 安装 ansible 环境
  8. sudo ./ansible/install.sh

配置 ansible inventory 文件

  • 项目 example 文件夹下提供了 6 个 ansible inventory 示例文件,请按需求进行选择并修改。
  • 拷贝项目下的 example/hosts.m-master.ip.ini 文件至项目根目录下,命名为 inventory.ini,修改kubernetes部署版本为 1.16.15、各服务器的 IP 地址、用户名、密码,并维护好各服务器与角色的关系。

    请使用服务器内网 IP 作为 ansible 目标服务器 IP,请勿使用服务器公网 IP。
    该用户必须是具有 root 权限的用户,但并非要求一定是 root 用户,其他具有 root 权限的用户也可以。

    克隆下来的本项目文件与 inventory.ini 文件很重要,涉及到后期的集群运维工作,请一定妥善保管。

    1. ; 将所有节点的信息在这里填写
    2. ; 第一个字段 为节点内网IP,部署完成后为 kubernetes 节点 nodeName
    3. ; 第二个字段 ansible_port 为节点 sshd 监听端口
    4. ; 第三个字段 ansible_user 为节点远程登录用户名
    5. ; 第四个字段 ansible_ssh_pass 为节点远程登录用户密码
    6. [all]
    7. 192.168.56.11 ansible_port=22 ansible_user="vagrant" ansible_ssh_pass="vagrant"
    8. 192.168.56.12 ansible_port=22 ansible_user="vagrant" ansible_ssh_pass="vagrant"
    9. 192.168.56.13 ansible_port=22 ansible_user="vagrant" ansible_ssh_pass="vagrant"
    10. 192.168.56.14 ansible_port=22 ansible_user="vagrant" ansible_ssh_pass="vagrant"
    11. ; 私有云:
    12. ; VIP 负载模式:
    13. ; 也就是负载均衡器 + keepalived 模式,比如常用的 haproxy + keepalived
    14. ; 本脚本中负载均衡器有 nginxhaproxyenvoy 可供选择,设置 lb_mode 即可进行任意切换。
    15. ; 设置 lb_kube_apiserver_ip 即表示启用 keepalived,请先与服务器提供部门协商保留一个IP作为 lb_kube_apiserver_ip
    16. ; 一般 lb 节点组中有两个节点就够了,lb节点组中第一个节点为 keepalived master 节点,剩下的都为 backed 节点。
    17. ;
    18. ; 节点本地负载模式:
    19. ; 只启动负载均衡器,不启用 keepalived(即不设置 lb_kube_apiserver_ip),
    20. ; 此时 kubelet 链接 apiserver 地址为 127.0.0.1:lb_kube_apiserver_port
    21. ; 使用此模式时请将 lb 节点组置空。
    22. ;
    23. ; 公有云:
    24. ; 不推荐使用 slb 模式,建议直接使用节点本地负载模式。
    25. ; 若使用 slb 模式,请先使用节点本地负载模式进行部署,
    26. ; 部署成功后再切换至 slb 模式:
    27. ; lb_mode 修改为 slb,将 lb_kube_apiserver_ip 设置为购买到的 slb 内网ip
    28. ; 修改 lb_kube_apiserver_port slb 监听端口。
    29. ; 再次运行初始化集群脚本即可切换至 slb 模式。
    30. [lb]
    31. ; 注意etcd集群必须是1,3,5,7...奇数个节点
    32. [etcd]
    33. 192.168.56.11
    34. 192.168.56.12
    35. 192.168.56.13
    36. [kube-master]
    37. 192.168.56.11
    38. 192.168.56.12
    39. 192.168.56.13
    40. [kube-worker]
    41. 192.168.56.11
    42. 192.168.56.12
    43. 192.168.56.13
    44. 192.168.56.14
    45. ; 预留组,后续添加master节点使用
    46. [new-master]
    47. ; 预留组,后续添加worker节点使用
    48. [new-worker]
    49. ; 预留组,后续添加etcd节点使用
    50. [new-etcd]
    51. ; 预留组,后续删除worker角色使用
    52. [del-worker]
    53. ; 预留组,后续删除master角色使用
    54. [del-master]
    55. ; 预留组,后续删除etcd角色使用
    56. [del-etcd]
    57. ; 预留组,后续删除节点使用
    58. [del-node]
    59. ;-------------------------------------- 以下为基础信息配置 ------------------------------------;
    60. [all:vars]
    61. ; 是否跳过节点物理资源校验,Master节点要求2c2g以上,Worker节点要求2c4g以上
    62. skip_verify_node=false
    63. ; kubernetes版本
    64. kube_version="1.16.15"
    65. ; 容器运行时类型,可选项:containerddocker;默认 containerd
    66. container_manager="containerd"
    67. ; 负载均衡器
    68. ; nginxhaproxyenvoy slb 四个选项,默认使用 nginx
    69. lb_mode="nginx"
    70. ; 使用负载均衡后集群 apiserver ip,设置 lb_kube_apiserver_ip 变量,则启用负载均衡器 + keepalived
    71. ; lb_kube_apiserver_ip="192.168.56.15"
    72. ; 使用负载均衡后集群 apiserver port
    73. lb_kube_apiserver_port="8443"
    74. ; 网段选择:pod service 的网段不能与服务器网段重叠,
    75. ; 若有重叠请配置 `kube_pod_subnet` `kube_service_subnet` 变量设置 pod service 的网段,示例参考:
    76. ; 如果服务器网段为:10.0.0.1/8
    77. ; pod 网段可设置为:192.168.0.0/18
    78. ; service 网段可设置为 192.168.64.0/18
    79. ; 如果服务器网段为:172.16.0.1/12
    80. ; pod 网段可设置为:10.244.0.0/18
    81. ; service 网段可设置为 10.244.64.0/18
    82. ; 如果服务器网段为:192.168.0.1/16
    83. ; pod 网段可设置为:10.244.0.0/18
    84. ; service 网段可设置为 10.244.64.0/18
    85. ; 集群pod ip段,默认掩码位 18 16384 ip
    86. kube_pod_subnet="10.244.0.0/18"
    87. ; 集群service ip
    88. kube_service_subnet="10.244.64.0/18"
    89. ; 分配给节点的 pod 子网掩码位,默认为 24 256 ip,故使用这些默认值可以纳管 16384/256=64 个节点。
    90. kube_network_node_prefix="24"
    91. ; node节点最大 pod 数。数量与分配给节点的 pod 子网有关,ip 数应大于 pod 数。
    92. ; https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr
    93. kube_max_pods="110"
    94. ; 集群网络插件,目前支持flannel,calico
    95. network_plugin="flannel"
    96. ; 若服务器磁盘分为系统盘与数据盘,请修改以下路径至数据盘自定义的目录。
    97. ; Kubelet 根目录
    98. kubelet_root_dir="/var/lib/kubelet"
    99. ; docker容器存储目录
    100. docker_storage_dir="/var/lib/docker"
    101. ; containerd容器存储目录
    102. containerd_storage_dir="/var/lib/containerd"
    103. ; Etcd 数据根目录
    104. etcd_data_dir="/var/lib/etcd"

集群部署

  • 若有安全组则需要加上以下安全组策略,规则示例:
授权策略协议类型端口范围授权类型授权对象描述
允许TCP8080地址段访问0.0.0.0/0http 协议访问集群
允许TCP443443地址段访问0.0.0.0/0https 协议访问集群
允许TCP3000032767地址段访问0.0.0.0/0NodePort 访问集群
允许全部-1/-1地址段访问10.244.0.0/18跨节点 Pod 之间互相访问
  • 部署集群:

    1. # 在项目根目录下执行
    2. ansible-playbook -i inventory.ini 90-init-cluster.yml
  • 查看等待 pod 的状态为 runnning:

    1. # 任意master节点下执行
    2. kubectl get po --all-namespaces -w
  • 如果部署失败,想要重置集群,执行:

    1. # 在项目根目录下执行
    2. ansible-playbook -i inventory.ini 99-reset-cluster.yml
  • 其他集群运维操作请查阅项目使用指南