目录
一、kubernetes简介
1、k8s的概念
2、k8s各个组件及用途
3、k8s各组件之间的调用关系
4、k8s常用名词概念
5、k8s的分层架构
二、kubernetes安装部署
1、k8s集群环境搭建
2、本地解析、swap禁用
3、安装docker
4、复制harbor仓库中的证书并启动docker
5、设定docker的资源管理模式为systemd
6、安装docker插件及其依赖性
7、安装K8S部署工具
8、设置kubectl命令补齐功能
9、在master节点拉取镜像
10、集群初始化
11、安装flannel网络插件
12、k8s集群环境检测
一、kubernetes简介
1、k8s的概念
Kubernetes(简称 k8s)是一个开源的容器编排引擎,它可以自动化部署、扩展和管理容器化应用。它提供了强大的功能,如自动调度、弹性伸缩、服务发现、负载均衡等,使得容器化应用的部署和管理更加高效、可靠和便捷。通过 k8s,你可以轻松地在不同的环境中运行和管理大规模的容器化应用,提高开发和运维效率。
-
在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年
-
Borg系统运行管理着成千上万的容器应用。
-
Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
-
Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
-
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
-
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
-
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
-
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
-
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
-
存储编排:可以根据容器自身的需求自动创建存储卷
2、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内部的服务发现和负载均衡
3、k8s各组件之间的调用关系
当我们要运行一个web服务时:
-
kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
-
web服务的安装请求会首先被发送到master节点的apiServer组件
-
apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上
在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
-
apiServer调用controller-manager去调度Node节点安装web服务
-
kubelet接收到指令后,会通知docker,然后由docker来启动一个web服务的pod
-
如果需要访问web服务,就需要通过kube-proxy来对pod产生访问的代理
4、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的运行环境
5、k8s的分层架构
-
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
-
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
-
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
-
接口层:kubectl命令行工具、客户端SDK以及集群联邦
-
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
-
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
-
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
二、kubernetes安装部署
基于红帽9系统的k8s集群环境搭建,前期准备:四台主机其中包含一台专门用来存放镜像的harbor仓库主机和一个主节点主机、两个工作节点主机。harbor仓库搭建可参考文章Docker仓库搭建-CSDN博客
1、k8s集群环境搭建
主机名 | ip | 角色 |
reg.leoma.org | 172.25.254.254 | harbor仓库 |
k8s-master.mlh.org | 172.25.254.100 | master,k8s集群控制节点 |
k8s-node1.mlh.org | 172.25.254.10 | worker,k8s集群工作节点 |
k8s-node2.mlh.org | 172.25.254.20 | worker,k8s集群工作节点 |
-
所有节点禁用selinux和防火墙
-
所有节点同步时间和解析
-
所有节点安装docker-ce
-
所有节点禁用swap,注意注释掉/etc/fstab文件中的定义
2、本地解析、swap禁用
所有主机:
[root@k8s-master ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100 k8s-master
172.25.254.10 k8s-node1
172.25.254.20 k8s-node2
172.25.254.111 reg.leoma.org
[root@k8s-master ~]# scp /etc/hosts root@172.25.254.10:/etc/host
[root@k8s-master ~]# scp /etc/hosts root@172.25.254.20:/etc/host
yum list httpd #测试yum源
systemctl mask dev-nvme0n1p3.swap
swapoff -a
[root@k8s-master ~]# vim /etc/fstab
#/dev/mapper/rhel-swap none swap defaults 0 0
systemctl status dev-nvme0n1p3.swap
K8s 集群搭建要禁用 swap 是因为开启 swap 可能会导致节点调度不准确和性能不稳定,影响容器的资源分配和调度决策。
3、安装docker
所有主机:
[root@k8s-master ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
yum install makecache
[root@k8s-master ~]# dnf install docker-ce -y
#还可以采用rpm包安装方式
4、复制harbor仓库中的证书并启动docker
mkdir /etc/docker/certs.d/reg.leoma.org/ -p
[root@reg ~]# scp /data/certs/leoma.org.crt root@172.25.254.100:/etc/docker/certs.d/reg.leoma.org/ca.crt
vim /etc/docker/daemon.json
{
"registry-mirrors" : ["https://reg.leoma.org"]
}
systemctl daemon-reload
systemctl enable --now docker
docker login reg.leoma.org
5、设定docker的资源管理模式为systemd
#企业9中默认为systemd,企业7需要以下配置
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
docker info
#“Cgroup Driver: systemd” 表示在使用容器技术(如 Docker)时,采用的是 Systemd 作为控制组(cgroup)的驱动。
6、安装docker插件及其依赖性
在 Kubernetes 集群中安装 Docker 插件及依赖性是为了确保在 Kubernetes 1.24 及更高版本移除 dockershim 后仍能使用 Docker 作为容器运行时。
所有节点安装:
dnf install cri-dockerd-0.3.14-3.el8.x86_64.rpm -y
dnf install libcgroup-0.41-19.el8.x86_64.rpm -y
systemctl enable --now cri-docker
7、安装K8S部署工具
控制节点及两个工作节点:
#部署软件仓库,添加K8S源
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0
#安装软件
dnf install makecache
[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y
一、kubelet kubelet是在每个 Kubernetes 节点(包括主节点和工作节点)上运行的主要代理。
负责管理和维护所在节点上的 Pod 和容器: 确保容器按照指定的资源请求和限制运行。 监控容器的健康状态,在容器出现故障时进行重启或报告给控制平面。
与 Kubernetes 控制平面通信: 接收来自控制平面的指令,如创建、删除或更新 Pod。 向控制平面报告节点的状态信息,包括资源使用情况、容器状态等。
二、kubeadm kubeadm是一个用于快速部署 Kubernetes 集群的工具。
初始化集群: 可以使用 kubeadm init 命令轻松地初始化一个新的 Kubernetes 控制平面节点,包括设置必要的证书、配置网络插件等。
加入节点: 对于工作节点,可以使用 kubeadm join 命令将其加入到已有的 Kubernetes 集群中。
升级集群: kubeadm还可以用于升级 Kubernetes 集群到新版本,简化了升级过程中的复杂操作。
三、kubectl kubectl是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。
管理资源对象: 可以使用 kubectl 命令创建、删除、更新和查看各种 Kubernetes 资源对象,如 Pod、Deployment、Service 等。
监控和调试: 查看集群的状态、节点信息、容器日志等,以便进行故障排除和监控。 可以执行一些调试操作,如进入容器内部进行检查。
扩展和定制: 通过编写自定义的 YAML 配置文件,可以使用 kubectl 来部署复杂的应用架构和进行集群的定制化配置。
8、设置kubectl命令补齐功能
控制主机:
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc #kubectl命令提供 bash 自动补全功能
[root@k8s-master ~]# source ~/.bashrc
9、在master节点拉取镜像
#拉取k8s集群所需要的镜像
[root@k8s-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
#指定容器运行时接口(Container Runtime Interface,CRI)的套接字地址为 “unix:///var/run/cri-dockerd.sock”。这告诉kubeadm使用特定的 CRI 实现来拉取和管理容器镜像,以便与 Kubernetes 协同工作。
#上传镜像到harbor仓库
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk -F "/" '{system("docker tag "$0" reg.leoma.org/k8s/"$3)}'
[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'
10、集群初始化
指定根容器,控制节点及工作节点
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
#指定网络插件名称及基础容器镜像
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.leoma.org/k8s/pause:3.9
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.10:/lib/systemd/system/cri-docker.service
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.20:/lib/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl restart cri-docker
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.leoma.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@k8s-master ~]# source ~/.bash_profile
#指定集群配置文件变量
11、安装flannel网络插件
#编辑kube-flannel.yml 修改镜像下载位置
[root@k8s-master ~]# vim kube-flannel.yml
#需要修改以下几行
[root@k8s-master ~]# grep -n image kube-flannel.yml
146: image: flannel/flannel:v0.25.5
173: image: flannel/flannel-cni-plugin:v1.5.1-flannel1
184: image: flannel/flannel:v0.25.5
[root@k8s-master ~]# docker load -i flannel-0.25.5.tag.gz #导入镜像包并加载本地镜像库
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 reg.leoma.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker push reg.leoma.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.leoma.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master ~]# docker push reg.leoma.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
#上传至harbor仓库方便后续拉取
#安装flannel网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# kubeadm token create --print-join-command #可重新生成token
kubeadm join 172.25.254.100:6443 --token asr9qc.yvqejrc68qa5dfeg \--discovery-token-ca-cert-hash sha256:b7203595313e91c854e88c4cee5e3e8413cb9aa894cdaee508fcde251d649d98 --cri-socket=unix:///var/run/cri-dockerd.sock
#集群初始化生成的token
12、k8s集群环境检测
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 112m v1.30.4
k8s-node1 Ready <none> 110m v1.30.0
k8s-node2 Ready <none> 110m v1.30.0
[root@k8s-master ~]# kubectl -n kube-flannel get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-4vt5l 1/1 Running 0 57m 172.25.254.100 k8s-master <none> <none>
kube-flannel-ds-tg25x 1/1 Running 0 57m 172.25.254.10 k8s-node1 <none> <none>
kube-flannel-ds-vphr6 1/1 Running 0 57m 172.25.254.20 k8s-node2 <none>
[root@k8s-master ~]# kubectl run tset --image nginx
pod/tset created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tset 1/1 Running 0 16s
从上述命令输出可以看出,当前有一个名为 “k8s-master” 的主节点处于就绪状态且承担控制平面角色,还有 “k8s-node1” 和 “k8s-node2” 两个工作节点也都处于就绪状态。在 “kube-flannel” 命名空间下有三个 “kube-flannel-ds” 类型的 Pod 分别在三个节点上正常运行。随后通过命令创建了一个名为 “tset” 的 Pod,该 Pod 使用 Nginx 镜像且状态为运行中。这表明 Kubernetes 集群运行正常,能够成功调度和运行容器化应用。