尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DevOps项目笔记一: 基于 Ansible 的多节点基础环境自动化

DevOps项目笔记一: 基于 Ansible 的多节点基础环境自动化 DevOps Lab Phase 1: 基于 Ansible 的多节点基础环境自动化1. 阶段目标本项目最终目标是搭建一套“小而全”的 DevOps 实验环境后续会逐步加入AnsibleDockerKubernetesJava / Spring BootJenkinsCI/CDELK私有镜像仓库日志收集滚动发布故障排查版本回滚Phase 1 不安装 Kubernetes而是先解决最基础的问题虚拟机规划 ↓ 固定主机身份 ↓ 网络互通 ↓ SSH 免密 ↓ Ansible 控制 ↓ 统一 Linux 初始化 ↓ K8s 节点内核初始化 ↓ 固定 IP ↓ Git / Gitee 保存项目完成这一阶段后后面的 Docker、Kubernetes 等软件就可以通过 Ansible 自动化安装而不需要逐台 SSH 操作。2. 实验环境规划宿主机内存只有 16GB因此不能给 5 台虚拟机都分配 4GB。主机IP用户内存用途k8s-master192.168.205.141master2GBKubernetes Control Planek8s-node1192.168.205.142node12GBKubernetes Workerk8s-node2192.168.205.143node22GBKubernetes Workerdevops192.168.205.144devops2GBAnsible / 后续 Jenkins、Registryelk192.168.205.145elk4GBElasticsearch / Logstash / Kibana操作系统: Ubuntu 20.04网络: 网段192.168.205.0/24网关192.168.205.2网卡:ens33网络管理: NetworkManager3. 确认虚拟机网络首先在每台机器查看网卡和 IPip-braddr例如 ELKlo UNKNOWN 127.0.0.1/8 ens33 UP 192.168.205.145/24查看路由iproute得到类似default via 192.168.205.2 dev ens33 192.168.205.0/24 dev ens33 ...此时发现地址原本来自 DHCP因此后面还需要转换为静态 IP。4. 设置五台机器的 hostname在 Master:sudohostnamectl set-hostname k8s-master在 Node1:sudohostnamectl set-hostname k8s-node1在 Node2:sudohostnamectl set-hostname k8s-node2在 DevOps:sudohostnamectl set-hostname devops在 ELK:sudohostnamectl set-hostname elk5. 测试虚拟机之间的网络在 devops 上测试其他节点ping-c2192.168.205.141ping-c2192.168.205.142ping-c2192.168.205.143ping-c2192.168.205.145测试 VMware 网关ping-c2192.168.205.2测试外网ping-c28.8.8.8测试 DNSping-c2www.baidu.com6. 把 devops 作为 Ansible 控制节点在 devops 上安装 Ansiblesudoaptupdatesudoaptinstall-yansible openssh-clientvimgit检查版本ansible--version当前实际版本Ansible 2.9.6 Python 3.8.27. 配置 SSH 免密登录在 devops 生成 SSH Keyssh-keygen-ted25519复制公钥到各节点ssh-copy-id master192.168.205.141 ssh-copy-id node1192.168.205.142 ssh-copy-id node2192.168.205.143 ssh-copy-id elk192.168.205.145测试sshmaster192.168.205.141hostnamesshnode1192.168.205.142hostnamesshnode2192.168.205.143hostnamesshelk192.168.205.145hostname8. 创建 DevOps Lab 项目目录mkdir-p~/devops-lab/ansible/{inventory,scripts}cd~/devops-lab/ansible当前目录规划devops-lab/ └── ansible/ ├── ansible.cfg ├── init.yml ├── network.yml ├── inventory/ │ └── hosts.ini └── scripts/ └── init.sh9. 编写 Ansible Inventory创建inventory/hosts.ini[k8s_control_plane] k8s-master ansible_host192.168.205.141 ansible_usermaster [k8s_workers] k8s-node1 ansible_host192.168.205.142 ansible_usernode1 k8s-node2 ansible_host192.168.205.143 ansible_usernode2 [k8s_nodes:children] k8s_control_plane k8s_workers [devops_servers] devops ansible_host192.168.205.144 ansible_connectionlocal [elk_servers] elk ansible_host192.168.205.145 ansible_userelk10. 配置 ansible.cfg创建ansible.cfg[defaults] inventory inventory/hosts.ini host_key_checking False11. 第一次测试 Ansibleansible all-mping12. 验证 sudo 权限ansible all-b-mcommand-awhoami13. 编写统一初始化脚本 init.sh创建scripts/init.sh详情见代码仓库devops-labhttps://gitee.com/knight-puno/devops-lab14. init.sh 做了什么所有节点都会统一完成设置 hostname安装基础工具启用 SSH启用 chrony配置/etc/hosts15. Kubernetes 节点额外初始化对于k8s-master、k8s-node1、k8s-node2脚本还会做以下准备关闭 Swap加载 overlay加载 br_netfilter开启 IPv4 Forwarding操作作用不做会怎样关闭 Swap让 Kubelet 准确判断节点真实可用内存Kubelet 启动报错集群初始化失败加载 overlay提供 OverlayFS 内核支持容器运行时无法正常工作加载 br_netfilter让 Linux bridge 流量经过 iptablesService 负载均衡失效开启 IPv4 转发允许 Linux 内核转发数据包CNI 插件报错Pod 无法通信16. 编写 init.yml创建init.yml----hosts:k8s_nodestasks:-name:Initialize k8s nodesscript:./scripts/init.sh {{ ansible_hostname }} k8s-hosts:devops_serverstasks:-name:Initialize devops serverscript:./scripts/init.sh {{ ansible_hostname }} common-hosts:elk_serverstasks:-name:Initialize elk serverscript:./scripts/init.sh {{ ansible_hostname }} common17. Ansible 2.9 的 script 兼容问题将 script 模块写成 free-form 形式以避免兼容性问题。18. Playbook 语法检查ansible-playbook --syntax-check init.yml19. 先灰度测试一个 Workeransible-playbook init.yml--limitk8s-node120. 验收 k8s-node1ansible k8s-node1-ahostnameansible k8s-node1-aswapon --showansible k8s-node1-asysctl net.ipv4.ip_forwardansible k8s-node1-mshell-alsmod | grep -E overlay|br_netfilteransible k8s-node1-agetent hosts k8s-master21. 初始化全部服务器ansible-playbook init.yml22. 批量检查服务器状态ansible all-ahostnameansible all-afree -h23. K8s 三节点综合检查ansible k8s_nodes-mshell-aecho $(hostname); swapon --show; sysctl net.ipv4.ip_forward; lsmod | grep -E overlay|br_netfilter24. 为什么还需要固定 IPKubernetes 尤其是 Control Plane 不适合随意更换 IP因此需要将 5 台全部改为静态地址。25. 确认网络由 NetworkManager 管理systemctl is-active NetworkManager nmcli device status26. 创建 network.yml创建network.yml该 Playbook 负责把当前 DHCP 地址转换为静态 IPIP 直接从 Inventory 的ansible_host变量读取。27. 为什么 network.yml 使用 serial: 1修改服务器网络属于高风险操作使用serial: 1确保一次只修改一台避免整个环境同时断开。28. network.yml 中遇到的 devops IP 问题必须在 Inventory 中为 devops 主机显式设置ansible_host192.168.205.144否则变量解析会出错。29. 查看 ansible_hostansible all-mdebug-avaransible_host30. 先灰度测试静态 IPansible-playbook network.yml--limitk8s-node131. 验证静态 IPansible k8s-node1-mpingansible k8s-node1-mshell-aip -4 -br addr show ens33ansible k8s-node1-mshell-aip route | grep default32. 测试静态网络的 Internet 与 DNSping-c2192.168.205.2ping-c28.8.8.8 getent hosts www.baidu.com33. 批量配置静态 IP# 排除 devopsansible-playbook network.yml--limitall:!devops# 最后单独操作 devopsansible-playbook network.yml--limitdevops34. 最终静态 IP主机IP子网掩码k8s-master192.168.205.141/24k8s-node1192.168.205.142/24k8s-node2192.168.205.143/24devops192.168.205.144/24elk192.168.205.145/24网关: 192.168.205.2DNS: 192.168.205.2, 8.8.8.8NetworkManager:ipv4.methodmanual35. 当前仓库文件devops-lab/ ├── README.md ├── .gitignore ├── docs/ │ └── phase1.md └── ansible/ ├── ansible.cfg ├── init.yml ├── network.yml ├── inventory/ │ └── hosts.ini └── scripts/ └── init.sh36. 将项目纳入 Gitcd~/devops-labgitinitgitadd.gitcommit-mfeat: complete phase1 infrastructure initialization37. 关联 Giteegitremoteaddorigin https://gitee.com/knight-puno/devops-lab.gitgitbranch-Mmastergitpush-uorigin master38. Phase 1 最终验收五台虚拟机互通 OK五台 hostname OKSSH 免密 OKAnsible Inventory OKansible all -m pingOKAnsible sudo OKLinux 公共初始化 OK/etc/hostsOKchrony OKK8s 三节点 Swap0 OK39. Phase 1 中最重要的经验不要一开始就手工维护所有服务器使用 Ansible 进行集中管理。自动化必须考虑幂等与重复执行配置文件应该做到执行一次正常执行第二次也正常。自动化修改网络必须灰度采用先单节点验证再批量执行并使用serial: 1。软件版本会影响自动化语法注意 Ansible、Python 等软件的版本兼容性。Kubernetes 集群创建前必须固定网络基础提前解决 hostname、IP、DNS、swap、内核参数等问题。40. 下一阶段Phase 1 已结束接下来请参考Phase 2: Docker Kubernetes Container Runtime。计划新增ansible/ ├── docker.yml ├── kubernetes.yml └── scripts/ ├── docker-install.sh ├── cri-dockerd-install.sh └── k8s-install.sh下一步首先实现Ansible ↓ 安装 Docker Engine ↓ 配置 Docker daemon ↓ systemd cgroup ↓ 启动 Docker ↓ 验证 docker info ↓ 安装 cri-dockerd ↓ 启动 cri-docker.service ↓ 验证 /run/cri-dockerd.sockDocker部署到k8s-master,k8s-node1,k8s-node2,devopscri-dockerd只部署到k8s-master,k8s-node1,k8s-node2
返回列表