前言

之前公司新成立一个研发部门,让我帮忙部署了一套kubernetes集群(一主两从),虽然之前项目部署过了,但是忘记记录过程了,这次重复部署,打算留下记录,方便未来自己查看,采用v1.31版本。

\

现在将部署的过程转换成ansible-playbook脚本,方便未来的快速部署。网上有很多ansible-playbook脚本。但是大部分都是基于Flannel,本次部署采用的是calico作为网络插件。主要是因为该插件可以匹配BGP技术,未来对接云平台相关的cni、vpc服务会更方便。

\

PS:项目上用的最新版v1.33的,但是到了实验环境发现centos7.6的linux内核最高只能支持到1.31版本~

实验环境

硬件系统:超融合服务器主机

软件系统:Centos7.6(测试主机系统,生产主机上的系统是centos8.4,但是本教程是采用测试系统进行模拟)

  • master(10.10.20.110)
  • node1(10.10.20.111)
  • node2(10.10.20.112)

软件包:

上述所有文件的终极打包版本:

ansible-playbook目录结构

/root/ansible-playbook/k8s/
[root@node2 k8s]# tree .
.
├── ansible.cfg
├── hosts
├── install_k8s.yml
├── k8s
│   ├── calico.yaml
│   ├── cri-docker.service
│   └── cri-docker.socket
└── package
    ├── cri-dockerd-0.3.13-3.el7.x86_64.rpm
    ├── cri-tools-1.31.1-150500.1.1.x86_64.rpm
    ├── kubeadm-1.31.1-150500.1.1.x86_64.rpm
    ├── kubectl-1.31.1-150500.1.1.x86_64.rpm
    ├── kubelet-1.31.1-150500.1.1.x86_64.rpm
    └── kubernetes-cni-1.5.1-150500.1.1.x86_64.rpm

前期配置文件及脚本文件准备

对calico.yaml文件的处理和提前准备镜像包

# 50个节点以内
curl https://raw.githubusercontent.com/projectcalico/calico/v3.30.1/manifests/calico.yaml -O

# 超过50个节点
curl https://raw.githubusercontent.com/projectcalico/calico/v3.30.1/manifests/calico-typha.yaml -o calico.yaml

# 修改内部calico配置并开启BGP模式
sed -i.bak \
  -e '/CALICO_IPV4POOL_CIDR/!b;n;c  value: "10.244.0.0/16"' \
  -e '/CALICO_IPV4POOL_IPIP/!b;n;c  value: "off"' \
  calico.yaml

calico需要一些镜像才能正确从kube中启动,这里我们先把镜像包准备好。

PS:因为国内拉取calico相关镜像非常慢,所以这里我提前将镜像下载到本地后上传到了阿里云的ACR服务,大家可以直接拉取。

# 从阿里云容器镜像服务拉取 calico/pod2daemon-flexvol
docker pull crpi-hugcb962kpzprn5u.cn-guangzhou.personal.cr.aliyuncs.com/github_local007/calico:pod2daemon-flexvol-v3.30.1

# 从阿里云容器镜像服务拉取 calico/node
docker pull crpi-hugcb962kpzprn5u.cn-guangzhou.personal.cr.aliyuncs.com/github_local007/calico:node-v3.30.1

# 从阿里云容器镜像服务拉取 calico/kube-controllers
docker pull crpi-hugcb962kpzprn5u.cn-guangzhou.personal.cr.aliyuncs.com/github_local007/calico:kube-controllers-v3.30.1

# 从阿里云容器镜像服务拉取 calico/cni
docker pull crpi-hugcb962kpzprn5u.cn-guangzhou.personal.cr.aliyuncs.com/github_local007/calico:cni-v3.30.1

init.sh 批量创建剩下的文件

# 一、cri-docker.service(适配cri-dockerd-0.4.0版本)
cat >/root/ansible-playbook/k8s/k8s/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target    
EOF

# 二、cri-docker.socket
cat >/root/ansible-playbook/k8s/k8s/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target    
EOF

ansible-playbook脚本

ansible-playbook

- hosts: all
  vars:
    # 基础配置参数(与目录结构严格对应)
    base_dir: "/root/ansible-playbook/k8s"
    package_dir: "{{ base_dir }}/package"
    k8s_conf_dir: "{{ base_dir }}/k8s"
    
    # 节点网络配置
    master_ip: "10.10.20.110"
    node_ips: 
      - "10.10.20.111"
      - "10.10.20.112"
    service_cidr: "10.96.0.0/12"
    pod_network_cidr: "10.244.0.0/16"
    kubernetes_version: "1.31.1"
    image_repository: "registry.aliyuncs.com/google_containers"
    
    # 组件版本配置(与package目录下的安装包严格匹配)
    cri_socket: "unix:///var/run/cri-dockerd.sock"
    cri_dockerd_version: "0.3.13-3.el7"  # 校准为指定的el7版本
    cri_tools_version: "1.31.1"
    kubernetes_cni_version: "1.5.1"  # 与目录中的CNI包版本匹配

  tasks:
    # 1. 系统环境配置
    - name: 停止并禁用 firewalld
      systemd:
        name: firewalld
        state: stopped
        enabled: false

    - name: 检查 SELinux 当前状态
      command: getenforce
      register: selinux_status
      changed_when: false
      ignore_errors: true
      
    - name: 临时关闭 selinux(仅当处于 enforcing 模式时)
      command: setenforce 0
      when: selinux_status.stdout == "Enforcing"
      changed_when: false

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

    - name: 关闭 swap
      command: swapoff -a
      changed_when: false

    - name: 永久关闭 swap
      lineinfile:
        path: /etc/fstab
        regexp: '^/dev/mapper/rl-swap'
        line: '#/dev/mapper/rl-swap'
        backrefs: yes

    - name: 设置系统时区为 Asia/Shanghai
      command: timedatectl set-timezone Asia/Shanghai
      changed_when: false

    # 2. 网络配置
    - name: 安装 ipvsadm
      yum:
        name: ipvsadm
        state: present

    - name: 配置 ip_forward
      lineinfile:
        path: /etc/sysctl.conf
        regexp: '^net.ipv4.ip_forward'
        line: 'net.ipv4.ip_forward = 1'
        state: present

    - name: 安装桥接工具
      yum:
        name: 
          - epel-release
          - bridge-utils
        state: present

    - name: 加载 br_netfilter 模块
      modprobe:
        name: br_netfilter
        state: present

    - name: 配置 br_netfilter 开机加载
      lineinfile:
        path: /etc/modules-load.d/bridge.conf
        line: 'br_netfilter'
        state: present
        create: yes

    - name: 配置桥接网络过滤规则
      lineinfile:
        path: /etc/sysctl.conf
        line: "{{ item }}"
        state: present
      loop:
        - 'net.bridge.bridge-nf-call-iptables = 1'
        - 'net.bridge.bridge-nf-call-ip6tables = 1'

    - name: 重新加载 sysctl 配置
      command: sysctl -p
      changed_when: false

    # 3. 安装指定版本的 CRI-Docker(校准为0.3.13-3.el7)
    - name: 确保目标节点的 package 目录存在
      file:
        path: "{{ package_dir }}"
        state: directory
        mode: '0755'

    - name: 将控制节点的 cri-dockerd RPM 包同步到所有目标节点
      synchronize:
        src: "{{ package_dir }}/cri-dockerd-{{ cri_dockerd_version }}.x86_64.rpm"  # 匹配指定版本
        dest: "{{ package_dir }}/cri-dockerd-{{ cri_dockerd_version }}.x86_64.rpm"
        recursive: no
      delegate_to: localhost  # 修正为从控制节点同步(原配置可能指向目标节点自身)
    
    - name: 安装 cri-dockerd-{{ cri_dockerd_version }}
      yum:
        name: "{{ package_dir }}/cri-dockerd-{{ cri_dockerd_version }}.x86_64.rpm"  # 匹配指定版本
        state: present
        disable_gpg_check: yes

    - name: 复制 cri-docker.service
      copy:
        src: "{{ k8s_conf_dir }}/cri-docker.service"
        dest: /etc/systemd/system/cri-docker.service
        mode: '0644'

    - name: 复制 cri-docker.socket
      copy:
        src: "{{ k8s_conf_dir }}/cri-docker.socket"
        dest: /etc/systemd/system/cri-docker.socket
        mode: '0644'

    - name: 启动 cri-docker 服务
      systemd:
        name: cri-docker
        state: started
        enabled: yes
        daemon_reload: yes

    # 4. 安装 kubernetes 组件(与package目录包名严格匹配)
    - name: 确保目标节点的 package 目录存在
      file:
        path: "{{ package_dir }}"
        state: directory
        mode: '0755'

    - name: 将控制节点的 Kubernetes RPM 包同步到所有目标节点
      synchronize:
        src: "{{ package_dir }}/"
        dest: "{{ package_dir }}/"
        recursive: yes
      delegate_to: localhost  # 修正为从控制节点同步
    
    - name: 安装 kubernetes 组件
      yum:
        name:
          - "{{ package_dir }}/kubeadm-{{ kubernetes_version }}-150500.1.1.x86_64.rpm"
          - "{{ package_dir }}/kubectl-{{ kubernetes_version }}-150500.1.1.x86_64.rpm"
          - "{{ package_dir }}/kubelet-{{ kubernetes_version }}-150500.1.1.x86_64.rpm"
          - "{{ package_dir }}/kubernetes-cni-{{ kubernetes_cni_version }}-150500.1.1.x86_64.rpm"  # 用变量匹配CNI版本
          - "{{ package_dir }}/cri-tools-{{ cri_tools_version }}-150500.1.1.x86_64.rpm"
        state: present
        disable_gpg_check: yes

    - name: 配置 kubelet 使用 CRI-Dockerd
      lineinfile:
        path: /etc/sysconfig/kubelet
        line: 'KUBELET_EXTRA_ARGS="--container-runtime-endpoint={{ cri_socket }}"'
        state: present
        create: yes  # 新增:确保kubelet识别CRI

    - name: 启动 kubelet 服务
      systemd:
        name: kubelet
        state: started
        enabled: yes
        daemon_reload: yes  # 新增:重新加载配置

    # 5. 初始化 master 节点
    - name: 初始化 Kubernetes 集群
      command: >
        kubeadm init 
        --apiserver-advertise-address={{ master_ip }} 
        --image-repository {{ image_repository }} 
        --kubernetes-version {{ kubernetes_version }} 
        --service-cidr={{ service_cidr }} 
        --pod-network-cidr={{ pod_network_cidr }} 
        --ignore-preflight-errors=all 
        --cri-socket {{ cri_socket }}
      args:
        creates: /etc/kubernetes/admin.conf
      when: inventory_hostname == master_ip

    # 6. 配置 kubectl
    - name: 创建 .kube 目录
      file:
        path: /root/.kube
        state: directory
        mode: '0755'
      when: inventory_hostname == master_ip

    - name: 复制 admin.conf
      copy:
        src: /etc/kubernetes/admin.conf
        dest: /root/.kube/config
        remote_src: yes
        mode: '0644'
      when: inventory_hostname == master_ip

    # 7. 部署 Calico 网络插件(使用k8s目录下的v3.28+版本)
    - name: 复制 calico.yaml
      copy:
        src: "{{ k8s_conf_dir }}/calico.yaml"  # 匹配目录中的Calico配置
        dest: /root/calico.yaml
        mode: '0644'
      when: inventory_hostname == master_ip

    - name: 应用 calico 网络配置
      command: kubectl apply -f /root/calico.yaml
      when: inventory_hostname == master_ip

    # 8. 获取节点加入命令
    - name: 获取加入集群的命令
      command: kubeadm token create --print-join-command
      register: join_command
      when: inventory_hostname == master_ip

    # 9. 节点加入集群
    - name: 加入 Kubernetes 集群
      command: "{{ hostvars[master_ip]['join_command']['stdout'] }} --cri-socket {{ cri_socket }}"
      args:
        creates: /etc/kubernetes/kubelet.conf  # 新增:避免重复加入
      when: inventory_hostname in node_ips

试运行

# 检查脚本完整性
ansible-playbook --syntax-check install_k8s.yml
# 试运行
ansible-playbook -C install_k8s.yml

正式运行

ansible-playbook install_k8s.yml

跑通脚本截图

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐