K8s(1)前置ansible准备环境

一、Ansible 详细拆解

1️⃣ 控制节点 & 被管理节点

角色 要求
控制节点 Python ≥ 3.8,安装 ansible
被管理节点 开启 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 未生效 明确指定 docker-ce.repo
版本不对 未锁定版本 使用 docker_ver变量
SSH 不通 没做免密 ssh-copy-id
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
相关推荐
lwx9148522 小时前
Kubernets-单节点部署k8s环境
云原生·容器·kubernetes
Dontla2 小时前
WSL2 docker-desktop发行版介绍(用于运行Docker引擎(Docker Engine))(docker-desktop-data)
运维·docker·容器
qq_452396232 小时前
第十六篇:《Docker 安全基础:容器隔离与权限控制》
安全·docker·容器
少司府2 小时前
C++进阶:map和set的使用
开发语言·数据结构·c++·容器·stl·set·map
darkdragonking15 小时前
OpenEuler 22.03 ,以docker ce 安装 Milvus 及可视化工具
docker·容器·milvus
真上帝的左手17 小时前
11. 容器化 vs 虚拟化-K8s-工作负载实战
云原生·容器·kubernetes
极客先躯19 小时前
高级java每日一道面试题-2026年01月18日-实战篇[Docker]-如何清理仓库中的旧镜像?
java·运维·docker·容器
张忠琳20 小时前
【kubernetes v1.21】(controller-manager part 1)kube-controller-manager 核心架构与启动流程
云原生·架构·kubernetes
qq_4523962321 小时前
第十五篇:《Docker 与 Kubernetes 集成:从 Swarm 到 K8s 的迁移》
docker·容器·kubernetes