当前位置: 首页 > article >正文

别再手动复制粘贴了!用Ansible自动化部署Kubernetes多Master高可用集群(含Haproxy+Keepalived)

从零构建高可用Kubernetes集群Ansible自动化部署实战指南为什么我们需要自动化部署Kubernetes集群在云原生时代Kubernetes已经成为容器编排的事实标准。然而手动部署一个高可用的Kubernetes集群仍然是一项复杂且容易出错的任务。想象一下你需要重复执行数十个步骤在多台服务器上配置系统参数、安装依赖、部署组件——这不仅耗时而且几乎不可能保证环境的一致性。这正是Ansible这类自动化工具大显身手的地方。通过Ansible我们可以将整个部署过程编码化实现一键部署、版本控制和可重复执行。更重要的是当我们需要扩展集群或重建环境时自动化部署能节省大量时间和精力。1. 环境准备与Ansible基础配置1.1 基础设施规划在开始之前我们需要明确集群的架构设计。一个典型的高可用Kubernetes集群包含以下组件3个Master节点运行控制平面组件API Server、Controller Manager、Scheduler等N个Worker节点运行业务工作负载负载均衡层使用HaproxyKeepalived实现API Server的高可用网络插件Calico、Flannel等提供Pod间通信以下是一个示例的主机清单表格主机名IP地址角色备注master01192.168.1.1Master LB同时运行Haproxymaster02192.168.1.2Master LB同时运行Haproxymaster03192.168.1.3Master LB同时运行Haproxyworker01192.168.1.4Worker运行业务Podworker02192.168.1.5Worker运行业务Podvip192.168.1.100虚拟IP由Keepalived管理1.2 Ansible环境配置首先我们需要在控制节点可以是你的本地开发机或其中一台Master节点上安装Ansible# 在Ubuntu/Debian上 sudo apt update sudo apt install -y ansible # 在CentOS/RHEL上 sudo yum install -y epel-release sudo yum install -y ansible创建Ansible项目目录结构k8s-cluster/ ├── inventories/ │ ├── production/ │ │ ├── group_vars/ │ │ ├── host_vars/ │ │ └── hosts │ └── staging/ ├── roles/ │ ├── common/ │ ├── docker/ │ ├── haproxy/ │ ├── keepalived/ │ ├── kubernetes/ │ └── calico/ └── playbooks/ ├── site.yml ├── master.yml └── worker.yml配置inventories/production/hosts文件[masters] master01 ansible_host192.168.1.1 master02 ansible_host192.168.1.2 master03 ansible_host192.168.1.3 [workers] worker01 ansible_host192.168.1.4 worker02 ansible_host192.168.1.5 [load_balancers:children] masters [kube_cluster:children] masters workers2. 系统基础配置自动化2.1 操作系统通用配置创建roles/common/tasks/main.yml文件包含所有节点都需要的基础配置- name: Disable SELinux selinux: state: disabled - name: Disable swap shell: | swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab - name: Configure sysctl parameters sysctl: name: {{ item.key }} value: {{ item.value }} state: present reload: yes with_items: - { key: net.bridge.bridge-nf-call-iptables, value: 1 } - { key: net.ipv4.ip_forward, value: 1 } - { key: vm.swappiness, value: 0 } - name: Install base packages yum: name: {{ packages }} state: present vars: packages: - conntrack - ipvsadm - ipset - iptables - curl - sysstat - libseccomp2.2 内核模块加载为支持Kubernetes的IPVS模式我们需要加载必要的内核模块。创建roles/common/tasks/ipvs.yml- name: Ensure ipvs modules are loaded modprobe: name: {{ item }} state: present with_items: - ip_vs - ip_vs_rr - ip_vs_wrr - ip_vs_sh - nf_conntrack_ipv4 - name: Persist ipvs modules copy: content: | #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 dest: /etc/sysconfig/modules/ipvs.modules mode: 07553. 容器运行时安装与配置3.1 Docker安装创建roles/docker/tasks/main.yml- name: Add Docker repository yum_repository: name: docker-ce description: Docker CE Repository baseurl: https://download.docker.com/linux/centos/$releasever/$basearch/stable gpgcheck: yes gpgkey: https://download.docker.com/linux/centos/gpg enabled: yes - name: Install Docker yum: name: docker-ce-18.09.7 state: present - name: Configure Docker daemon copy: content: | { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m } } dest: /etc/docker/daemon.json - name: Start and enable Docker service: name: docker state: started enabled: yes注意Kubernetes 1.20版本开始逐渐弃用Docker你也可以选择containerd作为容器运行时。配置方式类似但需要调整相关参数。4. 高可用负载均衡部署4.1 Haproxy配置创建roles/haproxy/tasks/main.yml- name: Install Haproxy yum: name: haproxy state: present - name: Configure Haproxy template: src: haproxy.cfg.j2 dest: /etc/haproxy/haproxy.cfg - name: Start Haproxy service: name: haproxy state: restarted enabled: yes对应的模板文件roles/haproxy/templates/haproxy.cfg.j2global log /dev/log local0 log /dev/log local1 notice daemon defaults log global mode tcp timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend k8s-api bind *:6443 default_backend k8s-api backend k8s-api balance roundrobin option tcp-check {% for host in groups[masters] %} server {{ hostvars[host].ansible_hostname }} {{ hostvars[host].ansible_host }}:6443 check {% endfor %}4.2 Keepalived配置创建roles/keepalived/tasks/main.yml- name: Install Keepalived yum: name: keepalived state: present - name: Configure Keepalived template: src: keepalived.conf.j2 dest: /etc/keepalived/keepalived.conf - name: Start Keepalived service: name: keepalived state: restarted enabled: yes模板文件roles/keepalived/templates/keepalived.conf.j2vrrp_script chk_haproxy { script killall -0 haproxy interval 2 weight 2 } vrrp_instance VI_1 { interface {{ ansible_default_ipv4.interface }} state {{ MASTER if inventory_hostname master01 else BACKUP }} virtual_router_id 51 priority {{ 100 if inventory_hostname master01 else (90 if inventory_hostname master02 else 80) }} advert_int 1 authentication { auth_type PASS auth_pass 42 } virtual_ipaddress { {{ k8s_vip }} } track_script { chk_haproxy } }在group_vars/all.yml中定义变量k8s_vip: 192.168.1.1005. Kubernetes控制平面部署5.1 安装Kubernetes组件创建roles/kubernetes/tasks/main.yml- name: Add Kubernetes repository yum_repository: name: kubernetes description: Kubernetes Repository baseurl: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck: no enabled: yes - name: Install kubeadm, kubelet and kubectl yum: name: {{ packages }} state: present disable_gpg_check: yes vars: packages: - kubelet-1.19.0 - kubeadm-1.19.0 - kubectl-1.19.0 - name: Enable kubelet service: name: kubelet enabled: yes5.2 初始化第一个Master节点创建playbooks/master.yml- hosts: master01 become: yes roles: - common - docker - kubernetes tasks: - name: Initialize Kubernetes cluster command: kubeadm init --config/tmp/kubeadm-config.yaml args: creates: /etc/kubernetes/admin.conf register: kubeadm_init - name: Copy admin config to local fetch: src: /etc/kubernetes/admin.conf dest: /tmp/admin.conf flat: yes - name: Deploy Calico network command: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml when: kubeadm_init.rc 05.3 加入其他Master节点在第一个Master节点初始化完成后我们可以获取加入命令kubeadm token create --print-join-command然后创建任务将其他Master节点加入集群- name: Join other masters hosts: masters[1:] become: yes tasks: - name: Join master to cluster command: {{ hostvars[master01].join_command }} --control-plane when: inventory_hostname ! master016. 网络插件与Worker节点配置6.1 部署Calico网络创建roles/calico/tasks/main.yml- name: Download Calico manifest get_url: url: https://docs.projectcalico.org/manifests/calico.yaml dest: /tmp/calico.yaml - name: Apply Calico network command: kubectl apply -f /tmp/calico.yaml when: inventory_hostname master016.2 Worker节点加入集群创建playbooks/worker.yml- hosts: workers become: yes roles: - common - docker - kubernetes tasks: - name: Join worker to cluster command: {{ hostvars[master01].join_command }}7. 验证集群状态在所有节点部署完成后我们可以验证集群状态kubectl get nodes kubectl get pods -n kube-system kubectl get svc以下是一个健康集群应有的核心组件状态组件预期状态副本数kube-apiserverRunning3kube-controller-managerRunning3kube-schedulerRunning3etcdRunning3calico-nodeRunningN3corednsRunning2haproxyRunning3keepalivedRunning38. 高级配置与优化8.1 证书自动续期Kubernetes集群的证书默认有效期为1年我们可以配置自动续期- name: Enable kubelet certificate rotation lineinfile: path: /var/lib/kubelet/config.yaml regexp: ^rotateCertificates: line: rotateCertificates: true state: present - name: Restart kubelet service: name: kubelet state: restarted8.2 集群备份与恢复使用etcdctl备份集群状态ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save snapshot.db8.3 安全加固建议启用Pod安全策略配置网络策略限制Pod间通信使用RBAC严格控制访问权限定期轮换证书和密钥启用审计日志9. 常见问题排查9.1 节点NotReady状态可能原因及解决方案网络插件未正确安装检查Calico/Kube-proxy日志容器运行时问题验证Docker/containerd状态kubelet配置错误检查/var/log/messages和kubelet日志9.2 Pod无法调度检查方向kubectl describe pod pod-name kubectl get events --sort-by.metadata.creationTimestamp9.3 API Server不可用排查步骤验证Haproxy状态检查Keepalived是否维护了VIP确认各Master节点的API Server日志10. 扩展与升级策略10.1 集群扩展添加新Worker节点- name: Add new worker hosts: new_worker become: yes roles: - common - docker - kubernetes tasks: - name: Join new worker command: {{ hostvars[master01].join_command }}10.2 集群升级Kubernetes版本升级步骤升级kubeadm排空节点升级控制平面升级kubelet和kubectl升级Worker节点对应的Ansible任务- name: Upgrade kubeadm yum: name: kubeadm-{{ target_version }} state: present - name: Drain node command: kubectl drain {{ inventory_hostname }} --ignore-daemonsets - name: Upgrade control plane command: kubeadm upgrade apply v{{ target_version }} - name: Upgrade kubelet and kubectl yum: name: {{ item }} state: present with_items: - kubelet-{{ target_version }} - kubectl-{{ target_version }} - name: Uncordon node command: kubectl uncordon {{ inventory_hostname }}

相关文章:

别再手动复制粘贴了!用Ansible自动化部署Kubernetes多Master高可用集群(含Haproxy+Keepalived)

从零构建高可用Kubernetes集群:Ansible自动化部署实战指南 为什么我们需要自动化部署Kubernetes集群? 在云原生时代,Kubernetes已经成为容器编排的事实标准。然而,手动部署一个高可用的Kubernetes集群仍然是一项复杂且容易出错的任…...

在数据爬虫项目中集成 Taotoken 多模型 API 进行智能内容解析

在数据爬虫项目中集成 Taotoken 多模型 API 进行智能内容解析 1. 爬虫与模型集成的典型场景 现代数据爬虫项目常面临非结构化网页内容处理的挑战。传统基于规则或正则表达式的解析方式难以应对多样化的网页结构,而人工标注又存在效率瓶颈。通过集成 Taotoken 提供…...

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

TransUNet在眼底硬渗出物分割中的实战调优指南 眼底硬渗出物的精确分割对糖尿病视网膜病变等疾病的早期诊断至关重要。传统分割方法在复杂病灶边缘处理上表现欠佳,而基于Transformer的TransUNet通过融合CNN的局部特征提取和Transformer的全局上下文建模能力&#xf…...

如何轻松下载B站无水印视频?5分钟掌握BiliDownload完整教程

如何轻松下载B站无水印视频?5分钟掌握BiliDownload完整教程 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload 你是否经常遇到想要保存B站精彩视频却苦于没有官方下载功能的烦恼?想象一…...

通过 curl 命令快速测试 Taotoken API 密钥与端点连通性

通过 curl 命令快速测试 Taotoken API 密钥与端点连通性 1. 准备工作 在开始测试之前,请确保您已准备好以下信息:从 Taotoken 控制台获取有效的 API Key,以及目标模型的 ID。模型 ID 可以在 Taotoken 的模型广场查看,例如 claud…...

别再只懂PTQ了!用PyTorch的prepare_qat手把手搞定量化感知训练(附完整MNIST实战代码)

从PTQ到QAT:PyTorch量化感知训练实战指南 边缘设备部署模型时,精度与效率的平衡一直是工程师们的痛点。当你在手机或IoT设备上运行一个经过PTQ(训练后量化)的模型时,是否遇到过这样的困境:模型体积确实缩小…...

终极指南:三步让老旧Mac焕发新生,突破系统限制免费升级最新macOS

终极指南:三步让老旧Mac焕发新生,突破系统限制免费升级最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您是否还在为老旧Mac…...

国家自然科学基金申请书的LaTeX终极排版方案:5分钟搞定专业格式

国家自然科学基金申请书的LaTeX终极排版方案:5分钟搞定专业格式 【免费下载链接】NSFC-application-template-latex 国家自然科学基金申请书正文(面上项目)LaTeX 模板(非官方) 项目地址: https://gitcode.com/GitHub…...

# 11|装饰器、闭包与 lambda 表达式

很多人在学 Python 的过程中,一看到“装饰器”这三个字就开始紧张。 因为它看起来像这样: @xxx def func():...表面上好像很酷,实际上第一次看到的人往往会问: 这个 @ 到底是什么? 为什么函数上面还能写东西? 闭包和装饰器是什么关系? lambda 又是拿来干嘛的? 这篇文…...

MarsRL框架:多智能体强化学习在物流调度中的应用

1. MarsRL框架概述:当强化学习遇上多智能体推理去年在开发一个物流调度系统时,我遇到了一个典型的多智能体协同问题——如何让数十个AGV小车在动态环境中自主避障和任务分配。传统方法要么需要复杂的全局规划,要么难以适应实时变化。直到尝试…...

2026届最火的降AI率网站推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 需要从源头优化以及后期校正两方同时着手,来降低文本里AIGC也就是人工智能生成内…...

八大网盘直链获取工具:让下载速度飞起来的秘密武器

八大网盘直链获取工具:让下载速度飞起来的秘密武器 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

LLM长时记忆管理:MEMMA架构设计与优化实践

1. 长时记忆管理的核心挑战大型语言模型(LLM)在处理长时记忆时面临三个关键瓶颈。首先是记忆容量限制,模型在单次推理时能调用的上下文窗口有限,即使像GPT-4这样支持128K token的模型,也难以完整保存长期交互中的海量信…...

PC安装macOS终极指南:从零到完美运行的7个实战步骤

PC安装macOS终极指南:从零到完美运行的7个实战步骤 【免费下载链接】OpenCore-Install-Guide Repo for the OpenCore Install Guide 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Install-Guide 想在Windows电脑上体验macOS的流畅与优雅吗&#xf…...

如何快速免费备份微信聊天记录?WeChatMsg终极完整指南

如何快速免费备份微信聊天记录?WeChatMsg终极完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

避开数据坑!用akshare获取涨停板数据时,这几个字段缺失和清洗技巧你必须知道

避开数据坑!用akshare获取涨停板数据时,这几个字段缺失和清洗技巧你必须知道 在量化交易和股票分析中,涨停板数据是研究市场热点和资金流向的重要指标。许多Python开发者使用akshare这个强大的金融数据接口获取涨停板信息,但在实际…...

保姆级教程:在YOLOv5 v6.0/v6.1中一键集成最新IOU损失(EIoU/SIoU等),附完整代码与避坑指南

YOLOv5进阶实战:五大IOU损失函数集成指南与性能优化解析 在目标检测领域,边界框回归的精度直接影响模型性能。YOLOv5作为工业界广泛采用的检测框架,其默认的CIoU损失函数虽表现稳定,但近年来涌现的EIoU、SIoU、Alpha-IoU等改进方案…...

MATLAB R2023b + SolidWorks 2024:最新版Simscape Multibody Link插件安装与配置避坑全记录

MATLAB R2023b与SolidWorks 2024协同实战:Simscape Multibody Link插件深度配置指南 当机械仿真遇上版本迭代,总会遇到各种"水土不服"的问题。上周刚升级MATLAB R2023b和SolidWorks 2024的王工就遇到了这样的困扰——按照三年前的教程安装Sims…...

保姆级教程:在Gazebo仿真和真实TurtleBot3上,手把手调试Hector SLAM的3个关键参数

深度调优Hector SLAM:从Gazebo仿真到TurtleBot3实机的参数实战指南 当你在Gazebo中看着TurtleBot3缓慢构建地图,或在实验室里调试真实机器人时,是否遇到过这些问题:地图边缘出现锯齿状抖动、机器人转弯时定位突然漂移、或者树莓派…...

Navicat连接GaussDB主备版后,别忘了设置‘连接配置文件’来管理多环境

Navicat连接GaussDB主备版的多环境配置管理实战 在数据库管理工作中,我们常常需要同时应对开发、测试和生产等多个环境。每次切换环境时手动修改连接参数不仅效率低下,还容易出错。Navicat作为一款强大的数据库管理工具,其"连接配置文件…...

Fiddler Classic 2024保姆级配置:从下载到抓取iOS App HTTPS请求(含汉化包)

Fiddler Classic 2024全流程实战:iOS应用HTTPS抓包与深度调试指南 当你在iOS应用中发现某个API请求异常,但控制台日志却显示一切正常时,是否曾感到束手无策?作为移动端开发者,我们经常需要透视应用与服务器之间的真实通…...

Windows HEIC缩略图完整指南:三步搞定iPhone照片预览难题

Windows HEIC缩略图完整指南:三步搞定iPhone照片预览难题 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你可能经常…...

抄表工福音:一文搞懂MBus二总线如何用两根线搞定供电和通信

MBus二总线技术:如何用两根线实现供电与通信一体化 清晨六点,某小区的水表抄表员老张已经开始了他的日常工作。与以往不同的是,他不再需要挨家挨户敲门查看水表,而是手持一台终端设备,在小区集中抄表箱前轻松完成了数百…...

Cura 3D打印切片软件:从模型到成品的完整指南

Cura 3D打印切片软件:从模型到成品的完整指南 【免费下载链接】Cura 项目地址: https://gitcode.com/gh_mirrors/cur/Cura Cura是业界领先的开源3D打印切片软件,由Ultimaker开发,能够将3D模型转换为打印机可识别的G-code指令。这款强…...

UnityLive2DExtractor:快速提取Live2D资源的终极完整指南

UnityLive2DExtractor:快速提取Live2D资源的终极完整指南 【免费下载链接】UnityLive2DExtractor Unity Live2D Cubism 3 Extractor 项目地址: https://gitcode.com/gh_mirrors/un/UnityLive2DExtractor 你是否正在寻找一款能够快速提取Unity Live2D资源的工…...

League Akari:你的英雄联盟游戏体验进化指南

League Akari:你的英雄联盟游戏体验进化指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 想象一下这样的场景:你正在…...

【华尔街量化团队内部文档流出】:Python高频引擎GC停顿归因分析及无GC实时模式部署手册

更多请点击: https://intelliparadigm.com 第一章:Python高频交易引擎GC停顿问题的行业认知与定位 在低延迟高频交易(HFT)系统中,Python 因其生态丰富、开发效率高而被广泛用于策略回测与订单路由层,但其默…...

Audio Router:Windows音频智能路由解决方案,实现应用级音频设备精准分流

Audio Router:Windows音频智能路由解决方案,实现应用级音频设备精准分流 【免费下载链接】audio-router Routes audio from programs to different audio devices. 项目地址: https://gitcode.com/gh_mirrors/au/audio-router 在现代数字生活中&a…...

嵌入式固件“隐形后门”检测术:基于C语言AST重构的篡改特征扫描框架(开源工具链+37个真实IoT固件样本验证)

更多请点击: https://intelliparadigm.com 第一章:嵌入式固件“隐形后门”检测术:基于C语言AST重构的篡改特征扫描框架(开源工具链37个真实IoT固件样本验证) 传统二进制静态分析在面对混淆、加壳或编译器优化后的嵌入…...

5分钟快速上手gInk:Windows免费屏幕标注工具的终极简单指南

5分钟快速上手gInk:Windows免费屏幕标注工具的终极简单指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否曾在演示时想要直接在屏幕上圈出重点&…...