从 0 开始:用 Ansible 自动化部署 K8s 集群(VMware 环境 + MobaXterm)
如果你想在 VMware 虚拟机里,从 0 开始用 Ansible 自动化部署 K8s 集群,还打算用 MobaXterm 来操作 SSH,那这篇博客就是为你量身定做的!接下来,咱们一步步把这个过程搞清楚。
一、前期准备:搭建 VMware 虚拟机环境
(一)安装 VMware Workstation
首先,你得去 VMware 官网下载并安装 VMware Workstation(根据自己的操作系统选对应的版本,Windows 或者 Linux 都可以)。安装过程很简单,按照提示一步一步来就行。
(二)创建虚拟机模板
- 打开 VMware Workstation,点击 "创建新的虚拟机",选择 "自定义(高级)",然后点击 "下一步"。
- 硬件兼容性选默认的就行,继续 "下一步"。
- 选择 "稍后安装操作系统",点击 "下一步"。
- 客户机操作系统选 "Linux",版本选 "CentOS 7 64 位"(因为 K8s 在 CentOS 7 上部署比较稳定),点击 "下一步"。
- 给虚拟机起个名字,比如 "k8s-template",再选个存放虚拟机文件的位置,点击 "下一步"。
- 处理器配置方面,至少给 2 个 CPU 核心,这样后续运行 K8s 会更流畅,点击 "下一步"。
- 内存至少给 2GB,点击 "下一步"。
- 网络类型选 "桥接网络",这样虚拟机可以和宿主机在同一网段,方便后续 SSH 连接,点击 "下一步"。
- I/O 控制器、磁盘类型都选默认的,点击 "下一步"。
- 选择 "创建新虚拟磁盘",点击 "下一步"。
- 磁盘大小给 20GB 以上,勾选 "将虚拟磁盘拆分为多个文件",点击 "下一步"。
- 磁盘文件名保持默认,点击 "完成"。
(三)安装 CentOS 7 系统
- 选中刚创建的 "k8s-template" 虚拟机,点击 "编辑虚拟机设置",在 "CD/DVD (IDE)" 里选择 CentOS 7 的 ISO 镜像文件,然后点击 "确定"。
- 启动虚拟机,进入 CentOS 7 的安装界面。选择 "Install CentOS 7"。
- 语言选择 "English" 或者 "中文(简体)",点击 "Continue"。
- 在安装信息摘要里,点击 "Installation Destination",选择刚才创建的虚拟磁盘,点击 "Done"。
- 点击 "Network & Host Name",打开网络开关,设置主机名为 "k8s-template",然后点击 "Done"。
- 点击 "Begin Installation" 开始安装。
- 安装过程中,设置 root 密码(比如 "123456",生产环境要设复杂密码),也可以创建一个普通用户(比如 "ansible",密码也设为 "123456"),并把这个用户加入 "sudoers" 组(后续用 Ansible 的时候需要 sudo 权限)。
- 安装完成后,点击 "Reboot" 重启虚拟机。
(四)配置模板虚拟机
- 重启后,登录系统(可以用 root 或者刚创建的普通用户)。
- 关闭防火墙:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
- 关闭 SELinux:
编辑/etc/selinux/config文件,把SELINUX=enforcing改成SELINUX=disabled,然后重启虚拟机。
- 配置 yum 源(可选,默认的源可能下载速度慢):
可以替换成阿里云的 yum 源,执行以下命令:
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum clean all
sudo yum makecache
- 安装必要的工具:
sudo yum install -y net-tools vim wget
- 配置 SSH(确保可以用 MobaXterm 远程连接):
检查/etc/ssh/sshd_config文件,确保PermitRootLogin yes(如果需要 root 登录)或者PasswordAuthentication yes(允许密码认证),然后重启 sshd 服务:
sudo systemctl restart sshd
- 拍摄快照:
在 VMware Workstation 里,选中 "k8s-template" 虚拟机,点击 "虚拟机"->"快照"->"拍摄快照",起个名字比如 "template-base",这样后续创建其他虚拟机时可以基于这个快照克隆,节省时间。
(五)克隆虚拟机
- 选中 "k8s-template" 虚拟机,点击 "虚拟机"->"管理"->"克隆"。
- 选择 "现有快照",选刚才拍的 "template-base",点击 "下一步"。
- 选择 "创建完整克隆",点击 "下一步"。
- 给克隆的虚拟机起名字,比如 "k8s-master"(Master 节点),选好存放位置,点击 "完成"。
- 用同样的方法再克隆两个虚拟机,分别命名为 "k8s-worker1" 和 "k8s-worker2"(Worker 节点)。
(六)配置各虚拟机网络
- 分别启动 "k8s-master"、"k8s-worker1"、"k8s-worker2" 虚拟机。
- 登录每个虚拟机,设置静态 IP(这样 MobaXterm 连接更稳定)。比如:
BOOTPROTO=static
IPADDR=192.168.1.100 # 每个虚拟机对应自己的IP
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
然后重启网络服务:
sudo systemctl restart network
-
- k8s-master:192.168.1.100
-
- k8s-worker1:192.168.1.101
-
- k8s-worker2:192.168.1.102
编辑/etc/sysconfig/network-scripts/ifcfg-ens33(不同虚拟机网卡名可能不同,用ifconfig查看),添加或修改以下内容:
- 设置主机名:
-
- 在 k8s-master 上:
sudo hostnamectl set-hostname k8s-master
-
- 在 k8s-worker1 上:
sudo hostnamectl set-hostname k8s-worker1
-
- 在 k8s-worker2 上:
sudo hostnamectl set-hostname k8s-worker2
- 配置主机名解析(每个虚拟机都要做):
编辑/etc/hosts文件,添加:
192.168.1.100 k8s-master
192.168.1.101 k8s-worker1
192.168.1.102 k8s-worker2
二、MobaXterm 连接虚拟机
- 打开 MobaXterm,点击 "Session"->"SSH"。
- 在 "Remote host" 里输入 k8s-master 的 IP(192.168.1.100),"Specify username" 里输入登录用户名(比如 "ansible"),然后点击 "OK"。
- 输入用户密码("123456"),就可以成功连接到 k8s-master 虚拟机了。
- 用同样的方法连接 k8s-worker1 和 k8s-worker2。
三、在控制节点安装 Ansible(这里选 k8s-master 作为控制节点)
- 连接到 k8s-master 虚拟机(用 MobaXterm)。
- 安装 Ansible:
sudo yum install -y epel-release
sudo yum install -y ansible
- 验证 Ansible 安装成功:
ansible --version
能看到 Ansible 的版本信息就说明安装成功了。
四、配置 Ansible 免密登录(控制节点到各被管理节点)
- 在 k8s-master 上,生成 SSH 密钥对:
ssh-keygen -t rsa
一路按回车,默认生成在~/.ssh/目录下。
- 把公钥复制到各被管理节点(k8s-master 自己、k8s-worker1、k8s-worker2):
ssh-copy-id ansible@k8s-master
ssh-copy-id ansible@k8s-worker1
ssh-copy-id ansible@k8s-worker2
每次复制都要输入对应节点的用户密码。
- 测试免密登录:
ssh ansible@k8s-worker1
不用输密码就能登录就说明配置成功了,然后exit退出。
五、编写 Ansible Playbook 部署 K8s
(一)创建 Ansible 工作目录
mkdir -p ~/ansible-k8s
cd ~/ansible-k8s
(二)创建主机清单(inventory)
创建inventory.ini文件:
[k8s_master]
k8s-master ansible_ssh_user=ansible
[k8s_workers]
k8s-worker1 ansible_ssh_user=ansible
k8s-worker2 ansible_ssh_user=ansible
[k8s_cluster:children]
k8s_master
k8s_workers
(三)编写 Playbook(deploy_k8s.yml)
---
- name: 初始化所有节点
hosts: k8s_cluster
become: yes
tasks:
- name: 关闭防火墙
service:
name: firewalld
state: stopped
enabled: no
- name: 关闭SELinux
selinux:
state: disabled
- name: 关闭swap
command: swapoff -a
- name: 永久关闭swap
replace:
path: /etc/fstab
regexp: '^(/dev/mapper/centos-swap.*)$'
replace: '#\1'
- name: 配置内核参数
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
sysctl_set: yes
state: present
reload: yes
with_items:
- { name: net.bridge.bridge-nf-call-iptables, value: 1 }
- { name: net.bridge.bridge-nf-call-ip6tables, value: 1 }
- { name: net.ipv4.ip_forward, value: 1 }
- name: 安装必要软件
yum:
name: "{{ item }}"
state: present
with_items:
- yum-utils
- device-mapper-persistent-data
- lvm2
- wget
- name: 安装Docker
hosts: k8s_cluster
become: yes
tasks:
- name: 添加Docker源
get_url:
url: https://download.docker.com/linux/centos/docker-ce.repo
dest: /etc/yum.repos.d/docker-ce.repo
- name: 安装Docker
yum:
name: docker-ce
state: present
- name: 启动Docker
service:
name: docker
state: started
enabled: yes
- name: 配置Docker镜像加速器(阿里云)
copy:
content: |
{
"registry-mirrors": ["https://<你的阿里云加速器地址>.mirror.aliyuncs.com"]
}
dest: /etc/docker/daemon.json
- name: 重启Docker
service:
name: docker
state: restarted
- name: 安装K8s组件
hosts: k8s_cluster
become: yes
tasks:
- name: 添加K8s源
copy:
content: |
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
dest: /etc/yum.repos.d/kubernetes.repo
- name: 安装kubeadm、kubelet、kubectl
yum:
name: "{{ item }}"
state: present
disable_gpg_check: yes
with_items:
- kubeadm
- kubelet
- kubectl
- name: 启动kubelet
service:
name: kubelet
state: started
enabled: yes
- name: 初始化Master节点
hosts: k8s_master
become: yes
tasks:
- name: 初始化Master
command: kubeadm init --apiserver-advertise-address=192.168.1.100 --pod-network-cidr=10.244.0.0/16
register: kubeadm_init
- name: 保存join命令
shell: kubeadm token create --print-join-command
register: join_command
- name: 把join命令写入文件
copy:
content: "{{ join_command.stdout }}"
dest: /tmp/join_command.sh
- name: 配置kubectl
shell: |
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- name: 部署网络插件(Flannel)
hosts: k8s_master
become: yes
tasks:
- name: 部署Flannel
command: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- name: Worker节点加入集群
hosts: k8s_workers
become: yes
tasks:
- name: 复制join命令到Worker节点
fetch:
src: /tmp/join_command.sh
dest: /tmp/
flat: yes
- name: 执行join命令
shell: sh /tmp/join_command.sh
(四)执行 Playbook
ansible-playbook -i inventory.ini deploy_k8s.yml
然后就等着 Ansible 自动执行所有任务,部署 K8s 集群啦。
六、验证 K8s 集群
- 在 k8s-master 节点上,执行:
kubectl get nodes
能看到 master 和两个 worker 节点,状态都是 "Ready" 就说明部署成功了。
- 再执行:
kubectl get pods --all-namespaces
能看到 kube-system 命名空间下的相关 Pod 都在运行,就说明 K8s 集群正常工作了。
这样,从 0 开始在 VMware 虚拟机里用 Ansible 自动化部署 K8s 集群的整个过程就完成啦,MobaXterm 在其中也很好地发挥了 SSH 连接和操作的作用。