先导:
目录
先导:
本期目标:
提前准备:
高亮提示:
一、配置虚拟机
1. 安装虚拟机
2. 配置网络及虚拟机参数
编辑二、Ansible环境的部署及集群SSH免密
1. 网络测试
2. 安装基础包和配置SSH互信
三、 创建Ansible项目文件
1. 创建Ansible Playbook目录及基本文件:
2. 创建Ansible角色相关文件
编辑
3.时钟同步
四、检查并配置k8s
本期目标:
完成SRE AI Agent虚拟机及k8s基础环境的搭建和配置。
提前准备:
下载并安装VMworkstation,下载rocky 9.6 linux镜像,下载MobaXterm软件(可选),配置过程中需全程联网,且有包下载,请注意流量消耗。
高亮提示:
绿色:检查点,你应该保证自己的状态与截图一致。
橙色:修正配置问题,如果你确认没有该问题,可以跳过
红色:重要的配置,在后续操作中需要用到,请在配置时记录。
一、配置虚拟机
1. 安装虚拟机
1. 在VM主界面点击创建新的虚拟机 
2. 选择对应的虚拟机镜像

3. 设置虚拟机名称和位置

4. 设置磁盘容量为200GB单文件

5. 修改虚拟机配置为4核4GB内存

2. 配置网络及虚拟机参数
1.重新启动虚拟机后选第一项并回车确认 
2. 选中文就行

3. 此处有四个未完成配置:

4. 先配置超级用户(Root Password)填写用户密码,并且打开ssh远程登录(第二个勾选项),在填写完成后点击左上角Done按钮,此处如果密码比较简单,需要按两次按钮以确认。

5. 再配置一个普通用户,填写用户名和密码(可以跳过)

6. 选择安装磁盘,勾选唯一的磁盘就行 
7.配置网络:在下方主机名处修改主机名为k8s-node1,并应用,再点击右侧配置按钮 
选ipv4配置,点击Add按钮新增连接,此处的ip应当参照你的计算机设置,点击VM左上角的编辑,选择虚拟网络编辑器,你应该有一个NAT类型的连接,如果没有可以通过添加网络创建,选中此连接点击NAT 设置,查看你的Vmware网络配置

如图,这是我的设置,此处的网关和子网掩码就是下文填写的数值,ip则填写该子网下的任意ip

回到虚拟机内的配置页面,填写数值,如我的配置为192.168.30.11,掩码24,网关192.168.30.2,然后点击Done回到主页面 
点击Restart按钮重启虚拟机
二、Ansible环境的部署及集群SSH免密
在开始前,请先安装上面的方式配置三台虚拟机
主机名不同:k8s_node1、k8s_node2、k8s_node3,
Ip不同:我的配置是192.168.30.11,192.168.30.12,192.168.30.13
接下来的操作都在k8s_node1上进行:
1. 网络测试
1.使用MobaXterm或其他终端软件连接到k8s_node1 ,便于接下来的操作
在主页点击左上角Sessions->new sessions.

2. 选择SSH,在remote host中输入虚拟机的IP(上文配置的ip,我的是192.168.30.11),点击ok

3.在登录窗口以root用户登录,如果你无法看到此页面,则是前文的ip配置错误,(第一次登录会提示要不要接收密钥,全选是)

4.登录成功如图,如果你输入的root密码被拒绝,则是前文root用户处没有开启ssh连接导致。

5.先测试一下网络配置是否正确,输入
ping 8.8.8.8
应该有返回值,如果没有,则是ip和网关配置有问题,如果没问题按ctrl+c退出ping
关闭机器上的防火墙,方便后续操作(不要像我一样忘记关,后续用两个小时的时间排查)
systemctl disable –now firewalld
setenforce 0
请在此过程中检查三台机器,确认登录过程中ip和主机名一一对应且能ping通
2. 安装基础包和配置SSH互信
1.输入安装命令并等待,安装ansible核心包和ssh互信包
dnf install -y ansible-core sshpass
安装完毕后,最后一行应该显示 Complete!
2.配置集群ssh,先输入命令,获取认证密钥对
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
再分发密钥,我们尝试通过scp命令复制密钥到各个节点
ssh-copy-id -o StrictHostKeyChecking=no root@k8s-node1
ssh-copy-id -o StrictHostKeyChecking=no root@k8s-node2
ssh-copy-id -o StrictHostKeyChecking=no root@k8s-node3
但是发现不能正常分发到指定主机。

通过ping对应主机发现主机的ip是错误的,如图:

这是因为前文我们虽然配置了主机和对应的ip,却没有为各个主机配置解析,换言之,主机根本不知道每个主机名对应哪个ip,我们输入
vim /etc/hosts
发现vim没有安装,使用命令安装(也可以用vi就不用安装了)
dnf install -y vim
再次使用vim打开/etc/hosts,如图

我们添加对应的解析,并保存退出 (按i进入插入模式,输入完毕后按esc,输入wq保存退出)

完成后再试着分发一遍
注意,互信要在每台机器上都配置一遍
如图分发完毕,可以在其他机器上尝试ssh登录能否成功判断对错

如图,登录过程不需要输入密码即为正常,请记住输入exit返回node1,避免错误

你应该能在每台机器上使用ssh免密登录到每台机器
三、 创建Ansible项目文件
通过以下命令,创建并切换到ansible的项目目录。
mkdir -p ~/ansible-k8s-deployment
cd ~/ansible-k8s-deployment
1. 创建Ansible Playbook目录及基本文件:
(1)配置文件 ansible.cfg
[defaults]
inventory = ./inventory
host_key_checking = False
remote_user = root
(2)清单文件 inventory
[masters]
k8s-node1 ansible_host=192.168.30.11
[workers]
k8s-node2 ansible_host=192.168.30.12
k8s-node3 ansible_host=192.168.30.13
[all:vars]
# 在单Master集群需要明确指定Master的IP
# 如果是多Master高可用集群,需要配置VIP
master_ip = 192.168.30.11
# 为K8s Pod网络指定CIDR,Calico网络插件需要
pod_network_cidr = "10.244.0.0/16"
(3)playbook入口文件 deploy-k8s.yml
—
– name: 1. Configure all nodes with common settings
hosts: all
become: true
roles:
– common
– name: 2. Deploy Kubernetes master node
hosts: masters
become: true
roles:
– master
– name: 3. Deploy Kubernetes worker nodes
hosts: workers
become: true
roles:
– worker
– name: 4. Label worker nodes from master
hosts: masters
become: true
tasks:
– name: Apply worker role label to each worker node
ansible.builtin.command: "kubectl label node {{ item }} node-role.kubernetes.io/worker=worker –overwrite"
loop: "{{ groups['workers'] }}"
2. 创建Ansible角色相关文件
1.创建每个角色的子目录
mkdir -p roles/{common,master,worker}/tasks
(1)在 roles/common/tasks/main.yml中编写common角色
vim ~/ansible-k8s-deployment/roles/common/tasks/main.yml
示例:
—
# tasks file for common role
– name: Disable SELinux
ansible.posix.selinux:
state: disabled
– name: Disable Swap
block:
– name: Turn off swap
ansible.builtin.command: swapoff -a
– name: Comment out swap in fstab
ansible.builtin.replace:
path: /etc/fstab
regexp: '^(.*swap.*)$'
replace: '# \\1'
when: ansible_swaptotal_mb > 0
– name: Configure kernel modules and sysctl for Kubernetes
block:
– name: Load overlay module
community.general.modprobe: { name: overlay, state: present }
– name: Load br_netfilter module
community.general.modprobe: { name: br_netfilter, state: present }
– name: Create k8s.conf for sysctl
ansible.builtin.copy:
dest: /etc/sysctl.d/k8s.conf
content: |
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
– name: Apply sysctl params
ansible.builtin.command: sysctl –system
– name: Install and configure containerd
block:
– name: Install required packages for containerd
ansible.builtin.dnf:
name: [dnf-utils, device-mapper-persistent-data, lvm2]
state: present
– name: Add Docker CE repository
ansible.builtin.get_url:
url: https://download.docker.com/linux/centos/docker-ce.repo
dest: /etc/yum.repos.d/docker-ce.repo
– name: Install containerd.io
ansible.builtin.dnf:
name: containerd.io
state: present
– name: Configure containerd to use systemd cgroup
ansible.builtin.shell: |
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
– name: Restart and enable containerd service
ansible.builtin.systemd:
name: containerd
state: restarted
enabled: yes
– name: Add Kubernetes v1.32 yum repository
ansible.builtin.yum_repository:
name: kubernetes
description: Kubernetes
# — 版本更新点 —
baseurl: https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
gpgkey: https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
gpgcheck: yes
enabled: yes
exclude: kubelet kubeadm kubectl cri-tools kubernetes-cni
– name: Install Kubernetes components
ansible.builtin.dnf:
name: [kubelet, kubeadm, kubectl]
state: present
disable_excludes: kubernetes
– name: Enable kubelet service
ansible.builtin.systemd:
name: kubelet
enabled: yes
(2)在 roles/master/tasks/main.yml编写master角色
vim ~/ansible-k8s-deployment/roles/master/tasks/main.yml
—
# tasks file for master role
– name: Initialize the Kubernetes cluster with kubeadm
ansible.builtin.shell: "kubeadm init –apiserver-advertise-address={{ master_ip }} –pod-network-cidr={{ pod_network_cidr }} –upload-certs"
args:
creates: /etc/kubernetes/admin.conf
– name: Setup kubectl for the root user
ansible.builtin.file:
path: /root/.kube
state: directory
owner: root
group: root
mode: '0755'
– name: Copy admin.conf to user's kube config
ansible.builtin.copy:
src: /etc/kubernetes/admin.conf
dest: /root/.kube/config
remote_src: yes
owner: root
group: root
mode: '0644'
– name: Install Calico network CNI
ansible.builtin.shell: "kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml"
args:
creates: /etc/cni/net.d/10-calico.conflist
– name: Generate join command
ansible.builtin.command: kubeadm token create –print-join-command
register: join_command_raw
– name: Store join command
ansible.builtin.set_fact:
join_command: "{{ join_command_raw.stdout }}"
(3)在~/ansible-k8s-deployment/roles/worker/tasks/main.yml编写worker角色
vim ~/ansible-k8s-deployment/roles/worker/tasks/main.yml
—
– name: Join the worker nodes to the cluster
ansible.builtin.command: "{{ hostvars[groups['masters'][0]]['join_command'] }}"
args:
creates: /etc/kubernetes/kubelet.conf
使用tree命令获取的目录结构如图(你可能没有安装tree包,使用dnf install -y tree安装)
3.时钟同步
设置时区
timedatectl set-timezone Asia/Shanghai
安装 chrony并手动同步
sudo dnf install chrony
sudo systemctl start chronyd
sudo systemctl enable chronyd
sudo chronyc makestep
在我们进一步前,我们应该确认集群的时间同步状态,
先输入:
for node in k8s-node{1..3}; do
ssh "$node" 'date +"%Y-%m-%d %H:%M:%S.%N"' &
done
wait
会出现当前各节点的时间,如图:

时差应该在100ms之内,证明时钟服务正常,否则请检查各节点的时钟同步
尝试执行playbook,此代码会报错,这是正常的,原因在于代码中调用的ansible.posix 和 community.general的两个内容集合没有安装。
cd ~/ansible-k8s-deployment
ansible-playbook deploy-k8s.yml

创建依赖项文件 ~/ansible-k8s-deployment/requirements.yml
—
collections:
– name: ansible.posix
version: ">=1.5.4" # 指定一个版本范围,保证稳定性
– name: community.general
version: ">=8.5.0"
安装依赖项(需要等待)
cd ~/ansible-k8s-deployment
ansible-galaxy install -r requirements.yml
完成后就可以再试一遍了,这也需要等待很长一段时间(由于下载源在外网,可能需要一些网络工具)这个代码在运行时也可能报错,大多是由于网络原因。
cd ~/ansible-k8s-deployment
ansible-playbook deploy-k8s.yml
运行后检查整个输出,应该无明显报错
四、检查并配置k8s
查看节点列表
kubectl get nodes -o wide

查看node列表
kubectl get pods -A

请检查所有的节点都是ready,所有的pod状态都是running(刚启动时可能没有运行,等一等就可以)
本文的目标已全部达成,如果要关闭虚拟机,请先关闭node2和node3,再关闭node1,开启时顺序相反
网硕互联帮助中心





评论前必须登录!
注册