Ansible部署k8s
·
目录
📋 环境说明
| 角色 | IP地址 | 配置 |
|---|---|---|
| Ansible控制节点(可以是你的笔记本或其中一台机器) | 192.168.10.110 | - |
| Master | 192.168.10.110 | 2核4G |
| Node01 | 192.168.10.111 | 1核4G |
| Node02 | 192.168.10.112 | 1核4G |
🚀 第一步:在所有节点上执行系统准备
你需要分别登录到三台机器,执行以下命令(或通过Ansible批量执行):
1.1 设置主机名(每台机器执行)
# 在 192.168.10.110 上执行
hostnamectl set-hostname master
# 在 192.168.10.111 上执行
hostnamectl set-hostname node01
# 在 192.168.10.112 上执行
hostnamectl set-hostname node02
1.2 配置/etc/hosts(三台机器都执行)
cat >> /etc/hosts << EOF
192.168.10.110 master
192.168.10.111 node01
192.168.10.112 node02
EOF

1.3 关闭防火墙(三台机器都执行)
# Ubuntu系统
systemctl stop ufw && systemctl disable ufw
# CentOS/RHEL系统
systemctl stop firewalld && systemctl disable firewalld
![]()
1.4 关闭交换分区(三台机器都执行)
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab

1.5 安装必要工具(三台机器都执行)
# Ubuntu/Debian
apt update && apt install -y python3 python3-pip python3-venv sshpass
# CentOS/RHEL
yum install -y python3 python3-pip python3-virtualenv sshpass

🔑 第二步:在Master上配置SSH免密登录
这些命令只在 Master (192.168.10.110) 上执行
2.1 生成SSH密钥
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa

2.2 将公钥复制到所有节点(包括自己)
ssh-copy-id root@192.168.10.110
ssh-copy-id root@192.168.10.111
ssh-copy-id root@192.168.10.112



2.3 验证免密登录
ssh root@192.168.10.110 "hostname"
ssh root@192.168.10.111 "hostname"
ssh root@192.168.10.112 "hostname"

📦 第三步:在Master上安装Ansible
这些命令只在 Master (192.168.10.110) 上执行
3.1 安装Ansible(推荐使用pip安装)
yum install -y epel-release
yum install -y ansible

3.2 验证Ansible安装
ansible --version

3.3配置 SSH 密钥
ssh-keygen

3.4将密钥复制到 三个节点
ssh-copy-id root@192.168.10.110
ssh-copy-id root@192.168.10.111
ssh-copy-id root@192.168.10.112
3.5测试
ssh root@192.168.10.110
ssh root@192.168.10.111
ssh root@192.168.10.112

📥 第四步:创建Ansible目录
mkdir -p /opt/k8s
cd /opt/k8s
![]()
📝 第五步:配置hosts
5.1 创建hosts文件
vim hosts
内容
[master]
master01 ansible_host=192.168.10.110
[node]
node01 ansible_host=192.168.10.111
node02 ansible_host=192.168.10.112
[k8s:children]
master
node
[k8s:vars]
ansible_user=root
5.2 测试
ansible -i hosts all -m ping

🚀 第六步:编写Ansible自动化部署文件
创建:
vim k8s.yml
完整内容如下:
---
# ============================================================
# 1. 所有节点环境准备
# ============================================================
name: Kubernetes环境初始化
hosts: k8s
gather_facts: yes
tasks:
name: 修改主机名
hostname:
name: "{{ inventory_hostname }}"
name: 修改hosts文件
blockinfile:
path: /etc/hosts
marker: "# {mark} KUBERNETES"
block: |
192.168.10.110 master01
192.168.10.111 node01
192.168.10.112 node02
name: 关闭firewalld
systemd:
name: firewalld
state: stopped
enabled: no
ignore_errors: yes
name: 临时关闭SELinux
command: setenforce 0
ignore_errors: yes
name: 永久关闭SELinux
replace:
path: /etc/selinux/config
regexp: '^SELINUX=enforcing'
replace: 'SELINUX=disabled'
name: 关闭swap
command: swapoff -a
name: 永久关闭swap
replace:
path: /etc/fstab
regexp: '^([^#].\sswap\s.)$'
replace: '# \1'
name: 安装基础软件
yum:
name:
- yum-utils
- device-mapper-persistent-data
- lvm2
- ipvsadm
- unzip
state: present
name: 创建Kubernetes内核参数配置
copy:
dest: /etc/sysctl.d/kubernetes.conf
content: |
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
name: 加载br_netfilter模块
modprobe:
name: br_netfilter
state: present
name: 加载ip_vs模块
modprobe:
name: ip_vs
state: present
name: 加载ip_vs_rr模块
modprobe:
name: ip_vs_rr
state: present
name: 加载ip_vs_wrr模块
modprobe:
name: ip_vs_wrr
state: present
name: 加载ip_vs_sh模块
modprobe:
name: ip_vs_sh
state: present
name: 生效内核参数
command: sysctl --system
============================================================
2. 所有节点安装Docker
============================================================
name: 安装Docker
hosts: k8s
tasks:
name: 添加Docker仓库
get_url:
url: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dest: /etc/yum.repos.d/docker-ce.repo
name: 安装Docker
yum:
name:
- docker-ce-20.10.18
- docker-ce-cli-20.10.18
- containerd.io
state: present
name: 创建Docker配置目录
file:
path: /etc/docker
state: directory
name: 配置Docker
copy:
dest: /etc/docker/daemon.json
content: |
{
"registry-mirrors": [
"https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com",
"https://6ijb8ubo.mirror.aliyuncs.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
name: 启动Docker
systemd:
name: docker
state: restarted
enabled: yes
daemon_reload: yes
============================================================
3. 所有节点安装Kubernetes
============================================================
name: 安装Kubernetes组件
hosts: k8s
tasks:
name: 配置Kubernetes软件源
copy:
dest: /etc/yum.repos.d/kubernetes.repo
content: |
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
name: 安装kubeadm kubelet kubectl
yum:
name:
- kubelet-1.20.11
- kubeadm-1.20.11
- kubectl-1.20.11
state: present
name: kubelet开机启动
systemd:
name: kubelet
enabled: yes
============================================================
4. 上传并加载Kubernetes 1.20.11镜像
============================================================
name: 上传Kubernetes镜像
hosts: k8s
tasks:
name: 创建Kubernetes镜像目录
file:
path: /opt/k8s
state: directory
name: 上传v1.20.11.zip
copy:
src: v1.20.11.zip
dest: /opt/v1.20.11.zip
name: 解压v1.20.11.zip
unarchive:
src: /opt/v1.20.11.zip
dest: /opt/k8s
remote_src: yes
name: 查找Kubernetes镜像
find:
paths: /opt/k8s/v1.20.11
patterns: "*.tar"
register: k8s_images
name: 加载Kubernetes镜像
command: docker load -i "{{ item.path }}"
loop: "{{ k8s_images.files }}"
============================================================
5. 上传并加载Flannel镜像
============================================================
name: 上传Flannel镜像
hosts: k8s
tasks:
name: 上传Flannel CNI镜像
copy:
src: flannel-cni-v1.2.0.tar
dest: /opt/k8s/flannel-cni-v1.2.0.tar
name: 上传Flannel镜像
copy:
src: flannel-v0.22.2.tar
dest: /opt/k8s/flannel-v0.22.2.tar
name: 加载Flannel CNI镜像
command: docker load -i /opt/k8s/flannel-cni-v1.2.0.tar
name: 加载Flannel镜像
command: docker load -i /opt/k8s/flannel-v0.22.2.tar
============================================================
6. Master初始化
============================================================
name: 初始化Kubernetes Master
hosts: master
tasks:
name: 创建kubeadm配置文件
copy:
dest: /opt/kubeadm-config.yaml
content: |
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.10.110
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.11
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/16"
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
name: 初始化Master
shell: |
kubeadm init --config=/opt/kubeadm-config.yaml --upload-certs | tee /opt/kubeadm-init.log
args:
creates: /etc/kubernetes/admin.conf
name: 创建kubectl目录
file:
path: /root/.kube
state: directory
name: 配置kubectl
copy:
src: /etc/kubernetes/admin.conf
dest: /root/.kube/config
remote_src: yes
Master生成Node加入命令
============================================================
name: 获取Node加入命令
hosts: master
tasks:
name: 获取join命令
shell: kubeadm token create --print-join-command
register: join_command
changed_when: false
name: 保存join命令
set_fact:
kubeadm_join: "{{ join_command.stdout }}"
============================================================
Node自动加入集群
============================================================
name: Node加入Kubernetes集群
hosts: node
tasks:
name: Node加入集群
shell: "{{ hostvars[groups['master'][0]].kubeadm_join }}"
args:
creates: /etc/kubernetes/kubelet.conf
============================================================
Master自动部署Flannel
============================================================
name: 部署Flannel
hosts: master
tasks:
name: 上传Flannel配置
copy:
src: kube-flannel.yml
dest: /opt/kube-flannel.yml
name: 部署Flannel
shell: kubectl apply -f /opt/kube-flannel.yml
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
name: 等待Kubernetes节点Ready
shell: kubectl get nodes
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
register: node_status
retries: 20
delay: 10
until: "'Ready' in node_status.stdout"
changed_when: false
name: 查看Kubernetes节点
shell: kubectl get nodes -o wide
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
register: nodes
changed_when: false
name: 输出节点状态
debug:
msg: "{{ nodes.stdout }}"
============================================================
查看Kubernetes系统Pod
============================================================
name: 查看Kubernetes系统Pod
hosts: master
tasks:
name: 获取系统Pod
shell: kubectl get pods -n kube-system -o wide
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
register: pods
changed_when: false
name: 输出系统Pod
debug:
msg: "{{ pods.stdout }}"
✅ 第七步:准备部署所需文件
准备Flannel 文件

第八步:执行Ansible自动部署
8.1检查语法
cd /opt/k8s
ansible-playbook -i hosts k8s.yml --syntax-check
8.2执行
ansible-playbook -i hosts k8s.yml

第九步:测试Kubernetes集群
创建Nginx :
kubectl create deployment nginx --image=nginx
查看Pod:
kubectl get pods -o wide

暴露服务:
kubectl expose deployment nginx --port=80 --type=NodePort

查看端口:
kubectl get svc

访问:
curl http://192.168.1.12:30091

浏览器访问测试:


更多推荐

所有评论(0)