一、目的

本文档用于介绍,如何快速在生产环境安装一个稳定运行的kubernetes集群,用于运行项目微服务。

二、主机规划

主机名称 角色 IP地址 基础软件
rancher 管理k8s集群 192.168.130.5 docker-ce
k8s-master01 k8s集群主节点 192.168.130.6 docker-ce
k8s-master02 k8s集群从节点 192.168.130.7 docker-ce

以下均以「主机名称」说明在哪台主机上操作。所有节点均为Centos 7。

三、节点 OS 调优

3.1 内核调优

  1. echo "
  2. net.bridge.bridge-nf-call-ip6tables=1
  3. net.bridge.bridge-nf-call-iptables=1
  4. net.ipv4.ip_forward=1
  5. net.ipv4.conf.all.forwarding=1
  6. net.ipv4.neigh.default.gc_thresh1=4096
  7. net.ipv4.neigh.default.gc_thresh2=6144
  8. net.ipv4.neigh.default.gc_thresh3=8192
  9. net.ipv4.neigh.default.gc_interval=60
  10. net.ipv4.neigh.default.gc_stale_time=120
  11. #参考 https://github.com/prometheus/node_exporter#disabled-by-default
  12. kernel.perf_event_paranoid=-1
  13. #sysctls for k8s node config
  14. net.ipv4.tcp_slow_start_after_idle=0
  15. net.core.rmem_max=16777216
  16. fs.inotify.max_user_watches=524288
  17. kernel.softlockup_all_cpu_backtrace=1
  18. kernel.softlockup_panic=0
  19. kernel.watchdog_thresh=30
  20. fs.file-max=2097152
  21. fs.inotify.max_user_instances=8192
  22. fs.inotify.max_queued_events=16384
  23. vm.max_map_count=262144
  24. fs.may_detach_mounts=1
  25. net.core.netdev_max_backlog=16384
  26. net.ipv4.tcp_wmem=4096 12582912 16777216
  27. net.core.wmem_max=16777216
  28. net.core.somaxconn=32768
  29. net.ipv4.ip_forward=1
  30. net.ipv4.tcp_max_syn_backlog=8096
  31. net.ipv4.tcp_rmem=4096 12582912 16777216
  32. net.ipv6.conf.all.disable_ipv6=1
  33. net.ipv6.conf.default.disable_ipv6=1
  34. net.ipv6.conf.lo.disable_ipv6=1
  35. kernel.yama.ptrace_scope=0
  36. vm.swappiness=0
  37. # 可以控制core文件的文件名中是否添加pid作为扩展。
  38. kernel.core_uses_pid=1
  39. # Do not accept source routing
  40. net.ipv4.conf.default.accept_source_route=0
  41. net.ipv4.conf.all.accept_source_route=0
  42. # Promote secondary addresses when the primary address is removed
  43. net.ipv4.conf.default.promote_secondaries=1
  44. net.ipv4.conf.all.promote_secondaries=1
  45. # Enable hard and soft link protection
  46. fs.protected_hardlinks=1
  47. fs.protected_symlinks=1
  48. # 源路由验证
  49. # see details in https://help.aliyun.com/knowledge_detail/39428.html
  50. net.ipv4.conf.all.rp_filter=0
  51. net.ipv4.conf.default.rp_filter=0
  52. net.ipv4.conf.default.arp_announce = 2
  53. net.ipv4.conf.lo.arp_announce=2
  54. net.ipv4.conf.all.arp_announce=2
  55. # see details in https://help.aliyun.com/knowledge_detail/41334.html
  56. net.ipv4.tcp_max_tw_buckets=5000
  57. net.ipv4.tcp_syncookies=1
  58. net.ipv4.tcp_fin_timeout=30
  59. net.ipv4.tcp_synack_retries=2
  60. kernel.sysrq=1
  61. " >> /etc/sysctl.conf

接着执行 sysctl -p命令。

3.2 nofile

  1. cat >> /etc/security/limits.conf <<EOF
  2. * soft nofile 65535
  3. * hard nofile 65536
  4. EOF

3.3 关闭防火墙

  1. systemctl disable firewalld.service

3.4 关闭selinux

  1. sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

四、Docker安装

每台主机均使用 root 用户登录,每台均安装 docker-ce,安装命令为。

  1. mkdir -p /etc/docker
  2. tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "oom-score-adjust": -1000,
  5. "data-root":"/var/lib/docker",
  6. "log-driver":"json-file",
  7. "log-opts":{
  8. "max-size":"100m",
  9. "max-file":"3"
  10. },
  11. "default-address-pools":[
  12. {
  13. "base":"10.168.0.0/16",
  14. "size":24
  15. }
  16. ],
  17. "max-concurrent-downloads":50,
  18. "max-concurrent-uploads":50,
  19. "registry-mirrors":[
  20. "https://x6kx40rp.mirror.aliyuncs.com",
  21. "https://hub-mirror.c.163.com",
  22. "https://docker.mirrors.ustc.edu.cn",
  23. "https://registry.docker-cn.com"
  24. ],
  25. "storage-driver": "overlay2",
  26. "storage-opts": [
  27. "overlay2.override_kernel_check=true"
  28. ]
  29. }
  30. EOF
  31. yum install -y yum-utils device-mapper-persistent-data lvm2
  32. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  33. yum makecache fast
  34. yum -y install docker-ce
  35. systemctl enable docker
  36. systemctl daemon-reload
  37. systemctl restart docker

对于 CentOS 系统,docker.service 默认位于/usr/lib/systemd/system/docker.service,编辑docker.service,添加以下参数。

  • 防止 docker 服务 OOM: OOMScoreAdjust=-1000
  • 开启 iptables 转发链: ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

配置完成后重启服务器。

五、Rancher安装

在主机 rancher 上,执行如下命令。

  1. docker run -d \
  2. --name rancher \
  3. --restart=unless-stopped \
  4. --privileged \
  5. -p 80:80 -p 443:443 \
  6. -v /data/rancher:/var/lib/rancher \
  7. registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.5.16

待容器拉取完毕后1分钟后进入页面,首次进入需要设置新密码。

使用rancher快速建立一套生产可用的k8s集群 - 图1

输入密码后进入下一个页面,输入rancher的地址,如有域名建议使用域名代替IP。

使用rancher快速建立一套生产可用的k8s集群 - 图2

Rancher的这个页面可以支持中文显示,接下来创建集群的操作只用鼠标点击即可完成。

使用rancher快速建立一套生产可用的k8s集群 - 图3

六、国内加速

进入系统设置,找到system-default-registry选项,点击升级。

使用rancher快速建立一套生产可用的k8s集群 - 图4

填入registry.cn-hangzhou.aliyuncs.com

使用rancher快速建立一套生产可用的k8s集群 - 图5

七、集群创建

点击添加集群,进入创建K8S集群页面,点击自定义。

使用rancher快速建立一套生产可用的k8s集群 - 图6

按需选择k8s版本,网络插件无特殊情况使用默认的Canal即可。

使用rancher快速建立一套生产可用的k8s集群 - 图7

八、注册节点

8.1 创建Master节点

选择Etcd角色和Control角色,点击下方复制到剪切板。

使用rancher快速建立一套生产可用的k8s集群 - 图8

ssh进入master节点粘贴命令。

使用rancher快速建立一套生产可用的k8s集群 - 图9

8.2 创建Worker节点

选择Worker角色,点击下方复制到剪切板。

使用rancher快速建立一套生产可用的k8s集群 - 图10

ssh进入到worker节点粘贴命令。

使用rancher快速建立一套生产可用的k8s集群 - 图11

此时到Rancher管理页面,点击全局,看到有刚才创建的k8s集群:

使用rancher快速建立一套生产可用的k8s集群 - 图12

点击主机,在这里可以看到集群部署过程中的各种状态,最终出现绿色的Active状态时,即表示K8S集群Master节点创建成功。

8.3 集群初始化中

使用rancher快速建立一套生产可用的k8s集群 - 图13

8.4 集群初始化完毕

如果后续需要添加节点,回到全局页面点右边三个点就能进入注册页面即可。

使用rancher快速建立一套生产可用的k8s集群 - 图14

八、项目/命名空间

进入集群的项目/命名空间。

使用rancher快速建立一套生产可用的k8s集群 - 图15

在此页面点击添加项目,我们来添加一个项目测试。

使用rancher快速建立一套生产可用的k8s集群 - 图16

这里可以给项目设置一些默认配置。

使用rancher快速建立一套生产可用的k8s集群 - 图17

接下来给项目添加命名空间test。

使用rancher快速建立一套生产可用的k8s集群 - 图18

进入项目。

使用rancher快速建立一套生产可用的k8s集群 - 图19

尝试部署一个服务,输入部署服务的名称、命名空间、docker镜像、端口映射规则等。

使用rancher快速建立一套生产可用的k8s集群 - 图20

点击启动。

使用rancher快速建立一套生产可用的k8s集群 - 图21

等待一段时间后。

使用rancher快速建立一套生产可用的k8s集群 - 图22

找到暴露的Nodeport入口。

使用rancher快速建立一套生产可用的k8s集群 - 图23

直接打开了nginx页面。

使用rancher快速建立一套生产可用的k8s集群 - 图24

九、收尾

根据以上步骤操作,可创建出一个在生产稳定运行的k8s集群。