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
相关推荐
Patrick_Wilson1 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生1 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭1 天前
运行你的第一个Docker容器
后端·docker·容器
悠然南风2 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
Java之美2 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵3 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康6 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_961875249 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj9 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes