Ansible自动化部署kubernetes集群

news/2024/9/18 0:35:59/ 标签: kubernetes, ansible, 自动化

机器环境介绍

1.1. 机器信息介绍

IP

hostname

application

CPU

Memory

192.168.204.129

k8s-master01

etcd,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,containerd

2C

4G

192.168.204.130

k8s-worker01

etcd,kubelet,kube-proxy,containerd

2C

4G

192.168.204.131

k8s-worker02

etcd,kubelet,kube-proxy,containerd

2C

4G

1.2. 规划IP地址介绍

在Kubernetes中CNI网络插件采用Calico,划分三个网段

网段信息

配置

Pod网段

172.16.0.0/16

Service网段

10.96.0.0/16

安装的kubernetets版本为1.28.5,Calico版本为3.26.4,容器运行环境为containerd

如果需要其他版本kuberneres,需要修改下面的脚本

  • 修改kubernetes源里面的版本
  • 修改安装master和worker节点里面定义的版本变量值

如下需要使用其他版本的CNI插件或者不同版本的calico插件,需要对网络插件部分脚本进行修改

安装配置ansible

2.1. ansible软件部署

apt update && apt install ansible -y
mkdir /etc/ansible/ && touch /etc/ansible/hosts

[master]
192.168.204.129[worker]
192.168.204.130
192.168.204.131
  • 配置免密登录, 此过程中不要输入密码
ssh-keygen -t rsa
  • 分发免密登录
ssh-copy-id root@192.168.204.129
ssh-copy-id root@192.168.204.130
ssh-copy-id root@192.168.204.131
  • 配置hosts
cat >> /etc/hosts <<EOF

2.2. 测试ansible连接性

  • 编写测试脚本
cat >test_nodes.yml <<EOF
---
- name: test nodeshosts: masterworkertasks:- name: Ping nodesping:
EOF

配置kubernetes脚本

3.1. 编写的kubernetes 脚本

---
- name: Performance Basic Confighosts: masterworkerbecome: yestasks:- name: Check if fstab contains swapshell: grep -q "swap" /etc/fstabregister: fstab_contains_swap- name: Temp Disable swapcommand: swapoff -awhen: fstab_contains_swap.rc == 0- name: Permanent Disable swapshell: sed -i 's/.*swap.*/#&/g' /etc/fstabwhen: fstab_contains_swap.rc == 0- name: Disable Swap unit-filesshell: |swap_units=$(systemctl list-unit-files | grep swap | awk '{print $1}')for unit in $swap_units; dosystemctl mask $unitdone- name: Stop UFW serviceservice:name: ufwstate: stopped- name: Disable UFW at bootservice:name: ufwenabled: no- name: Set timezoneshell: TZ='Asia/Shanghai'; export TZ- name: Set timezone permanentlyshell: |cat >> /etc/profile << EOFTZ='Asia/Shanghai'; export TZEOF- name: Create .hushlogin file in $HOMEfile:path: "{{ ansible_env.HOME }}/.hushlogin"state: touch- name: Install required packagesapt:name: "{{ packages }}"state: presentvars:packages:- apt-transport-https- ca-certificates- curl- gnupg- lsb-release- name: Add Aliyun Docker GPG keyshell: curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add- name: Add Aliyun Docker repositoryshell: echo "deb [arch=amd64 signed-by=/etc/apt/trusted.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker-ce.list- name: Add Aliyun Kubernetes GPG keyshell: curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg- name: Add Aliyun Kubernetes repositoryshell: echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list- name: Set apt sources to use USTC mirrorsshell: sed -i 's#cn.archive.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list- name: Update apt cacheapt:update_cache: yes- name: Load br_netfilter on startshell: echo "modprobe br_netfilter" >> /etc/profile- name: Load br_netfiltershell: modprobe br_netfilter- name: Update sysctl settingssysctl:name: "{{ item.name }}"value: "{{ item.value }}"state: presentreload: yeswith_items:- { name: "net.bridge.bridge-nf-call-iptables", value: "1" }- { name: "net.bridge.bridge-nf-call-ip6tables", value: "1" }- { name: "net.ipv4.ip_forward", value: "1" }- name: Install IPVSapt:name: "{{ packages }}"state: presentvars:packages:- ipset- ipvsadm- name: Create ipvs modulesfile:name: /etc/modules-load.d/ipvs.modulesmode: 0755state: touch- name: Write ipvs.modules filelineinfile:dest: /etc/modules-load.d/ipvs.modulesline: "#!/bin/bash\nmodprobe -- ip_vs\nmodprobe -- ip_vs_rr\nmodprobe -- ip_vs_wrr\nmodprobe -- ip_vs_sh\nmodprobe -- nf_conntrack\nmodprobe -- overlay\nmodprobe -- br_netfilter"- name: Execute ipvs.modules scriptshell: sh /etc/modules-load.d/ipvs.modules- name: Install Containerdapt:name: "{{ packages }}"state: presentvars:packages:- containerd.io- name: Generate default containerd fileshell: containerd config default > /etc/containerd/config.toml- name: Config sandbox imageshell: sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#g' /etc/containerd/config.toml- name: Modify Systemd Cgroupshell: sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml- name: Restart Containerdshell: systemctl restart containerd- name: Systemctl enable containerdshell: systemctl enable containerd- name: Install Kubernetes Masterhosts: masterbecome: yesvars:kubernetes_version: "1.28.5"pod_network_cidr: "172.16.0.0/16"service_cidr: "10.96.0.0/16"image_repository: "registry.aliyuncs.com/google_containers"calico_version: "v3.26.4"tasks:- name: Install Master kubernetes packagesapt:name: "{{ packages }}"state: presentvars:packages:- kubelet={{ kubernetes_version }}-1.1- kubeadm={{ kubernetes_version }}-1.1- kubectl={{ kubernetes_version }}-1.1- name: Initialize Kubernetes Mastercommand: kubeadm init --kubernetes-version={{ kubernetes_version }} --pod-network-cidr={{ pod_network_cidr }} --service-cidr={{ service_cidr }} --image-repository={{ image_repository }}register: kubeadm_outputchanged_when: "'kubeadm join' in kubeadm_output.stdout"- name: Save join commandcopy:content: |{{ kubeadm_output.stdout_lines [-2] }}{{ kubeadm_output.stdout_lines [-1] }}dest: /root/kubeadm_join_master.shwhen: kubeadm_output.changed- name: cope join master scriptshell: sed -i 's/"//g' /root/kubeadm_join_master.sh- name: copy kubernetes configshell: mkdir -p {{ ansible_env.HOME }}/.kube && cp -i /etc/kubernetes/admin.conf {{ ansible_env.HOME }}/.kube/config- name: enable kubectlcommand: systemctl enable kubelet- name: Create calico directoryfile:path: "{{ ansible_env.HOME }}/calico/{{ calico_version }}"state: directory- name: download calico tigera-operator.yamlcommand: wget https://ghproxy.net/https://raw.githubusercontent.com/projectcalico/calico/{{ calico_version }}/manifests/tigera-operator.yaml -O {{ ansible_env.HOME }}/calico/{{ calico_version }}/tigera-operator.yaml- name: download calico custom-resources.yamlcommand: wget https://ghproxy.net/https://raw.githubusercontent.com/projectcalico/calico/{{ calico_version }}/manifests/custom-resources.yaml -O {{ ansible_env.HOME }}/calico/{{ calico_version }}/custom-resources.yaml- name: set calico netwok rangereplace:path: "{{ ansible_env.HOME }}/calico/{{ calico_version }}/custom-resources.yaml"regexp: "blockSize: 26"replace: "blockSize: 24"- name: set calico ip poolsreplace:path: "{{ ansible_env.HOME }}/calico/{{ calico_version }}/custom-resources.yaml"regexp: "cidr: 192.168.0.0/16"replace: "cidr: {{ pod_network_cidr }}"- name: apply calico tigera-operator.yamlcommand: kubectl create -f {{ ansible_env.HOME }}/calico/{{ calico_version }}/tigera-operator.yaml- name: apply calico custom-resources.yamlcommand: kubectl create -f {{ ansible_env.HOME }}/calico/{{ calico_version }}/custom-resources.yaml- name: set crictl configcommand: crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock- name: Install Kubernetes workerhosts: workerbecome: yesvars:kubernetes_version: "1.28.5"tasks:- name: Install worker kubernetes packagesapt:name: "{{ packages }}"state: presentvars:packages:- kubelet={{ kubernetes_version }}-1.1- kubeadm={{ kubernetes_version }}-1.1- name: copy kubeadm join script to workerscopy:src: /root/kubeadm_join_master.shdest: /root/kubeadm_join_master.shmode: 0755- name: worker join to clustercommand: sh /root/kubeadm_join_master.sh- name: set crictl configcommand: crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock- name: enable kubectlcommand: systemctl enable kubelet

执行kubernetes脚本 

 ansible-playbook install-kubernetes.yml

  • 集群状态

kubectl get node -o wide

  • 集群pod状态

kubectl get pod -A


http://www.ppmy.cn/news/1525140.html

相关文章

Java小白一文讲清Java中集合相关的知识点(五)

Set接口和常用方法 基本介绍 无序&#xff08;添加和取出的顺序不一样&#xff09;&#xff0c;没有索引不允许重复元素&#xff0c;所以最多包含一个nullJDK API 中Set接口的实现类有&#xff1a; public static void main(String[] args) {//1.以set接口的实现类HashSet来讲…

手机玩机常识-------诺基亚系列机型3/5/6/7/8详细的刷机教程步骤 手机参考救砖刷机教程

诺基亚手机 诺基亚&#xff08;Nokia Corporation&#xff09;&#xff0c;成立于1865年&#xff0c;是一家主要从事移动通信设备生产和相关服务的手机公司 &#xff0c;总部位于芬兰埃斯波 。从1996年开始&#xff0c;诺基亚手机连续15年占据手机市场份额第一位置&…

【测试】——自动化测试入门(Selenium环境搭建)

&#x1f4d6; 前言&#xff1a;本文介绍了自动化测试的基础知识&#xff0c;重点讲解了Selenium环境的搭建。内容包括自动化测试的定义、自动化测试金字塔模型、Selenium的特点和工作原理&#xff0c;以及如何在Java环境中配置和使用Selenium进行UI自动化测试。 目录 &#x1…

性能测试经典案例解析——政务查询系统

各位好&#xff0c;我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的主页 道普云 文章内容具有一定门槛&#xff0c;建议先赞再收藏慢慢学习&#xff0c;有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平的你有所帮…

go 语言常见问题(4)

31. go语言编程的好处是什么 编译和运行都很快。在语言层级支持并行操作。有垃圾处理器。内置字符串和 maps。函数是 go 语言的最基本编程单位。 32. 说说go语言的select机制 select 机制用来处理异步 IO 问题select 机制最大的一条限制就是每个 case 语句里必须是一个 IO 操…

【C语言】归并排序递归和非递归——动图演示

目录 一、归并排序思想1.1 基本思想1.2 大体思路 二、实现归并排序&#xff08;递归&#xff09;三、实现归并排序&#xff08;非递归&#xff09;3.1 实现思路&#xff1a;3.2 越界处理3.3 时间复杂度和空间复杂度 总结 一、归并排序思想 1.1 基本思想 归并排序&#xff08;M…

redis为什么快

春内存访问&#xff0c;相比数据库访问磁盘要快单线程&#xff0c;避免上下文切换带来的cpu开销渐进式Rehash。减少阻塞网络模型多路复用&#xff0c;reactor模型 常用基本数据类型 5个基本数据类型2个高级数据结构&#xff08;bitmaps、hyperlog&#xff09; redis高级功能…

Gitea Action注册runner

我的是gitea也可以和github 兼容&#xff0c;只是没有github 那么靓而已 安装一个gitea仓库 docker run -d --name gitea \-p3000:3000 -p2222:22 \-v /git/data:/data \ -v /etc/timezone:/etc/timezone:ro \-v /etc/localtime:/etc/localtime:ro \gitea/gitea:1.21.1setti…

【漏洞复现】某4国语言抖音点赞系统存在任意文件上传漏洞

漏洞描述 某4国语言 中文+英文+泰语+繁体 UI也非常不错 功能比较完善!【系统功能】1.任务后台添加/用户发布,后台审核 2.机器人、大转盘;已完善 3.支付可以对接第三方和线下银行卡收款;4.后台增加员工账号(推广员专属账号),可以查看员工推广报表;5.会员等级功能,会员级…

wireshark打开时空白|没有接口,卸载重装可以解决

解决方法&#xff1a;卸载wireshark,全选卸载干净&#xff0c;重新安装旧版的wireshark4.2.7, 甚至cmd下运行net start npf时显示服务名无效&#xff0c;但打开wireshark仍有多个接口 错误描述&#xff1a; 一开始下载的是wireshark的最新版&#xff0c;win11 x64 在安装wir…

Redis Sentinel(哨兵)详解

目录 一&#xff1a;什么是Sentinel&#xff08;哨兵&#xff09; 二&#xff1a;Sentinel有什么用 1.监控 2.故障转移 3通知 4.配置提供 三&#xff1a;Sentinel如何检测master节点宕机 1.主观下线 2.客观下线 四&#xff1a;Sentinel是如何选举出新的master 1.s…

学习常用的Docker命令

Docker作为一种强大的容器化技术&#xff0c;为开发者提供了便捷的应用部署和管理方式。本文将介绍Docker常用命令&#xff0c;按照不同的操作分类&#xff0c;旨在帮助初学者更好地理解和使用Docker。Docker 常用命令可以分为以下几类&#xff1a; 容器命令&#xff1a;主要用…

Qt常用控件——QTextEdit

文章目录 QTextEdit核心属性和信号同步显示示例信号示例 QTextEdit核心属性和信号 QTextEdit表示多行输入框&#xff0c;是一个富文本和markdown编辑器&#xff0c;并且能在内存超出编辑框范围时自动提供滚动条。 QPlainTexEdit是纯文本&#xff0c;QTextEdit不仅表示纯文本&a…

21. 合并两个有序链表【 力扣(LeetCode) 】

一、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 二、测试用例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 []…

java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)

项目简介 智能无人仓库管理实现了以下功能&#xff1a; 基于Spring Boot智能无人仓库管理的主要使用者分为&#xff1a; 管理员的功能有&#xff1a;员工信息的查询管理&#xff0c;可以删除员工信息、修改员工信息、新增员工信息 &#x1f495;&#x1f495;作者&#xff1a…

MySQL 大量 IN 的查询优化

背景 &#xff08;1&#xff09;MySQL 8.0 版本 &#xff08;2&#xff09;业务中遇到大量 IN 的查询&#xff0c;例&#xff1a; SELECT id, username, icon FROM users WHERE id IN (123, 523, 1343, ...);其中 id 为主键&#xff0c;IN 的列表长度有 8000 多个 问题 …

Java数据结构应用(力扣题20. 有效的括号)

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

深入解析 `node-html-to-image` 库及其配置选项

深入解析 node-html-to-image 库及其配置选项 node-html-to-image 是一个功能强大的 Node.js 库&#xff0c;它可以将 HTML 内容转换为图像。该库利用 Puppeteer&#xff08;一个无头 Chrome 浏览器&#xff09;来渲染 HTML 并生成图像。本文将详细介绍 node-html-to-image 库…

如何在Oracle中实现数据的加密

在Oracle数据库中实现数据加密是一项重要的安全措施&#xff0c;它可以保护存储在数据库中的敏感信息不被未授权访问。Oracle提供了多种数据加密方法&#xff0c;包括透明数据加密&#xff08;TDE&#xff09;、列级加密和使用内置加密函数等。以下是一些在Oracle中实现数据加密…

SQL编程题复习(24/9/13)

练习题 x40 10-193 在顾客表(customers)中找出所在城市(City)为London的公司名(CompanyName)和联系人名(ContactName)10-194 查询价格低于1600美元的个人计算机的型号、速度及硬盘容量,将"speed"改为"兆赫"&#xff0c;"hd"改为"吉字节&quo…