【Kubernetes】Centos7.6采用ansible实现kubernetes v1.31.1以kubeadm方式安装
·
前言
之前公司新成立一个研发部门,让我帮忙部署了一套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)
软件包:
-
Kubernetes v1.31版本
-
下载地址:阿里云镜像源下载
-
一共有5个文件kubeadm、kubelet、kubectl、cri-tools、Kubernetes-cni
-
-
cri-dockerd-0.3.13-3.el7.x86_64.rpm
- 下载地址:github-cri-docker下载页
-
calico.yaml
- 下载地址:TIGERA网站下载
- 或者直接命令下载到本地 详见下面的命令
上述所有文件的终极打包版本:
- 通过网盘分享的文件:k8s.7z
- 链接: 百度网盘分享链接 提取码: vp89
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
跑通脚本截图

更多推荐
所有评论(0)