博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌
博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦
🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用微信支付,扫码加群。由于维护成本问题得不到解决,可能将停止线上维护。
🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
Java项目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》https://blog.csdn.net/qq_57756904/category_12173599.html
有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。
最后再送一句:最好是学会了,而不是学废了!!
目录
Kubernetes介绍
Kubernetes具备的功能
Kubernetes集群角色
Master管理节点组件
Node工作节点组件
非必须的集群插件
Kubernetes集群类型
Kubernetes集群规划
集群前期环境准备(所有节点执行)
禁用 SELinux
关闭防火墙
禁用 swap
开启Bridge网桥过滤
安装Containerd软件包
安装 Kubernetes 组件(所有节点执行)
Master 节点初始化
在master节点查看集群所需镜像文件
使用阿里云的源拉取镜像
改tag
使用阿里云镜像
执行初始化命令(使用阿里云镜像)
初始化成功并按照如图所示执行相应命令
根据提示将node节点加入集群(在node1和node2执行)
编辑
加入成功后在master节点验证
Kubernetes介绍
kubernetes(k8s)是2014年由Google公司基于Go语言编写的一款开源的容器集群编排系统,用于自动化容器的部署、扩缩容和管理;
kubernetes(k8s)是基于Google内部的Borg系统的特征开发的一个版本,集成了Borg系统大部分优势;
官方地址:Kubernetes
代码托管平台:https://github.com/Kubernetes
Kubernetes具备的功能
- 自我修复:k8s可以监控容器的运行状况,并在发现容器出现异常时自动重启故障实例;
- 弹性伸缩:k8s可以根据资源的使用情况自动地调整容器的副本数。例如,在高峰时段,k8s可以自动增加容器的副本数以应对更多的流量;而在低峰时段,k8s可以减少应用的副本数,节省资源;
- 资源限额:k8s允许指定每个容器所需的CPU和内存资源,能够更好的管理容器的资源使用量;
- 滚动升级:k8s可以在不中断服务的情况下滚动升级应用版本,确保在整个过程中仍有足够的实例在提供服务;
- 负载均衡:k8s可以根据应用的负载情况自动分配流量,确保各个实例之间的负载均衡,避免某些实例过载导致的性能下降;
- 服务发现:k8s可以自动发现应用的实例,并为它们分配一个统一的访问地址。这样,用户只需要知道这个统一的地址,就可以访问到应用的任意实例,而无需关心具体的实例信息;
- 存储管理:k8s可以自动管理应用的存储资源,为应用提供持久化的数据存储。这样,在应用实例发生变化时,用户数据仍能保持一致,确保数据的持久性;
- 密钥与配置管理:Kubernetes 允许你存储和管理敏感信息,例如:密码、令牌、证书、ssh密钥等信息进行统一管理,并共享给多个容器复用;
Kubernetes集群角色
k8s集群需要建⽴在多个节点上,将多个节点组建成一个集群,然后进⾏统⼀管理,但是在k8s集群内部,这些节点⼜被划分成了两类⻆⾊:
一类⻆⾊为管理节点,叫Master,负责集群的所有管理工作;
⼀类⻆⾊为⼯作节点,叫Node,负责运行集群中所有用户的容器应用 ;
Master管理节点组件
API Server:作为集群的管理入口,处理外部和内部通信,接收用户请求并处理集群内部组件之间的通信;
Scheduler:作为集群资源调度计算,根据调度策略,负责将待部署的 Pods 分配到合适的 Node 节点上;
Controller Manager:管理集群中的各种控制器,例如 Deployment、ReplicaSet、DaemonSet等,管理集群中的各种资源;
etcd:作为集群的数据存储,保存集群的配置信息和状态信息;
Node工作节点组件
Kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
容器运行时(如 Docker、containerd 等):负责运行和管理容器,提供容器生命周期管理功能。例如:创建、更新、删除容器等;
Kube-proxy:负责为集群内的服务实现网络代理和负载均衡,确保服务的访问性;
非必须的集群插件
DNS服务:严格意义上的必须插件,在k8s中,很多功能都需要用到DNS服务,例如:服务发现、负载均衡、有状态应用的访问等;
Dashboard: 是k8s集群的Web管理界面;
资源监控:例如metrics-server监视器,用于监控集群中资源利用率;
Kubernetes集群类型
一主多从集群:由一台Master管理节点和多台Node工作节点组成,生产环境下Master节点存在单点故障的风险,适合学习和测试环境使用;
多主多从集群:由多台Master管理节点和多Node工作节点组成,安全性高,适合生产环境使用;
Kubernetes集群规划
给这些虚拟机操作,关闭防火墙和selinux,进行时间同步。
主机 | IP地址 | 角色 | 操作系统 | 硬件配置 |
master | 192.168.252.128 | 管理节点 | Rocky Linux9.6 | 2CPU/2G内存/20G |
node1 | 192.168.252.129 | 工作节点 | Rocky Linux9.6 | 1CPU/2G内存/20G |
node2 | 192.168.252.130 | 工作节点 | Rocky Linux9.6 | 1CPU/2G内存/20G |
集群前期环境准备(所有节点执行)
按照集群规划修改每个节点主机名。hostnamectl执行可以查看是否设置成功,名称是否对。
# 对192.168.252.128操作
hostnamectl set-hostname master# 对192.168.252.129操作
hostnamectl set-hostname node1# 对192.168.252.130操作
hostnamectl set-hostname node2
配置本地域名解析,配置集群之间本地解析,集群在初始化时需要能够解析主机名,三台都要配
# 编辑 hosts 文件
sudo vi /etc/hosts# 添加以下内容(替换为实际IP)
192.168.252.128 k8s-master
192.168.252.129 k8s-node1
192.168.252.130 k8s-node2
禁用 SELinux
sudo setenforce 0sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
关闭防火墙
sudo systemctl stop firewalldsudo systemctl disable firewalld
禁用 swap
sudo swapoff -asudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
开启Bridge网桥过滤
bridge(桥接) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。
# 配置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOFsudo sysctl --system
参数解释:
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
命令解释:
modprobe //命令可以加载内核模块
br_netfilter //模块模块允许在bridge设备上的数据包经过iptables防火墙处理
加载配置文件,使上述配置生效
sysctl -p /etc/sysctl.d/k8s.conf
安装Containerd软件包
添加阿里云docker-ce仓库(containerd软件包在docker仓库)
dnf install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装containerd软件包
dnf install -y containerd.io#或者带上版本
dnf install -y containerd.io-1.6.20-3.1.el9.x86_64
生成containerd配置文件
sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml
启用Cgroup用于限制进程的资源使用量,如CPU、内存资源
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
替换文件中pause镜像的下载地址为阿里云仓库,3.8是自己的版本在config.toml查找
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
为Containerd配置镜像加速器,在文件中找到[plugins."io.containerd.grpc.v1.cri".registry.mirrors],在下方添加阿里云镜像加速器
vi /etc/containerd/config.toml
#...大约带153行左右[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://docker.rainbond.cc", "https://do.nark.eu.org", "https://dc.j8.work", "https://pilvpemn.mirror.aliyuncs.com", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn"]
指定contaienrd接口文件地址,在k8s环境中,kubelet通过 containerd.sock 文件与containerd进行通信
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
参数解释:
runtime-endpoint //指定了容器运行时的sock文件位置
image-endpoint //指定了容器镜像使用的sock文件位置
timeout //容器运行时或容器镜像服务之间的通信超时时间
debug //指定了crictl工具的调试模式,false表示调试模式未启用,true则会在输出中包含更多的调试日志信息,有助于故障排除和问题调试
启动containerd并设置随机自启
systemctl enable containerd --now
安装 Kubernetes 组件(所有节点执行)
kubernetes集群有多种部署方式,目前常用的部署方式有如下两种:
kubeadm部署方式:kubeadm是一个快速搭建kubernetes的集群工具;
二进制包部署方式:从官网下载每个组件的二进制包,依次去安装,部署麻烦;
其他方式:通过一些开源的工具搭建,例如:sealos;
配置kubeadm仓库,本实验使用阿里云YUM源
cat > /etc/yum.repos.d/k8s.repo <<EOF
[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
EOF
安装以下软件包:
kubeadm:用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;
kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
kubectl:用于管理k8集群的一个命令行工具;
yum -y install kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2
kubelet启用Cgroup控制组,用于限制进程的资源使用量,如CPU、内存
tee > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
设置kubelet开机自启动即可,集群初始化后自动启动
systemctl enable kubelet
Master 节点初始化
在master节点查看集群所需镜像文件
[root@master01 ~]# kubeadm config images list
W0813 20:45:03.587714 2189 version.go:104] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://cdn.dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0813 20:45:03.587821 2189 version.go:105] falling back to the local client version: v1.28.2
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
使用阿里云的源拉取镜像
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1
改tag
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15 registry.k8s.io/kube-apiserver:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15 registry.k8s.io/kube-controller-manager:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15 registry.k8s.io/kube-scheduler:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15 registry.k8s.io/kube-proxy:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
使用阿里云镜像
# 手动拉取镜像
sudo crictl pull registry.aliyuncs.com/google_containers/pause:3.9# 查看 containerd 镜像
sudo crictl images
执行初始化命令(使用阿里云镜像)
sudo kubeadm init \--pod-network-cidr=10.244.0.0/16 \--apiserver-advertise-address=<master_ip> \--image-repository=registry.aliyuncs.com/google_containers \--cri-socket=unix:///var/run/containerd/containerd.sock
初始化成功并按照如图所示执行相应命令
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
根据提示将node节点加入集群(在node1和node2执行)
kubeadm join 192.168.252.128:6443 --token 5upatr.oghll4vh1pkecs5a \--discovery-token-ca-cert-hash sha256:289b53fd07d2ff1b213f99c221e59329b06c4f369019ad4895498449a69f91d4
加入成功后在master节点验证
kubectl get nodes
部署集群网络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 的覆盖网络模型会导致额外的封装和解封装开销,从而影响网络性能。对于较小的集群或对性能要求不高的场景,这可能并不是一个严重的问题。
master01节点下载Calico文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
注意:如果无法下载,就浏览器打开该网页直接复制网页内容粘贴到master01中即可。
创建calico网络
kubectl apply -f calico.yaml
查看Calico Pod状态是否为Running
需要耐心等会让其一个一个启动,系统配置够的话大概几分钟即可。
验证集群节点状态
在master节点查看集群信息
部署Nginx测试集群
NodePort 服务
在master节点部署nginx程序测试
[root@master01 ~]# vim nginx-test.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.20.2ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: NodePortselector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80nodePort: 30002
将 nginx-test.yml 文件中定义的 Kubernetes 资源应用到集群中。
kubectl apply -f nginx-test.yml
查看Pod状态是否为Running
kubectl get pod
查看Service代理信息
kubectl get service
浏览器访问测试:http://192.168.252.128:30002/
部署Kuboard v3
新增一台虚拟机,关闭防火墙和selinux,进行时间同步。
安装Docker并配置加速器
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start# Step 5:配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.rainbond.cc" ,"https://do.nark.eu.org","https://dc.j8.work","https://pilvpemn.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Kuboard v3官方文档:安装 Kuboard v3 - kubernetes | Kuboard
安装 Kuboard v3.x 版本的指令如下:
sudo docker run -d \--restart=unless-stopped \--name=kuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT="http://192.168.252.131:80" \-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \-v /root/kuboard-data:/data \eipwork/kuboard:v3# 也可以使用镜像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,可以更快地完成镜像下载。# 请不要使用 127.0.0.1 或者 localhost 作为内网 IP \# Kuboard 不需要和 K8S 在同一个网段,Kuboard Agent 甚至可以通过代理访问 Kuboard Server \
浏览器访问:http://192.168.252.131/
默认用户名:admin 初始化密码:Kuboard123
3
所以我需要复制这个命令如下,然后拿到master主机执行。
然后执行成功后,查看状态
4