kubeadm HA集群搭建指南

0x00 文章楔子

本文旨在通过最简易的方式指导读者搭建HA kubernetes 1.11集群

通过部署脚本驱动kubeadm工具进行自动化部署,自动启动keepalived负载均衡,calico网络插件,并且开启kube-proxy的IPVS模式。

本文中的自动化部署脚本可以在Lentil1016/kubeadm-ha找到,欢迎Star/Fork/提issue和PR。

在我的环境上进行示例自动化部署的录像可以在该链接查看

0x01 Kubernetes集群搭建

集群结构摘要

Master是集群的管理者,负责监控应用运行状态,维护应用运行,如发布工作任务、重启应用、部署升级应用等

Worker(节点),也被称为Minion,即从属主机,是Kubernetes集群中的一台工作机器。每一个节点都包含了Pod运行所需的必要服务,例如docker/kubelet/kube-proxy。

Kubernetes集群的基本部署步骤:

  1. 所有节点安装docker
  2. harbor节点安装harbor
  3. 所有master和minion节点安装kubelet kubeadm kubectl
  4. 初始化master节点,并启动Calico容器
  5. 将worker节点join到集群中

各个机器的主机信息以及IP分布如下:

  • Distribute: CentOS 7
  • Docker: 17.03.2-ce
  • Kernel: 4.4.152-1.el7.elrepo.x86_64
  • Kubernetes: 1.11.0
  • NetPlugin: Calico
  • Proxy-Mode: IPVS
  • Master-Mode: HA Master
  • DNS: CoreDNS
Host NameRoleIP
harborimage registry10.130.38.80
centos-7-x86-64-29-80master-110.130.29.80
centos-7-x86-64-29-81master-210.130.29.81
centos-7-x86-64-29-82master-310.130.29.82
Virtual IP10.130.29.83
node1worker10.130.38.105
node2worker10.130.38.106
node3worker10.130.38.107

进行系统配置

在所有机器上执行下面的脚本,配置注记:

  • 关闭防火墙、selinux
  • 关闭系统的Swap,Kubernetes 1.8开始要求。
  • 关闭linux swap空间的swappiness
  • 配置L2网桥在转发包时会被iptables的FORWARD规则所过滤,该配置被CNI插件需要,更多信息请参考Network Plugin Requirements
  • 开启IPVS

执行sysctl -p报错请参考centos7添加bridge-nf-call-ip6tables出现No such file or directory

Kubernetes要求集群中所有机器具有不同的Mac地址、产品uuid、Hostname。可以使用如下命令查看Mac和uuid

安装配置Docker

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,因此docker安装完成后,还需要手动修改iptables规则。


安装私有镜像库

如果不能翻墙,需要使用本文提供的私有镜像源,则还需要为docker做如下配置,将K8s官方镜像库的几个域名设置为insecure-registry,然后设置hosts使它们指向私有源。

下载链接:https://pan.baidu.com/s/17PV_VRYIbfmPz1qiiR_yGg 密码:newp,随后将该文件放置到harbor机器上,并在harbor主机上加载、启动该镜像

该镜像库中包含如下镜像,全部来源于官方镜像站。

安装配置kubernetes

基本安装

首先下载链接:https://pan.baidu.com/s/1tOIFgnexs25XWHxitLmmVQ 密码:lqth,并放置在k8s各个master和worker主机上

配置免密码登陆

将该公钥复制,并分别登陆到master-1 master-2 master-3的root用户,将它令起一行粘贴到 ~/.ssh/authorized_keys 文件中,包括master-1自己

复制完成后,从master-1上分别登陆master-1 master-2 master-3测试是否可以免密码登陆(请不要跳过这一步),可以的话便可以继续执行下一步

部署HA Master

HA Master的部署过程已经自动化,请在master-1上执行如下命令,并注意修改IP和Hostname

可以在该链接查看安装全过程的录像,安装结束后会打印出如下的信息,最后一行为加入集群的命令,其中加入集群的IP已经被更换为了高可用的VIP。

加入work node

现在可以将各节点入编到集群中。join command是由kubeadm动态生成的,其基本形式如下

其中包含了节点入编集群所需要携带的验证token,以防止外部恶意的节点进入集群。每个token自生成起24小时后过期。届时如果需要加入新的节点,则需要重新生成新的join token,请使用下面的命令生成,注意改写IP:

随后到worker节点执行刚刚生成的join command即可将该节点编入集群。

若启动失败,请尝试检查Kuber DNS是否正常运作。

正常结果应当为:

参考 troubleshooting docs进行问题排查


Lentil Sun
Channelsoft Software Engineer
Mail: lentil1016@gmail.com
Site: https://lentil1016.cn
Github: https://github.com/Lentil1016

文章已创建 13

8 个评论 在 “kubeadm HA集群搭建指南

  1. 按照你的脚本跑到最后报错了,能问下是什么原因吗?
    Error from server (Timeout): error when retrieving current configuration of:
    Resource: “rbac.authorization.k8s.io/v1beta1, Resource=clusterroles”, GroupVersionKind: ….
    from server for: “https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/master/calico/rbac.yaml”: the server was unable to return a response in the time allotted, but may still be processing the request (get clusterroles.rbac.authorization.k8s.io calico-node)
    Error from server (Timeout): error when retrieving current configuration of:

    1. 感谢你的阅读,本文提供的脚本改编自该官方文档,并且经过多个环境的测试,该报错信息我没有遇到过,无法根据你提供的日志为你提供更多线索。
      考虑是在第一次执行kubectl apply命令时遇到错误,因此应当从apiserver开始排查问题,建议你尝试以下几点以对该问题产生进一步的理解:
      1.重新执行该脚本进行部署,确认该问题能够在你的环境上复现
      2.确认这个问题为0号问题,也即在抵达这个错误点前,你更早的集群初始化过程没有其他错误,并与这个DEMO中的output基本相符
      3.尝试运行kubectl get/apply等命令,并监控apiserver日志,在apiserver容器/apiserver和kubelet的连接这两项关键点上排查问题
      4.尝试在google上搜索你的错误日志
      如果你的问题依然无法得到解决,请在kubernetes项目提交issue

  2. 我看了脚本,第188行:
    cp -f /etc/kubernetes/admin.conf ${HOME}/.kube/config
    这个admin.conf 是从哪里来的 ?脚本里并没有生成啊

  3. harbor.io:1180/system/k8s-repo:v1.11.0是基于register创建的image还是harbor呀?我用harbor创建了私有仓库,但push的时候必须指定项目名,无法push类似“k8s.gcr.io/etcd-amd64:3.2.18”结构的镜像

    1. 是根据registry:2镜像改造的,harbor不支持两段式的镜像名,这也正是我单独把k8s相关镜像拿出来放进registry:2的原因

  4. 大神,学习了你的1.13.0的安装部署,https://www.kubernetes.org.cn/4948.html
    现在自己想在你的默认镜像里面加calico-kube-controller 但折腾了一下,还是不知道怎么去修改这个 harbor.io:1180/system/k8s-repo:v1.13.0 这个
    docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    6d8cff4a017a harbor.io:1180/system/k8s-repo:v1.13.0 “/entrypoint.sh /e…” 4 minutes ago Up 4 minutes 0.0.0.0:80->5000/tcp repo

    能否指点一下呢,多谢了:)

大鸟进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部