【自动化】基于ansible部署k8s1.29集群

Ansible-K8S-YAML编写指北

项目地址

1. 集群环境介绍

1.1 集群IP、角色软件规划

主机名称 IP地址 说明 软件
Master01 10.168.1.161 master kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx
Master02 10.168.1.162 master kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx
Master03 10.168.1.163 master kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx
Node01 10.168.1.164 node kubelet、kube-proxy、nfs-client、nginx
Node02 10.168.1.165 node kubelet、kube-proxy、nfs-client、nginx
HA地址 10.168.1.160 公用master

1.2 集群Linux主机介绍

  • OracleLinux7.9 最小化安装、仅配置好IP、网关(模拟PRD环境,其余操作都是远程进行)
  • 离线部署,但是需要配置DNS防止后续补丁升级
  • 极限安装配置基线:2CPU、4GB
  • docker数据目录不要定义到系统存储
  • ansible的核心是清单和剧本
  • ntp、dns与repo仓库使用外网地址,生产中替换为本地

1.3 ansible配置优化

grep -vE '^#|^$'  /etc/ansible/ansible.cfg 
[defaults]
host_key_checking = False #忽略指纹
deprecation_warnings = False  #忽略回显警告
interpreter_python = auto_legacy_silent #忽略警告
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

2. OS环境初始化

2.1 主机清单文件布局

  • ansible_ssh_user=账户 ansible_ssh_pass='密码' #使用密码账户作为验证凭据
#以下命令会清空旧数据 注意备份!

cat  >  /etc/ansible/hosts  << EOF
#etcd集群IP
[etcd]
10.168.1.161 hostname=etcd-01 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
10.168.1.162 hostname=etcd-02 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
10.168.1.163 hostname=etcd-03 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
#主节点IP
[kube_master]
10.168.1.161 hostname=mrzsir-master01 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
10.168.1.162 hostname=mrzsir-master02 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
10.168.1.163 hostname=mrzsir-master03 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
#控制节点IP
[kube_node]
10.168.1.164 hostname=mrzsir-node01 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
10.168.1.165 hostname=mrzsir-node02 ansible_ssh_user=root ansible_ssh_pass='Mrz*****'
EOF

2.2 OS初始化剧本

---     #yaml资源开头格式
- hosts: kube_master kube_node             #主机组
  remote_user: root
  vars:
    TEMP_DIR: templates 
  tasks:                                    #任务组
  - name: 修改主机名
    raw: "echo {{hostname|quote}} > /etc/hostname"

  - name: 刷新主机名
    shell: hostname {{hostname|quote}}

  - name: 关闭防火墙
    service:
      name: firewalld
      state: stopped
      enabled: no

  - name: 临时关闭selinux
    shell: "setenforce 0"
    failed_when: false

  - name: 永久关闭selinux
    replace:
      path: /etc/selinux/config
      regexp: '^SELINUX=enforcing'
      replace: 'SELINUX=disabled'

  - name: 修改HOSTS
    tags: cp-hosts
    copy:
      src: ./{{ TEMP_DIR }}/hosts                                     #文件一定要在当前路径
      dest: /etc

  - name: 修改DNS
    shell: echo "nameserver 119.29.29.29" >> /etc/resolv.conf  && echo "nameserver 223.6.6.6" >> /etc/resolv.conf

  - name: 创建repo备份目录
    file:
      dest: /etc/yum.repos.d/bak
      state: directory

  - name: 备份旧repo文件
    copy: remote_src=True src=/etc/yum.repos.d/*ol7.repo dest=/etc/yum.repos.d/bak  
    ignore_errors: yes

  - name: 模糊匹配旧repo文件-> files_to_delete
    shell: mv /etc/yum.repos.d/*ol7.repo /etc/yum.repos.d/bak
    ignore_errors: yes

  - name: 下发新repo文件
    tags: cp-repo
    copy:
      src: ./{{ TEMP_DIR }}/Centos-7.repo                                      #文件一定要在当前路径
      dest: /etc/yum.repos.d/Centos-7.repo

  - name: 批量安装软件
    yum: name={{item}} state=present
    loop:  
      - vim
      - ntpdate
      - wget
      - psmisc 
      - net-tools 
      - nfs-utils 
      - telnet 
      - yum-utils 
      - device-mapper-persistent-data 
      - lvm2 
      - git 
      - tar 
      - curl
      - sysstat 
  #    - iostat 
  #    - iftop 
  #    - iotp 
      - lrzsz
      - ipvsadm
      - ipset 
      - sysstat 
      - conntrack 
      - libseccomp 

  - name: 设置上海时区
    shell: ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

  - name: 添加ntp同步计划任务
    cron:
      name: "ntp同步阿里云时间服务器"
      hour: "1"
      job: "ntpdate ntp.aliyun.com >/dev/null 2>&1"
      state: present

  - name: 刷新时间
    shell: ntpdate ntp.aliyun.com

  - name: 关闭交换分区
    shell: sed -ri 's/.*swap.*/#&/' /etc/fstab  && swapoff -a && sysctl -w vm.swappiness=0

  - name: 内核设置-1
    tags: set-limits
    copy:
      src: ./{{ TEMP_DIR }}/limits.conf                              #文件一定要在当前路径
      dest: /etc/security/limits.conf

  - name: 创建内核参数设置文件夹-1
    file:
      dest: /etc/modules-load.d
      state: directory

  - name: ipvs.conf配置
    tags: set-limits
    copy:
      src: ./{{ TEMP_DIR }}/ipvs.conf                              #文件一定要在当前路径
      dest: /etc/modules-load.d/ipvs.conf

  - name: k8s.conf配置
    tags: set-limits
    copy:
      src: ./{{ TEMP_DIR }}/k8s.conf                             #文件一定要在当前路径
      dest: /etc/sysctl.d/k8s.conf

  - name: 生效ipvs配置 
    service: name=systemd-modules-load state=restarted      

  - name: 生效sysctl
    shell: sysctl --system

2.3 批量磁盘分区

#仅适用OracleLinux,自带数据状态校测,多次执行不影响已分区的磁盘数据,其它OS请自行测试
#分区完后必须手动重启服务器检查磁盘挂载状态
---
- hosts: kube_master kube_node
  tasks:
    - name: 创建新卷组
      lvg:
        vg: vg_data
        pvs: /dev/sdb

    - name: 创建逻辑卷并加入到卷组
      lvol:
        vg: vg_data
        lv: lv_data
        size: 100%VG #使用全部卷可用容量
        resizefs: true      #可以扩展
        force: no     #如果有数据,强制创建
        state: present
    - name: 格式化xfs文件系统
      filesystem:
        fstype: xfs
        dev: /dev/vg_data/lv_data

    - name: 挂载LV
      mount:
        path: /data    #挂载点
        src: /dev/vg_data/lv_data   #挂载设备
        fstype: xfs
        state: mounted     # 挂载
        opts: defaults
转载请注明-MrZ-个人博客
THE END
分享
二维码
海报
【自动化】基于ansible部署k8s1.29集群
Ansible-K8S-YAML编写指北 项目地址 1. 集群环境介绍 1.1 集群IP、角色软件规划 主机名称 IP地址 说明 软件 Master01 10.168.1.161 master kube-apiserver、kube-controller-manager、kube-scheduler、etcd……
<<上一篇
下一篇>>