Ansible实战:VMware下K8s自动化部署指南

从 0 开始:用 Ansible 自动化部署 K8s 集群(VMware 环境 + MobaXterm)

如果你想在 VMware 虚拟机里,从 0 开始用 Ansible 自动化部署 K8s 集群,还打算用 MobaXterm 来操作 SSH,那这篇博客就是为你量身定做的!接下来,咱们一步步把这个过程搞清楚。

一、前期准备:搭建 VMware 虚拟机环境

(一)安装 VMware Workstation

首先,你得去 VMware 官网下载并安装 VMware Workstation(根据自己的操作系统选对应的版本,Windows 或者 Linux 都可以)。安装过程很简单,按照提示一步一步来就行。

(二)创建虚拟机模板

  1. 打开 VMware Workstation,点击 "创建新的虚拟机",选择 "自定义(高级)",然后点击 "下一步"。
  1. 硬件兼容性选默认的就行,继续 "下一步"。
  1. 选择 "稍后安装操作系统",点击 "下一步"。
  1. 客户机操作系统选 "Linux",版本选 "CentOS 7 64 位"(因为 K8s 在 CentOS 7 上部署比较稳定),点击 "下一步"。
  1. 给虚拟机起个名字,比如 "k8s-template",再选个存放虚拟机文件的位置,点击 "下一步"。
  1. 处理器配置方面,至少给 2 个 CPU 核心,这样后续运行 K8s 会更流畅,点击 "下一步"。
  1. 内存至少给 2GB,点击 "下一步"。
  1. 网络类型选 "桥接网络",这样虚拟机可以和宿主机在同一网段,方便后续 SSH 连接,点击 "下一步"。
  1. I/O 控制器、磁盘类型都选默认的,点击 "下一步"。
  1. 选择 "创建新虚拟磁盘",点击 "下一步"。
  1. 磁盘大小给 20GB 以上,勾选 "将虚拟磁盘拆分为多个文件",点击 "下一步"。
  1. 磁盘文件名保持默认,点击 "完成"。

(三)安装 CentOS 7 系统

  1. 选中刚创建的 "k8s-template" 虚拟机,点击 "编辑虚拟机设置",在 "CD/DVD (IDE)" 里选择 CentOS 7 的 ISO 镜像文件,然后点击 "确定"。
  1. 启动虚拟机,进入 CentOS 7 的安装界面。选择 "Install CentOS 7"。
  1. 语言选择 "English" 或者 "中文(简体)",点击 "Continue"。
  1. 在安装信息摘要里,点击 "Installation Destination",选择刚才创建的虚拟磁盘,点击 "Done"。
  1. 点击 "Network & Host Name",打开网络开关,设置主机名为 "k8s-template",然后点击 "Done"。
  1. 点击 "Begin Installation" 开始安装。
  1. 安装过程中,设置 root 密码(比如 "123456",生产环境要设复杂密码),也可以创建一个普通用户(比如 "ansible",密码也设为 "123456"),并把这个用户加入 "sudoers" 组(后续用 Ansible 的时候需要 sudo 权限)。
  1. 安装完成后,点击 "Reboot" 重启虚拟机。

(四)配置模板虚拟机

  1. 重启后,登录系统(可以用 root 或者刚创建的普通用户)。
  1. 关闭防火墙:
复制代码
复制代码
sudo systemctl stop firewalld

sudo systemctl disable firewalld
  1. 关闭 SELinux:

编辑/etc/selinux/config文件,把SELINUX=enforcing改成SELINUX=disabled,然后重启虚拟机。

  1. 配置 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
  1. 安装必要的工具:
复制代码
复制代码
sudo yum install -y net-tools vim wget
  1. 配置 SSH(确保可以用 MobaXterm 远程连接):

检查/etc/ssh/sshd_config文件,确保PermitRootLogin yes(如果需要 root 登录)或者PasswordAuthentication yes(允许密码认证),然后重启 sshd 服务:

复制代码
复制代码
sudo systemctl restart sshd
  1. 拍摄快照:

在 VMware Workstation 里,选中 "k8s-template" 虚拟机,点击 "虚拟机"->"快照"->"拍摄快照",起个名字比如 "template-base",这样后续创建其他虚拟机时可以基于这个快照克隆,节省时间。

(五)克隆虚拟机

  1. 选中 "k8s-template" 虚拟机,点击 "虚拟机"->"管理"->"克隆"。
  1. 选择 "现有快照",选刚才拍的 "template-base",点击 "下一步"。
  1. 选择 "创建完整克隆",点击 "下一步"。
  1. 给克隆的虚拟机起名字,比如 "k8s-master"(Master 节点),选好存放位置,点击 "完成"。
  1. 用同样的方法再克隆两个虚拟机,分别命名为 "k8s-worker1" 和 "k8s-worker2"(Worker 节点)。

(六)配置各虚拟机网络

  1. 分别启动 "k8s-master"、"k8s-worker1"、"k8s-worker2" 虚拟机。
  1. 登录每个虚拟机,设置静态 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

编辑/etc/sysconfig/network-scripts/ifcfg-ens33(不同虚拟机网卡名可能不同,用ifconfig查看),添加或修改以下内容:

  1. 设置主机名:
    • 在 k8s-master 上:
复制代码
复制代码
sudo hostnamectl set-hostname k8s-master
    • 在 k8s-worker1 上:
复制代码
复制代码
sudo hostnamectl set-hostname k8s-worker1
    • 在 k8s-worker2 上:
复制代码
复制代码
sudo hostnamectl set-hostname k8s-worker2
  1. 配置主机名解析(每个虚拟机都要做):

编辑/etc/hosts文件,添加:

复制代码
复制代码
192.168.1.100 k8s-master

192.168.1.101 k8s-worker1

192.168.1.102 k8s-worker2

二、MobaXterm 连接虚拟机

  1. 打开 MobaXterm,点击 "Session"->"SSH"。
  1. 在 "Remote host" 里输入 k8s-master 的 IP(192.168.1.100),"Specify username" 里输入登录用户名(比如 "ansible"),然后点击 "OK"。
  1. 输入用户密码("123456"),就可以成功连接到 k8s-master 虚拟机了。
  1. 用同样的方法连接 k8s-worker1 和 k8s-worker2。

三、在控制节点安装 Ansible(这里选 k8s-master 作为控制节点)

  1. 连接到 k8s-master 虚拟机(用 MobaXterm)。
  1. 安装 Ansible:
复制代码
复制代码
sudo yum install -y epel-release

sudo yum install -y ansible
  1. 验证 Ansible 安装成功:
复制代码
复制代码
ansible --version

能看到 Ansible 的版本信息就说明安装成功了。

四、配置 Ansible 免密登录(控制节点到各被管理节点)

  1. 在 k8s-master 上,生成 SSH 密钥对:
复制代码
复制代码
ssh-keygen -t rsa

一路按回车,默认生成在~/.ssh/目录下。

  1. 把公钥复制到各被管理节点(k8s-master 自己、k8s-worker1、k8s-worker2):
复制代码
复制代码
ssh-copy-id ansible@k8s-master

ssh-copy-id ansible@k8s-worker1

ssh-copy-id ansible@k8s-worker2

每次复制都要输入对应节点的用户密码。

  1. 测试免密登录:
复制代码
复制代码
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 集群

  1. 在 k8s-master 节点上,执行:
复制代码
复制代码
kubectl get nodes

能看到 master 和两个 worker 节点,状态都是 "Ready" 就说明部署成功了。

  1. 再执行:
复制代码
复制代码
kubectl get pods --all-namespaces

能看到 kube-system 命名空间下的相关 Pod 都在运行,就说明 K8s 集群正常工作了。

这样,从 0 开始在 VMware 虚拟机里用 Ansible 自动化部署 K8s 集群的整个过程就完成啦,MobaXterm 在其中也很好地发挥了 SSH 连接和操作的作用。

相关推荐
lingggggaaaa4 小时前
小迪安全v2023学习笔记(九十七天)—— 云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
java·笔记·学习·安全·网络安全·云原生·kubernetes
蒋星熠6 小时前
Maven项目管理与构建自动化完全指南
java·前端·python·自动化·maven
许泽宇的技术分享8 小时前
Ansible核心架构深度剖析:从源码看IT自动化的“简单“哲学
python·ansible·自动化运维·devops·it基础设施
荣光波比8 小时前
Ansible(三)—— 使用Ansible自动化部署LNMP环境实战指南
运维·自动化·云计算·ansible
yuezhilangniao9 小时前
基础架构安全和云原生安全的融合~K8S安全和传统安全~K8S和安全融合~综合安全大饼
安全·云原生·kubernetes
nvd1119 小时前
用terraform 创建一个GKE private cluster
云原生·kubernetes·terraform·gke
小雨凉如水19 小时前
k8s学习-pod的生命周期
java·学习·kubernetes
Q飞了19 小时前
深入理解k8s中pod、service、deployment和statefulSet等工作负载--图文篇
云原生·容器·kubernetes
NightReader1 天前
minikube 的 kubernetes 入门教程-kubeSphere
云原生·容器·kubernetes