目录

一、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服务时:

  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产生访问的代理

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.org172.25.254.254harbor仓库
k8s-master.mlh.org172.25.254.100master,k8s集群控制节点
k8s-node1.mlh.org172.25.254.10worker,k8s集群工作节点
k8s-node2.mlh.org172.25.254.20worker,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 集群运行正常,能够成功调度和运行容器化应用。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐