当前位置: 首页 > news >正文

《Kubernetes 集群搭建全指南:从核心概念到环境部署!》

Kubernetes 简介和集群环境搭建

1. 简介

1.1 应用部署方式演变

在部署应用程序的方式上,主要经历了三个阶段:

在这里插入图片描述

传统部署:互联网早期,会直接将应用程序部署在物理机上

优点:简单,不需要其它技术的参与

缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响

虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境

优点:程序环境不会相互产生影响,提供了一定程度的安全性 缺点:增加了操作系统,浪费了部分资源

容器化部署:与虚拟化类似,但是共享了操作系统

1.2 容器编排应用

  • Swarm:Docker自己的容器编排工具

  • Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用

  • Kubernetes:Google开源的容器编排工具

1.3 Kubernetes 简介

在这里插入图片描述

  • 在Docker作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年

  • Brog 系统运行管理着成千上万的容器应用。

  • Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经 验和教训。

  • Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交 给用户。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器 进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器

  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整

  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务

  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡

  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本

  • 存储编排:可以根据容器自身的需求自动创建存储卷

1.4 K8S的设计架构

1.4.1 K8S各个组件用途

在这里插入图片描述

一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件

1. master:集群的控制平面,负责集群的决策

  • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

  • Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

  • ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新 等

  • Etcd :负责存储集群中各种资源对象的信息

2. node: 集群的数据平面,负责为容器提供运行环境

  • kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理

  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)

  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

1.4.2 K8S各个组件之间的调用关系

当我们要运行一个web服务时 :

  1. kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
  2. web服务的安装请求会首先被发送到master节点的apiServer组件
  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知 apiServer
  4. apiServer调用controller-manager去调度Node节点安装web服务
  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个web服务的pod
  6. 如果需要访问web服务,就需要通过kube-proxy来对pod产生访问的代理
1.4.3 K8S的常用名词概念
  • Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

  • Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的

  • Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

  • Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

  • Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

  • Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

  • NameSpace:命名空间,用来隔离pod的运行环境

1.4.4 K8S的分层架构

在这里插入图片描述

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解 析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等) 以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
  • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
  • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

2. K8S集群环境搭建

2.1 K8S环境部署说明

K8S中文官网:Kubernetes

主机名IP地址角色
harbor192.168.168.100harbor仓库
master192.168.168.200K8S集群控制节点
node1192.168.168.10K8S集群工作节点
node2192.168.168.20K8S集群工作节点

注意:

所有节点禁用selinux和防火墙

所有节点同步时间和解析

所有节点安装docker-ce

所有节点禁用swap,注意注释掉/etc/fstab文件中的定义

2.2 集群环境初始化步骤

2.2.1 所有节点禁用swap
[root@master contral]# systemctl disable --now swap.target
#在配置文件里关闭swap功能
[root@master contral]# vim /etc/fstab
#注释掉这一行
#/dev/mapper/rhel-swap   none     swap    defaults        0 0
#查看一下
[root@master contral]# swapoff -a
#最好再重启一下,重启后在检查一下
[root@master contral]# reboot
2.2.2 所有节点做本地域名解析
[root@master contral]# vim /etc/hosts
192.168.168.100 reg.jinbaolei.org  #这个就是harbor仓库
192.168.168.200 master
192.168.168.10 node1
192.168.168.20 node2
2.2.3 所有节点安装docker

配置docker仓库 (博主用的是阿里云)

[root@master ~]# cat /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9.3/x86_64/stable/
gpgcheck=0
#配置完仓库之后安装
[root@master ~]# yum install docker-ce -y
2.2.4 所有节点设定docker的资源管理模式为systemd
[root@master ~]# cat /etc/docker/daemon.json
{#地址是本地harbor的地址"registry-mirrors": ["https://reg.jinbaolei.org"]
}
2.2.5 所有节点复制harbor仓库中的证书并启动docker
[root@master ~]# ll /etc/docker/certs.d/reg.jinbaolei.org/
总用量 4
-rw-r--r--. 1 root root 2195 1015 16:35 ca.crt
#开启并设置开机自启docker
[root@master ~]# systemctl enable --now docker
#查看docker 配置后的信息 出现如下的仓库地址就代表OK了
[root@master ~]# docker info

在这里插入图片描述

2.2.6 安装K8S部署工具

所有节点部署K8S仓库(这里博主用的是阿里云)

[root@master ~]# cat /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
gpgcheck=0
#安装软件
[root@master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y
2.2.7 设置kubectl命令补齐功能
[root@master ~]# dnf install bash-completion -y
[root@master ~]# echo "source < (kubectl completion bash)" >> ~/.bashrc
[root@master ~]# source ~/.bashrc
2.2.8 在所有节点安装cri-docker

k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker 软件下载: https://github.com/Mirantis/cri-dockerd

[root@master ~]# dnf install libcgroup-0.41-19.el8.x86_64.rpm  cri-dockerd-0.3.14-3.el8.x86_64.rpm  -y
[root@master ~]# cat /lib/systemd/system/docker.service
[root@master ~]# cat /lib/systemd/system/cri-docker.service
[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 --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.jinbaolei.org/k8s/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[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable --now cri-docker
#cri-docker的套接字文件
[root@master ~]# ll /var/run/cri-dockerd.sock
srw-rw----. 1 root docker 0 1018 09:28 /var/run/cri-dockerd.sock
2.2.9 在master节点上拉取K8S所需要的镜像
#拉取K8s集群所需要的镜像(用的阿里云)
[root@master ~]# kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock #指定cri-docker的套接字文件#批量上传镜像到harbor仓库
[root@master ~]# docker images | awk '/google/{print $1 ":" $2}' | awk -F \{system("docker tag " $0 " reg.jinbaolei.org/k8s/" $3)}'
[root@master ~]# docker images | awk '/jinbaolei/{system("docker push " $1 ":"$2)}'

在这里插入图片描述

2.2.10 集群初始化
#启动kubelet服务
[root@master ~]# systemctl enable --now kubelet.service
#执行初始化命令
[root@master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.jinbaolei.org/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
#指定集群配置文件变量
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
#查看当前节点状态,因为没有安装网络插件,容器没有运行
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   47h   v1.30.0
node1    NotReady    <none>          47h   v1.30.0
node2    NotReady    <none>          47h   v1.30.0

Note

此阶段如果生成的集群token找不到了可以重新生成

[root@master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.168.200:6443 --token j4ihy3.04tetfy8vlpb6kd3 --discovery-token-ca-cert-hash sha256:e6dcc0b999e2f2cf26dc3f3595e7d50f9915052d08e3fe2c12c65d2d74f25a0d
2.2.11 安装flannel网络插件

官方网站:https://github.com/flannel-io/flannel

#下载flannel的yaml部署文件
[root@k8s-master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml#下载镜像
[root@k8s-master ~]# docker pull docker.io/flannel/flannel:v0.25.5
[root@k8s-master ~]# docekr docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1#上传镜像到harbor仓库
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 reg.jinbaolei.org/flannel/flannel:v0.25.5[root@k8s-master ~]# docker push reg.jinbaolei.org/flannel/flannel:v0.25.5[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.jinbaolei.org/flannel/flannel-cni-plugin:v1.5.1-flannel1[root@k8s-master ~]# docker push reg.jinbaolei.org/flannel/flannel-cni plugin:v1.5.1-flannel#编辑kube-flannel.yml 修改镜像下载位置 将image对应的内容写成如下图
[root@master network]# vim kube-flannel.yml#修改完之后安装flannel网络插件
[root@master network]# kubectl apply -f kube-flannel.yml

在这里插入图片描述

2.2.12 让node1和node2节点加入集群

两个工作节点都执行以下命令

[root@master network]# kubeadm join 192.168.168.200:6443 --token m06qte.5uoumttxyot4g45x --discovery-token-ca-cert-hash sha256:e6dcc0b999e2f2cf26dc3f3595e7d50f9915052d08e3fe2c12c65d2d74f25a0d --cri-socket=unix:///var/run/cri-dockerd.sock

在master上查看各个节点

[root@master network]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   2d    v1.30.0
node1    Ready    <none>          2d    v1.30.0
node2    Ready    <none>          2d    v1.30.0

所有阶段的STATUS为Ready状态,那么kubernetes就装好了!

http://www.dtcms.com/a/499048.html

相关文章:

  • 找工作哪个网站好58同城做网站最简单的
  • 携程网站用js怎么做淄博哪家网络公司做网站好
  • Linux Shell 正则表达式中的 POSIX 字符集:用法与实战
  • MQTT协议,EMQX自建服务器
  • 力扣1287. 有序数组中出现次数超过25%的元素
  • Linux网络与路由配置完全指南
  • 【高并发服务器】六、日志宏的实现
  • 什么是网络割接
  • 中山网站建设文化报价个人网站设计结构图
  • 专业简历制作网站推荐渭南网站建设网站排名优化
  • Electron学习(一):创建第一个应用并打包成功
  • EF Core FromExpression 方法
  • 工厂方法模式
  • 做装机u盘那个网站好市桥做网站
  • SAP MM采购对账功能分享
  • 网页设计与网站建设考试名词解释2019网站建设工作的作用
  • 【有源码】基于Python与Spark的火锅店数据可视化分析系统-基于机器学习的火锅店综合竞争力评估与可视化分析-基于用户画像聚类的火锅店市场细分与可视化研究
  • Linux: perf: sched latency,周期性抓取看趋势,做对比
  • 统计学重要思想
  • Android 本地存储方案深度解析:SharedPreferences、DataStore、MMKV 全面对比
  • 网站开发前后端中山做外贸网站
  • ElastiCache Redis 内存告警深度分析与运维实战指南
  • Spring5.3.10源码编译和调试(IDEA+Gradle)的过程
  • JS | 知识点总结 - 原型链
  • 【Docker】Docker镜像仓库
  • EEException: Geometry.area: Unable to perform this geometry operation.
  • 逻辑和共情
  • linux安装输入法
  • git连接远程仓库并拉去推送以及克隆命令
  • steam新品节游戏推荐!手机怎么玩steam游戏!