kubernetes(k8s)集群部署(2)

目录

k8s集群类型

k8s集群规划:

1.基础环境准备:

(1)保证可以连接外网

(2)关闭禁用防火墙和selinux

(3)同步阿里云服务器时间(达到集群之间时间同步)

(4)主机名规划

2.集群环境部署

(1)配置集群之间本地解析

(2)开启bridge网桥过滤功能

(3)配置ipvs代理功能

(4)关闭禁用swap分区

3.安装Docker(采用离线版部署较快)

如果想直接在线安装Docker可以看我上一章文档

(1)上传离线包并解压

(2)安装Docker

(3)启用 Cgroup 控制组

(4)启动并查看Docker版本

Docker部署成功!!!

4.k8s集群部署

部署方式有哪些:

(1)使用阿里仓库进行安装

(2)安装集群软件

(3)配置 kubelet 启用 Cgroup 控制组

(4)设置kubelet开机自启

5.集群初始化

(1)查看集群所需镜像文件

(2)创建集群初始化配置文件

(3)配置集群初始化文件

(4)集群初始化

(5)根据提示,在master生成集群管理员配置文件

6.node节点加入集群

在master节点重新生成包含新token的完整命令

(2)查看节点是否加入成功

7.部署Calico网络

网络模型的区别:

性能的区别:

(1)在 master节点安装下载 Calico 的yaml文件

(2)创建calico网络

(3)查看calico的Pod状态

离线部署Calico网络(如果拉取不到可使用离线方式部署):

(4)检查集群状态

8.验证:使用k8s运行一个nginx容器

(1)简单写一个nginx的yaml文件

(2)创建nginx容器

(4)浏览器访问测试:

部署成功!!!!


k8s集群类型

一主多从集群:由一台Master管理节点和多台Node工作节点组成,生产环境下Master节点存在单点故障的风险,适合学习和测试环境使用;

多主多从集群:由多台Master管理节点和多Node工作节点组成,安全性高,适合生产环境使用;

k8s集群规划:

本章采用一主多从集群进行演示

主机名

IP地址

角色

操作系统

硬件最低配置

Master 

192.168.100.101

管理节点

CentOS 7

2Core/4G内存/50G+

node01

192.168.100.102

工作节点

CentOS 7

1Core/2G内存/50G

node02

192.168.100.103

工作节点

CentOS 7

1Core/2G内存/50G+

注意:master节点CPU必须为2核心(不然后续集群初始化会报错),内存2+

1.基础环境准备:

(1)保证可以连接外网

(2)关闭禁用防火墙和selinux

3同步阿里云服务器时间(达到集群之间时间同步)
yum install ntpdate -yntpdate ntp1.aliyun.com

(4)主机名规划
hostnamectl set-hostname 主机名

2.集群环境部署

提示:以下前期环境准备需要在所有节点都执行可使用Ansible或xshell自带的终端同步

(1)配置集群之间本地解析

集群在初始化时需要能够解析到每个节点的主机名

cat <<END>> /etc/hosts
192.168.100.101 master
192.168.100.102 node01
192.168.100.103 node02
END
(2)开启bridge网桥过滤功能

bridge (桥接网络) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。

cat <<EOF>> /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1 
EOF

参数解释: 

net.bridge.bridge-nf-call-ip6tables = 1 //对网桥上的IPv6数据包通过iptables处理

net.bridge.bridge-nf-call-iptables = 1 //对网桥上的IPv4数据包通过iptables处理 net.ipv4.ip_forward = 1 //开启IPv4路由转发,来实现集群中的容器与外部网络的通信

由于开启 bridge 功能,需要加载 br_netfilter 模块来允许在 bridge 设备上的数据包经过 iptables 防火墙处理

modprobe br_netfilter && lsmod | grep br_netfilter

加载配置文件,使上述配置生效

sysctl -p /etc/sysctl.d/k8s.conf

(3)配置ipvs代理功能

在k8s中 Service 有两种代理模式,一种是基于 iptables 的,一种是基于 ipvs ,两者对比 ipvs 负载均衡算法更加的灵活,且带有健康检查的功能,如果想要使用 ipvs 模式,需要手动载入 ipvs 模块。

ipset 和 ipvsadm 是两个与网络管理和负载均衡相关的软件包,提供多种负载均衡算法,如轮询(Round Robin)、加权轮询(Weighted Round Robin)、最小连接(Least Connection)、加权最小连接(Weighted Least Connection)等;

使用yum安装

yum -y install ipset ipvsadm

将需要加载的 ipvs 相关模块写入到文件中

cat <<EOF>> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

模块介绍: 

ip_vs //提供负载均衡的模块

ip_vs_rr //轮询算法的模块(默认)

ip_vs_wrr //加权轮询算法的模块,根据后端服务器的权重值转发请求

ip_vs_sh //哈希算法的模块,同一客户端的请求始终被分发到相同的后端服务器,保证会话一致性 nf_conntrack //链接跟踪的模块,用于跟踪一个连接的状态,例如 TCP 握手、数据传输和连接关闭等

添加可执行权限执行脚本加载模块

chmod +x /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules 
lsmod | grep ip_vs

(4)关闭禁用swap分区

为了保证 kubelet 正常工作要求禁用SWAP,否则集群初始化失败

swapoff -ased -i '/swap/s/^/#/' /etc/fstab

查看是否关闭

free -h|grep -i swap

为什么要关闭swap分区?

swap 启用后,在使用磁盘空间和内存交换数据时,性能表现会较差,会减慢程序执行的速度。有的软件的设计师不想使用交换,例如:kubelet 在 v1.8 版本以后强制要求 swap 必须关闭,否则会报错。

 

3.安装Docker(采用离线版部署较快)

如果想直接在线安装Docker可以看我上一章文档

Windows和Linux系统部署Docker容器(2)_windows linux如何运行 docker程序-CSDN博客

注意:也是三台服务器都需要安装,docker版本不要安装的太新尽量是20.10.0或以下版本不然会与k8s出现不兼容现象(需要另加插件),具体可查看k8s官网详情

百度网盘下载离线资源(会有限速现象)

链接:https://pan.baidu.com/s/13es-mHZx7QzYWLpu4V399w?pwd=f36s 
提取码:f36s

(1)上传离线包并解压
tar xfz docker_20.10.0.tar.gz
(2)安装Docker
cd docker_20.10.0/
yum -y install ./*.rpm
(3)启用 Cgroup 控制组

用于限制进程的资源使用量,如CPU、内存资源

mkdir /etc/dockercat <<EOF>> /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
(4)启动并查看Docker版本
systemctl enable docker --now
docker -v

Docker部署成功!!!

4.k8s集群部署

部署方式有哪些:

k8s集群有多种部署方式,目前常用的部署方式有如下两种:

kubeadm 部署方式:kubeadm是一个快速搭建kubernetes的集群工具;

二进制包部署方式对新手不友好:从官网下载每个组件的二进制包,依次去安装,部署麻烦;

其他方式:通过一些开源的工具搭建,例如:sealos;

本章使用Kubeadm方式部署k8s集群,需要配置k8s软件仓库来安装集群所需软件,本实验使用阿里云YUM源

注意:三台服务器都需要配置

(1)使用阿里仓库进行安装
cat <<END>> /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
END
(2)安装集群软件

本实验安装k8s 1.23.0版本软件

yum install -y  kubeadm-1.23.0-0  kubelet-1.23.0-0 kubectl-1.23.0-0

如果报错:

需下载使用公网仓库(例如:阿里公网仓库)下载依赖

(3)配置 kubelet 启用 Cgroup 控制组

用于限制进程的资源使用量,如CPU、内存等

echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' >/etc/sysconfig/kubelet
(4)设置kubelet开机自启

5.集群初始化

###master节点配置

(1)查看集群所需镜像文件
[root@master ~]# kubeadm config images list

(2)创建集群初始化配置文件
[root@master ~]# kubeadm config print init-defaults > kubeadm-config.yml
(3)配置集群初始化文件
[root@master ~]# vim kubeadm-config.ymladvertiseAddress: 192.168.100.101name: masterimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

(4)集群初始化
[root@master ~]# kubeadm init --config kubeadm-config.yml --upload-certs

拉取镜像过程可能会有点长请耐心等待(快慢取决于网速

选项说明: --upload-certs //初始化过程将生成证书,并将其上传到etcd存储中,避免证书被移动或者删除,也不会影响集群。

-------------------------------------------------------------------------------

init初始化失败:

注意:如果初始化环境报错说明前面基础环境有问题请仔细检查如:cpu2+ 内存2+,使用如下命令进行回退

[root@k8s-master ~]# kubeadm reset -f

[root@k8s-master ~]#

[root@k8s-master ~]# rm -rf /etc/kubernetes

[root@k8s-master ~]# rm -rf /var/lib/etcd/

[root@k8s-master ~]# rm -rf $HOME/.kube

----------------------------------------------------------------------------------------

如果显示此信息说明初始化成功!前面的基础环境没有问题

(5)根据提示,在master生成集群管理员配置文件

注意:认真查看提示信息,不能装作没看见

#在master主节点执行
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

6.node节点加入集群

可根据提示信息加入node节点

---------------------------------------------------------------------------------------------------

token有效期为24小时,如果提示信息失效可重新生成(如果可以看到或找到提示信息就不用生成了):

master节点重新生成包含新token的完整命令

重新生成token

[root@master ~]# kubeadm token create

查看token

[root@master ~]# kubeadm token create --print-join-command

-------------------------------------------------------------------------------------------------------------------

(2)查看节点是否加入成功
[root@master ~]# kubectl get nodes

7.部署Calico网络

Calico  Flannel 是两种流行的 k8s 网络插件,它们都为集群中的 Pod 提供网络功能。然而,它们在实现方式和功能上有一些重要区别:

网络模型的区别:

Calico 使用 BGP(边界网关协议)作为其底层网络模型。它利用 BGP 为每个 Pod 分配一个唯一的 IP 地址,并在集群内部进行路由。Calico 支持网络策略,可以对流量进行精细控制,允许或拒绝特定的通信

Flannel 则采用了一个简化的覆盖网络模型。它为每个节点分配一个 IP 地址子网,然后在这些子网之间建立覆盖网络。Flannel 将 Pod 的数据包封装到一个更大的网络数据包中,并在节点之间进行转发。Flannel 更注重简单和易用性,不提供与 Calico 类似的网络策略功能

性能的区别:

由于 Calico 使用 BGP 进行路由,其性能通常优于 Flannel。Calico 可以实现直接的 Pod 到 Pod 通信,而无需在节点之间进行额外的封装和解封装操作。这使得 Calico 在大型或高度动态的集群中具有更好的性能。

Flannel 的覆盖网络模型会导致额外的封装和解封装开销,从而影响网络性能。对于较小的集群或对性能要求不高的场景,这可能并不是一个严重的问题。

(1)在 master节点安装下载 Calico 的yaml文件
[root@master ~]# 
wget https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml
(2)创建calico网络
[root@master ~]# kubectl apply -f calico.yaml
(3)查看calico的Pod状态
[root@master ~]# kubectl get pod -n kube-system

显示镜像正在拉取

等十几分钟再次查看

这种现象就属于镜像没有拉取成功,正常的话应该显示Runing状态,由于镜像在国外难免会出一些问题,所以只能使用离线资源(提前下载好的镜像)了大家可以看我上一文档

离线部署Calico网络(如果拉取不到可使用离线方式部署):

k8s离线部署Calico网络(2续)-CSDN博客

--------------------------------------------------------------------------

删除calico命令:

[root@master ~]# kubectl delete pod 节点名称 -n kube-system

使用变量删除所有:慎用

[root@master ~]#  kubectl delete pod $(kubectl get pods -n kube-system|grep calico-node|awk '{print $1}') -n kube-system

----------------------------------------------------------------------------------

(4)检查集群状态
[root@master ~]# kubectl get nodes

状态显示‘Ready’就说明集群没有问题可以使用了!!!

8.验证:使用k8s运行一个nginx容器

(1)简单写一个nginx的yaml文件
[root@master ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: NodePortselector:app: nginxports:- port: 80targetPort: 80
nodePort: 30003
(2)创建nginx容器
[root@master ~]# kubectl apply -f nginx.yaml

(3)查看容器状态和映射端口

[root@master ~]# kubectl get pod,svc

(4)浏览器访问测试:

http://192.168.100.103:30003/

部署成功!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/26040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html+CSS+js部分基础运用20

根据下方页面效果如图1所示&#xff0c;编写程序&#xff0c;代码放入图片下方表格内 图1.效果图 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" conte…

LabVIEW调用DLL时需注意的问题

在LabVIEW中调用DLL&#xff08;动态链接库&#xff09;是实现与外部代码集成的一种强大方式&#xff0c;但也存在一些常见的陷阱和复杂性。本文将从参数传递、数据类型匹配、内存管理、线程安全、调试和错误处理等多个角度详细介绍LabVIEW调用DLL时需要注意的问题&#xff0c;…

UE5实战篇二(对话系统1):导语

实现一款商业游戏中使用的对话系统插件。 虚幻商店链接&#xff1a; https://www.unrealengine.com/marketplace/zh-CN/product/0b84eaa9343543f58138bc4956a2fa8f 1. 内容可配置 2. 多分支对话、旁白对话、对话序列动画、文字显示及各种特效 3. 可配置文字、音效、呈现位…

UML 统一建模语言简介

UML&#xff08;统一建模语言&#xff0c;Unified Modeling Language&#xff09;是一种标准化的建模语言&#xff0c;广泛用于软件工程中以可视化、描述、构建和记录系统的结构和行为。UML 提供了多种图表&#xff0c;用于不同的建模需求。以下是 UML 的主要使用方法和一些常见…

邻接矩阵深度优先遍历

深度优先遍历&#xff0c;就是一条路&#xff0c;走到底&#xff0c;然后再走下一个岔路。 下面代码就主要使用递归来进行&#xff0c;当然也可以借助栈来实现。 private void traverse(char v, boolean[] visited) {int index _getIndexOfV(v);//获取v顶点在vertexS字符数组…

【Spring Boot】过滤敏感词的两种实现

文章目录 项目场景前置知识前缀树 实现方式解决方案一&#xff1a;读取敏感词文件生成前缀树构建敏感词过滤器1. 导入敏感词文件 src/main/resources/sensitive_words.txt2. 构建敏感词过滤器 SensitiveFilter3. 测试与使用 解决方案二&#xff1a;使用第三方插件 houbb/sensit…

Prisma数据库ORM框架学习

初始化项目 中文网站 点击快速开始,点击创建sql项目,后面一步一步往后走 这个博主也挺全的,推荐下 可以看这个页面初始化项目跟我下面是一样的,这里用得是ts,我下面是js,不需要额外的配置了 1.vscode打开一个空文件夹 2.npm init -y 初始化package.json 3.安装相关依赖 …

「前端+鸿蒙」鸿蒙应用开发-TS接口-语法多态

在 TypeScript 中&#xff0c;接口&#xff08;Interfaces&#xff09;是一种强大的方式来定义对象的结构&#xff0c;它们用于类型检查和确保对象符合特定的结构。接口也可以用于类&#xff0c;实现类似多态的特性。以下是 TypeScript 中接口的语法和多态的快速入门指南。 TS快…

常用的通信协议

最近在做项目&#xff0c;用到了一些通信协议&#xff0c;这里详细整理一下相关的通信协议&#xff0c;方便以后查阅。 常用的通信协议 单工 半双工 全双工单工通信&#xff08;Simplex Communication&#xff09;半双工(Half-duplex Communication)全双工&#xff08;Full-dup…

速卖通如何放关联?

大家都知道&#xff0c;想要进行多账号操作必须一再小心&#xff0c;否则会有很大的关联风险&#xff0c;而账号关联所带来的后果是卖家绝对不能轻视的&#xff0c;严重的话会导致封号&#xff0c;这样一来自己前期的辛苦运营就全都打水漂了&#xff0c;因此防关联很重要&#…

Python框架scrapy有什么天赋异禀

Scrapy框架与一般的爬虫代码之间有几个显著的区别&#xff0c;这些差异主要体现在设计模式、代码结构、执行效率以及可扩展性等方面。下面是一些关键的不同点&#xff1a; 结构化与模块化&#xff1a; Scrapy&#xff1a;提供了高度结构化的框架&#xff0c;包括定义好的Spider…

MySQL—多表查询—小结

一、引言 前面的博客已经全部学习完了关于多表查询。接下来对多表查询进行一个小结。 &#xff08;1&#xff09;多表查询主要是讲了两个方面 多表关系 &#xff08;不管业务关系如何的复杂&#xff0c;最终多表的关系基本上可以分为三类&#xff09; "一对多"、&qu…

大数据技术Hbase列数据库——topic3

目录 启动Hadoop启动HbaseHbase常用Shell命令基本命令关于表的操作增删改查询 启动Hadoop 1.到Hadoop安装目录下输入命令 sbin/start-all.sh[rootlocalhost hadoop-2.7.1]# sbin/start-all.sh This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh Starti…

《Vue》系列文章目录

Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以…

载波相移CPS-SPWM调制方法的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 载波相移CPS-SPWM调制方法的simulink建模与仿真&#xff0c;载波相移PWM方法&#xff1a; 2.系统仿真结果 单极倍频 釆用 调制波 反相 法 &#xff0c; 基本调制原理为 &…

Golang 避坑指南

文章目录 1. Channel 与 Goroutine 泄露1.1 发送不接收1.2 接收不发送1.3 nil channel2. 跳出 for-switch 或 for-select 3.for 迭代变量3.1 闭包中的for迭代变量3.2 for range 迭代变量 4. 循环内的 defer5.defer 函数的参数值6.nil interface 和 nil interface 值7.结构体指针…

【Bazel入门与精通】 rules之属性

https://bazel.build/extending/rules?hlzh-cn#attributes Attributes An attribute is a rule argument. Attributes can provide specific values to a target’s implementation, or they can refer to other targets, creating a graph of dependencies. Rule-specifi…

B3810 [语言月赛 202307] 扶苏和串

[语言月赛 202307] 扶苏和串 题目背景 众所周知&#xff0c;每个月入门赛的字符串题都是扶苏来枚举 idea 出出来的。 题目描述 给定一个 01 字符串 s s s&#xff0c;你可以任选 s s s 的一个非空子串&#xff0c;把这个子串在 s s s 中翻转一次。 问你能得到字典序最小…

R语言:使用 stringr 包进行字符串处理和正则表达式匹配

在 R 编程中&#xff0c;字符串处理和正则表达式匹配是常见的需求&#xff0c;而 stringr 包提供了强大的工具来简化这些操作。本文将介绍 stringr 包的基础用法&#xff0c;并结合正则表达式的相关内容&#xff0c;帮助你高效处理字符串数据。 字符串基础 创建字符串 在 R …

大模型训练数据白皮书深度解读

摘要 随着人工智能技术的飞速发展&#xff0c;大模型在各个领域的应用日益广泛。《大模型训练数据白皮书》为我们提供了对大模型训练数据重要性的深刻理解&#xff0c;本文将深度解读白皮书的主要内容&#xff0c;探讨大模型训练数据的关键要素、面临的挑战与未来发展趋势。 …