经常投诉网站快照,揭阳做网站,wordpress 盈利模式,手机网站 等比缩放目录
Kubernetes介绍
Kubernetes具备的功能
Kubernetes集群角色
Master管理节点组件
Node工作节点组件
非必须的集群插件
Kubernetes集群类型
Kubernetes集群规划
集群前期环境准备
开启Bridge网桥过滤
关闭SWAP交换分区
安装Containerd软件包
K8s集群部署方式
集…目录
Kubernetes介绍
Kubernetes具备的功能
Kubernetes集群角色
Master管理节点组件
Node工作节点组件
非必须的集群插件
Kubernetes集群类型
Kubernetes集群规划
集群前期环境准备
开启Bridge网桥过滤
关闭SWAP交换分区
安装Containerd软件包
K8s集群部署方式
集群初始化
部署集群网络Calico
验证集群节点状态
部署Nginx测试集群
部署Kuboard v3 Kubernetes介绍 kubernetesk8s是2014年由Google公司基于Go语言编写的一款开源的容器集群编排系统用于自动化容器的部署、扩缩容和管理
kubernetesk8s是基于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地址 角色 操作系统 硬件配置 master01 192.168.226.21 管理节点 Rocky 9.4mini 2CPU/4G内存/50G node01 192.168.226.22 工作节点 Rocky 9.4mini 2CPU/4G内存/50G node02 192.168.226.23 工作节点 Rocky 9.4mini 2CPU/4G内存/50G 集群前期环境准备 按照集群规划修改每个节点主机名
# 对192.168.226.21操作
hostnamectl set-hostname master01# 对192.168.226.22操作
hostnamectl set-hostname node01# 对192.168.226.23操作
hostnamectl set-hostname node02
配置本地域名解析配置集群之间本地解析集群在初始化时需要能够解析主机名三台都要配
echo 192.168.226.21 master01 /etc/hosts
echo 192.168.226.22 node01 /etc/hosts
echo 192.168.226.23 node02 /etc/hosts 开启Bridge网桥过滤
本步骤三台主机都执行 bridge(桥接) 是 Linux 系统中的一种虚拟网络设备它充当一个虚拟的交换机为集群内的容器提供网络通信功能容器就可以通过这个 bridge 与其他容器或外部网络通信了。
cat /etc/sysctl.d/k8s.conf EOF
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
命令解释
modprobe //命令可以加载内核模块
br_netfilter //模块模块允许在bridge设备上的数据包经过iptables防火墙处理
加载配置文件使上述配置生效
sysctl -p /etc/sysctl.d/k8s.conf 关闭SWAP交换分区
本步骤三台主机都执行 为了保证 kubelet 正常工作k8s强制要求禁用否则集群初始化失败
临时关闭
swapoff -a 永久关闭
sed -ri s/.*swap.*/#/ /etc/fstab 安装Containerd软件包 本步骤三台主机都执行 添加阿里云docker-ce仓库containerd软件包在docker仓库
dnf install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装containerd软件包
dnf install -y containerd.io-1.6.20-3.1.el9.x86_64
生成containerd配置文件
containerd config default | tee /etc/containerd/config.toml
启用Cgroup用于限制进程的资源使用量如CPU、内存资源
sed -i s#SystemdCgroup false#SystemdCgroup true# /etc/containerd/config.toml
替换文件中pause镜像的下载地址为阿里云仓库
sed -i s#sandbox_image registry.k8s.io/pause:3.6#sandbox_image registry.aliyuncs.com/google_containers/pause:3.9# /etc/containerd/config.toml 为Containerd配置镜像加速器在文件中找到[plugins.io.containerd.grpc.v1.cri.registry.mirrors]在下方添加阿里云镜像加速器
vim /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 K8s集群部署方式 kubernetes集群有多种部署方式目前常用的部署方式有如下两种
kubeadm部署方式kubeadm是一个快速搭建kubernetes的集群工具
二进制包部署方式从官网下载每个组件的二进制包依次去安装部署麻烦
其他方式通过一些开源的工具搭建例如sealos
配置kubeadm仓库本实验使用阿里云YUM源
cat /etc/yum.repos.d/k8s.repo EOF
[kubernetes]
nameKubernetes
baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled1
gpgcheck1
repo_gpgcheck1
gpgkeyhttps://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-driversystemd
EOF
设置kubelet开机自启动即可集群初始化后自动启动
systemctl enable kubelet 集群初始化 在master01节点查看集群所需镜像文件
[rootmaster01 ~]# 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.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
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.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.12
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.12 registry.k8s.io/kube-apiserver:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.12 registry.k8s.io/kube-controller-manager:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.12 registry.k8s.io/kube-scheduler:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.12 registry.k8s.io/kube-proxy:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1在master01节点生成初始化集群的配置文件
kubeadm config print init-defaults kubeadm-config.yaml
其中配置文件需要修改如下内容
[rootmaster01 ~]# vim kubeadm-config.yaml
#本机的IP地址
advertiseAddress: 192.168.226.21#本机名称
name: master01#集群镜像下载地址修改为阿里云
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers并通过配置文件初始化集群
kubeadm init --config kubeadm-config.yaml --upload-certs
选项说明
init //初始化集群
--config //通过配置文件初始化
--upload-certs //初始化过程将生成证书并将其上传到etcd存储中以便后续节点的加入 提示如果哪个节点出现问题可以使用下列命令重置当前节点 kubeadm reset --force 根据集群初始化后的提示执行如下命令 mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config根据提示将node节点加入集群加入成功后在master节点验证 这个命令复制给node01和node02执行
# 这个密钥每次不一样这里用你的密钥复制本条命令给你执行无效
kubeadm join 192.168.226.21:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:966e2980933706623ab15179ff564ab39fd337dfd8524f72e404c2b6885be449 如此就是加入成功了
[rootmaster01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane 3m47s v1.28.2
node01 NotReady none 2m30s v1.28.2
node02 NotReady none 2m27s v1.28.2部署集群网络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 需要耐心等会让其一个一个启动系统配置够的话大概几分钟即可。
[rootmaster01 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-9d57d8f49-4jg5h 1/1 Running 0 4m32s
calico-node-28lg6 1/1 Running 0 4m32s
calico-node-4cd4d 1/1 Running 0 4m32s
calico-node-x6rsk 1/1 Running 0 4m32s
coredns-6554b8b87f-2828d 1/1 Running 0 6m13s
coredns-6554b8b87f-nf2jc 1/1 Running 0 6m13s
etcd-master01 1/1 Running 1 6m17s
kube-apiserver-master01 1/1 Running 1 6m18s
kube-controller-manager-master01 1/1 Running 1 6m17s
kube-proxy-8wdxg 1/1 Running 0 5m18s
kube-proxy-hhf8n 1/1 Running 0 6m13s
kube-proxy-krz76 1/1 Running 0 5m14s
kube-scheduler-master01 1/1 Running 1 6m17s验证集群节点状态 在master01节点查看集群信息
[rootmaster01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 2m47s v1.28.2
node01 Ready none 104s v1.28.2
node02 Ready none 100s v1.28.2 部署Nginx测试集群 NodePort 服务
在master01节点部署nginx程序测试
[rootmaster01 ~]# 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
[rootmaster01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 86s查看Service代理信息
[rootmaster01 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 none 443/TCP 16m
nginx-svc NodePort 10.103.46.52 none 80:30002/TCP 115s
浏览器访问测试http://192.168.226.21:30002/ 部署Kuboard v3 新增一台虚拟机关闭防火墙和selinux进行时间同步。 主机名 IP地址 角色 操作系统 硬件配置 localhost 192.168.226.24 web-ui Rocky 9.4mini 2CPU/2G内存/20G
安装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 sdownload.docker.commirrors.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.cgroupdriversystemd],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 \--restartunless-stopped \--namekuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINThttp://192.168.226.21:80 \-e KUBOARD_AGENT_SERVER_TCP_PORT10081 \-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 \
[rootlocalhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2a4e5aefa79 eipwork/kuboard:v3 /entrypoint.sh 14 seconds ago Up 14 seconds 0.0.0.0:80-80/tcp, :::80-80/tcp, 0.0.0.0:10081-10081/tcp, :::10081-10081/tcp, 443/tcp kuboard浏览器访问http://192.168.226.24/
默认用户名admin 初始化密码Kuboard123 这里有个坑如果这个IP地址和这个部署kuboard的IP不一致的话执行命令时需要修改为当前页面的这个IP例如我这里就需要将尾号21的改为24的IP地址
并在执行后会下载一个文件kuboard-agent.yaml 将这个文件里的IP换成你部署kuboard的IP否则是运行不成功的。
kuboard-agent.yaml
所以我需要复制这个命令如下然后拿到master01主机执行。
然后执行成功后查看状态
[rootmaster01 ~]# kubectl get pod -n kuboard
NAME READY STATUS RESTARTS AGE
kuboard-agent-echq2h-2-67bcfcb6f5-r5qjc 1/1 Running 0 10s
kuboard-agent-echq2h-9cc9cf87-dvmm5 1/1 Running 0 10s这里运行后回到kuboard的页面查看