K8s(1)前置ansible准备环境
一、Ansible 详细拆解
1️⃣ 控制节点 & 被管理节点
|
角色 |
要求 |
|---|---|
|
控制节点 |
Python ≥ 3.8,安装 |
|
被管理节点 |
开启 SSH,Python ≥ 2.6 / 3.5 |
安装:
bash
bash
pip install ansible
ansible --version
2️⃣ Inventory 主机清单(超详细)
✅ 基础 INI 结构
ini
ini
[webservers]
192.168.80.11 ansible_user=root
192.168.80.12
[dbservers]
192.168.80.21
192.168.80.22
[all:vars]
ansible_port=22
ansible_ssh_private_key_file=/root/.ssh/id_rsa
✅ YAML 写法(推荐)
yaml
yaml
all:
children:
webservers:
hosts:
192.168.80.11:
ansible_user: root
dbservers:
hosts:
192.168.80.21:
✅ 常用内置变量
|
变量 |
作用 |
|---|---|
|
ansible_host |
真实IP |
|
ansible_port |
SSH端口 |
|
ansible_user |
登录用户 |
|
ansible_password |
密码 |
|
ansible_become |
是否提权 |
|
ansible_become_user |
提权用户 |
3️⃣ Ad-Hoc 命令(速查表)
bash
bash
# 测试连通性
ansible all -m ping
# 执行命令
ansible webservers -m command -a "uptime"
ansible webservers -m shell -a "ps -ef | grep nginx"
# 文件复制
ansible webservers -m copy -a "src=nginx.conf dest=/etc/nginx/nginx.conf"
# 安装软件
ansible webservers -m yum -a "name=nginx state=present"
# 启停服务
ansible webservers -m service -a "name=nginx state=started enabled=yes"
# 创建用户
ansible all -m user -a "name=deploy uid=1001 state=present"
4️⃣ Playbook 结构与字段详解
✅ 最小可用 Playbook
yaml
yaml
- name: 安装 Nginx
hosts: webservers
become: yes
tasks:
- name: Install nginx
yum:
name: nginx
state: present
✅ 核心字段说明
|
字段 |
作用 |
|---|---|
|
name |
任务描述 |
|
hosts |
目标主机 |
|
become |
是否提权 |
|
vars |
定义变量 |
|
tasks |
任务列表 |
|
handlers |
触发任务 |
|
notify |
触发 handler |
5️⃣ 变量(定义 + 引用)
✅ 定义方式
yaml
yaml
vars:
pkg_name: nginx
port: 80
✅ 引用方式
yaml
yaml
{{ pkg_name }}
{{ port }}
✅ 条件判断
yaml
yaml
when: ansible_distribution == "CentOS"
✅ 循环
yaml
yaml
loop:
- nginx
- mysql
6️⃣ Handlers 机制
yaml
yaml
tasks:
- name: Copy config
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: Restart nginx
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
7️⃣ Template(Jinja2)
✅ 模板文件 nginx.conf.j2
jinja2
jinja2
server {
listen {{ port }};
server_name {{ ansible_hostname }};
}
✅ Playbook 中使用
yaml
yaml
- template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
8️⃣ Role 标准目录结构
纯文本
纯文本
roles/
└── nginx/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
├── files/
├── vars/
│ └── main.yml
└── defaults/
调用:
yaml
yaml
- hosts: webservers
roles:
- nginx
二、Kubernetes 详细拆解
1️⃣ Master 组件(必背)
|
组件 |
作用 |
|---|---|
|
API Server |
所有请求入口 |
|
Scheduler |
Pod 调度 |
|
Controller Manager |
维持期望状态 |
|
etcd |
分布式存储 |
2️⃣ Node 组件
|
组件 |
作用 |
|---|---|
|
kubelet |
管理 Pod |
|
kube-proxy |
网络转发 |
|
容器运行时 |
containerd / docker |
3️⃣ 核心资源对象(最常用)
✅ Pod 最小示例
yaml
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
✅ Deployment(生产必用)
yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
✅ Service(稳定访问)
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
4️⃣ Pod 创建全流程(面试高频)
纯文本
纯文本
用户 kubectl apply
↓
API Server
↓
etcd 存储
↓
Controller 检测变化
↓
Scheduler 调度节点
↓
kubelet 拉镜像
↓
容器运行时启动容器
三、Ansible + Kubernetes 联动细节
1️⃣ Kubespray(生产级 K8s 部署)
-
用 Ansible 部署 K8s
-
支持 HA、多版本、多发行版
-
路径:
纯文本
纯文本
inventory/mycluster/
roles/kubespray-*
2️⃣ Ansible 调用 K8s 模块
yaml
yaml
- name: Create deployment
kubernetes.core.k8s:
state: present
definition:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
3️⃣ 典型组合模式
|
场景 |
工具 |
|---|---|
|
OS 初始化 |
Ansible |
|
K8s 集群部署 |
Ansible (Kubespray) |
|
应用发布 |
Helm + K8s |
|
配置注入 |
ConfigMap + Ansible |
|
节点维护 |
Ansible |
/root/ansible-docker
├── inventory.ini
├── install_docker_201018.yml
四、环境搭建操作步骤完整梳理
✅ 第一步:准备 SSH 免密(最基础)
1️⃣ 生成密钥
bash
bash
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
2️⃣ 批量分发公钥
bash
bash
yum install -y sshpass
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.222.141
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.222.142
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.222.143
✅ 验证
bash
bash
ansible -i inventory.ini docker_nodes -m ping
📌 出现 SUCCESS => pong才算合格
✅ 第二步:Inventory 主机清单
ini
ini
[webservers]
192.168.222.141
[dbservers]
192.168.222.142
192.168.222.143
📌 Playbook 里的 hosts:必须匹配这里
✅ 第三步:Docker 安装 Playbook(重点)
install_docker_201018.yml
yaml
yaml
- name: Install Docker CE 20.10.18 on Rocky
hosts: webservers:dbservers
become: yes
vars:
docker_ver: "20.10.18"
tasks:
- name: Remove old docker packages
yum:
name:
- docker
- docker-client
- docker-engine
state: absent
- name: Install yum utils
yum:
name:
- yum-utils
- device-mapper-persistent-data
- lvm2
state: present
- name: Add Docker CE repo
get_url:
url: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dest: /etc/yum.repos.d/docker-ce.repo
- name: Install Docker CE 20.10.18
yum:
name:
- "docker-ce-{{ docker_ver }}"
- "docker-ce-cli-{{ docker_ver }}"
- containerd.io
state: present
allow_downgrade: yes
- name: Enable and start docker
systemd:
name: docker
enabled: yes
state: started
- name: Show Docker version
command: docker --version
register: dv
changed_when: false
- debug:
msg: "{{ inventory_hostname }} => {{ dv.stdout }}"
五、真实踩坑总结(非常关键)
|
现象 |
原因 |
解决方案 |
|---|---|---|
|
官方 Docker 源慢 / 失败 |
境外源被限速 |
✅ 替换为 阿里云镜像 |
|
Playbook 执行失败 |
repo 未生效 |
明确指定 |
|
版本不对 |
未锁定版本 |
使用 |
|
SSH 不通 |
没做免密 |
先 |
|
ping 不通 |
Inventory 写错 |
检查 IP 和组名 |
六、执行流程(标准姿势)
bash
bash
# 1️⃣ 语法检查
ansible-playbook -i inventory.ini install_docker_201018.yml --syntax-check
# 2️⃣ 干跑(不真装)
ansible-playbook -i inventory.ini install_docker_201018.yml --check
# 3️⃣ 正式执行
ansible-playbook -i inventory.ini install_docker_201018.yml更多推荐




所有评论(0)