如何安装生产环境下的高可用k8s集群
接上篇
规划k8s集群
本次我预备了6台VMs, 1台作为Jump server,用来部署Ansible并负责在其他5台设备上部署k8s。这台服务器后续可能还要做nfs server。
3台做master,为了给etcd做高可用。(Etcd采用RAFT的算法,需要至少3台服务器部署才可以实现高可用);2台做worker,后续再加几台做worker,同时实践下如何用Kubespray做k8s集群的升级和变更。
总结, 1台堡垒机,k8s cluter:3台master,2台worker。
堡垒机安装必要组件
以下安装均以名叫bill的用户进行,非root用户。后续运行ansible到其他服务器也是bill用户,所以需要其他所有服务器也有bill用户,切bill用户可以免密码进行sudo。
不要嫌麻烦就哪里都用root,这不是个好习惯。
sudo apt updatesudo apt install -y python3-pip sshpass git #安装一些必须插件sudo pip install ansible sudo apt install ansible -y #pip 还是apt安装ansible均可,ansible的版本不能太低,Kubersray安装前会对ansible,python,jinjia等等进行版本检测的。git clone https://github.com/kubernetes-sigs/kubespray.git #我看大部分文档在这里会使用 --recurse-submodules 相关git参数,我没用也没出问题。# submodules相关git参数,是用来完整下载git项目的独立的以另一个git repo存在的子项目的。# 整个kuberspray 就是需要的Kubespray 仓库。具体的目录结构和每个目录的功能,我想有机会的时候单独写一篇。cd kubespray/pip install -r requirements.txt --break-system-packages # --break-system-packages 这个是我加上去的, 确保kubespray可以安装到必须的版本的package,即使整个版本和系统本身冲突。echo $PATH=$PATH:/home/bill/.local/bin #一时不讲究,直接git clone到~目录就装好了。所以加以下$PATHcd inventory/ # inventory 目录下修改inventory.ini 文件,很重要!让Ansible知道你的k8s的集群服务器结构。cp -r inventory/sample inventory/mycluster # 将sample样本目录cp一个出来,命名为你的clster名字(名字不重要,可不可靠这里的Naming Convention)vim inventory.ini # 稍后贴出我修改好的inventory.ini 文件# 以下为在Ansible server的bill账户下生成一个ssh证书pair,并设置让其他k8s服务器(Ansible server的被管理服务器或client)ssh-keygen -t rsa -b 2048ssh-copy-id bill@192.168.4.34ssh-copy-id bill@192.168.4.35ssh-copy-id bill@192.168.4.36ssh-copy-id bill@192.168.4.37ssh-copy-id bill@192.168.4.3ssh bill@192.168.4.36 # 测试是否可以从Ansible server 免密以相同账号登陆ansible client。
#以上就完成了最初的准备,接着就可以开始安装了。
inventory.ini
整个文件非常重要,一定要确保配置正确。
# 先定义所有的服务器,指明了ansible通过ssh登陆client时使用bill用户, ansible_become=yes 意思是bill用户可以sudo执行命令,为了方便我采用了client上设置bill可以免密码sudo。 你也可以用其他方法来实现。
[all]
master-1 ansible_host=192.168.4.36 ansible_user=bill ansible_become=yes
master-2 ansible_host=192.168.4.34 ansible_user=bill ansible_become=yes
master-3 ansible_host=192.168.4.35 ansible_user=bill ansible_become=yes
worker-1 ansible_host=192.168.4.37 ansible_user=bill ansible_become=yes
worker-2 ansible_host=192.168.4.38 ansible_user=bill ansible_become=yes[kube_control_plane]
master-1
master-2
master-3[kube_node]
worker-1
worker-2[etcd]
master-1
master-2
master-3[calico_rr]
# 整个后续讲什么是Calico 的 RR
[k8s_cluster:children]
kube_control_plane
kube_node
安装正式开始
安装确保swapoff和ip_forward等基本配置
既然Ansible已经就绪了,当然是通过Ansible来了,也顺手写个自己的playbook。(现在Chaggpt 已经是相当的牛叉了,我的playbook就是直接说需求让它写的,我一句没改)。
将你写好的playbook 最好放到kubespray的playbooks目录下,和其他kuverspray自己的playbook放一起。
pre_install_k8s.yml
---
- name: Disable Swap and Enable IPv4 Forwardinghosts: allbecome: truetasks:# 禁用 Swap- name: Temporarily disable swapansible.builtin.command: swapoff -a- name: Ensure swap entries are commented out in /etc/fstabansible.builtin.replace:path: /etc/fstabregexp: '^([^#].*swap.*)$'replace: '# \1'- name: Verify swap is disabledansible.builtin.shell: free -h | grep Swapregister: swap_status- debug:msg: "Swap status after disabling: {{ swap_status.stdout }}"# 启用 IPv4 网络转发- name: Temporarily enable IPv4 forwardingansible.builtin.command: sysctl -w net.ipv4.ip_forward=1- name: Persistently enable IPv4 forwardingansible.builtin.lineinfile:path: /etc/sysctl.confregexp: '^net.ipv4.ip_forward'line: 'net.ipv4.ip_forward = 1'create: yes-
把你写好的playbook 运行起来,顺便排排错,热好身就准备一键安装k8s集群了。
ansible-playbook pre_install_k8s.yml -i ../inventory/mycluster/inventory.ini # -i 指定使用特定的inventory文件, 主动加上吧,省得出麻烦。
通过Kubespray 安装Kubernets Cluster
详细看到这里的都是真爱,也相信你已经在上一步执行ansible-palybook时候成功了。接下来要运行ansible来安装整个的kubernets集群,只需要一条命令就可以了。
ansible-playbook -i ../inventory/mycluster/inventory.ini cluster.yml # 在playbooks目录下,执行一个名叫cluster.yml的palybook,接下来几十分钟你喝杯咖啡再回来验收就可以了。(理想还是要有的, 万一实现了呢)
这样整个安装就结束了。下一篇我们做个安装排错,看看我们最后安装过程中常见的错误和解决办法;同时我们对装好未修正过的k8s集群做个验收评估。