Kubernetes集群——基础篇(基础知识与搭建步骤一遍过!!!)

目录

一.Kubernetes基础概念

1.1简单介绍

1.什么是Kubernetes?

2.Docker和Kubernetes的区别

1.2Kubernetes组件介绍

1.k8s架构介绍

2.集群API入口------Apiserver

3.数据存储中心------etcd

4.调度器------Scheduler

[5.管理者------Controller Manager](#5.管理者——Controller Manager)

6.节点守护进程------Kubelet

7.网络代理------Kube-Proxy

[8.容器运行时------Container Runtime](#8.容器运行时——Container Runtime)

9.DNS解析------CoreDNS

10.分配IP------Calico

二.部署K8s集群的控制节点

2.1准备工作

2.2关闭交换分区

2.3添加yum软件源软件源

2.3.1添加epel9软件源

2.3.2添加k8s集群源,版本为1.35

2.3.3刷新软件源

2.4开启网络转发

出现问题

2.5修改系统限制

2.6升级系统内核(可选)

2.7安装IPVS依赖工具

2.9配置Containerd模块

2.8安装k8s软件工具

2.9拉取集群所需的镜像文件

2.10安装Containerd软件

2.11配置仓库证书

2.12配置Crictl连接Containerd

2.13完成集群初始化

2.13.1完成k8s集群控制节点的初始化

2.13.2配置admin用户

2.13.3添加kubectl命令自动补齐功能

2.14安装Calico网络插件

2.14.1下载镜像文件

2.14.2启动Calico网络插件

2.15查看节点是否就绪

三.部署K8s集群工作节点

3.1工作节点加入k8s集群

3.2为工作节点添加标签

四.部署K8S集群的客户端

4.1客户端安装k8s软件工具

4.2添加admin.config用户

4.3开启服务


一.Kubernetes基础概念

1.1简单介绍

1.什么是Kubernetes?

kubernetes,也称k8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。它将与运行应用程序的容器组合成逻辑单元,以便管理和服务发现。

容器是实现应用运行的好方式,你需要管理容器的服务运行,并确保该应用服务不会下线。但是当容器运行时,也有可能会出现故障。这时,我们需要启动另一台容器。这个步骤可不可以交给一个系统去完成,让这个系统去监测这个容器的状态,并自动修复它。这就是k8s的功能。

k8s提供给我们一个可弹性运行的分布式框架,满足你的扩展要求、故障应用转移和自动修复、提供给你全新的应用部署模式。

2.Docker和Kubernetes的区别

Docker,类似"集装箱的制造工具"。它负责打包应用为标准的容器,里面封装着应用程序和运行环境,是一个容器运行时(Container Runtime),主要负责单个容器的创建、运行和管理。核心功能是:构建镜像、创建并启动容器以及本地容器的生命周期管理等。

Kubernetes,类似"一个大的物流系统",它管理着各个集装箱的传输,调度和存储。它是一个容器编排平台,负责管理跨主机的多个容器集群。核心功能是:自动化部署,扩缩容、负载均衡和故障转移等等。

1.2Kubernetes组件介绍

1.k8s架构介绍

Kubernetes的架构是高度可扩展和可定制的。它由Master节点和Worker节点组成。Master节点负责管理集群状态和调度任务,而****Worker节点负责运行Pod 和容器。基本架构如下图所示:

Kubernetes 支持多种容器运行时,如Docker、CRI-O、containerd 和rkt 等。容器运行时,负责管理容器的生命周期,如创建、运行和删除等等。

Kubernetes还支持多种存储后端,如本地存储、NFS、GlusterFS、Ceph 和AWS EBS 等。

Kubernetes 还支持插件机制,可以自定义扩展集群的功能,例如网络插件、认证插件和日志插件等。

2.集群API入口------Apiserver

概述 :kube-apiserver的核心功能是提供kubernets的各种增、删、改、查以及watch等HTTP REST接口 ,是整个k8s集群中各个功能模块的数据交互和通信的中枢,是集群的数据总线和数据交换中心。除此之外,它还管理着集群的API入口,数据需要通过API接口进出集群,管理着整个集群的资源配额,提供了完备的集群安全机制。

功能介绍:

1.REST接口:Kube-apiserver提供了集群的RESTful接口,允许集群内的组件和用户可以通过HTTP协议进行通信和数据交换。

2.数据总线和交换中心: 所有数据都需要通过kube-apiserver进行数据交换,同时,它本身支持代理读写数据。

3.安全机制 :apiserver实施了认证、授权和准入控制等安全策略

4.与etcd交互:负责读取etcd中存储的集群信息,并代为转发。 整个集群中只有apiserver能够直接与etcd交互,其他组件通过apiserver与etcd进行交互。

总的来说:APIserver是整个集群的统一的API入口和数据交互中心。

3.数据存储中心------etcd

概述 :etcd是一个分布式键值对存储系统 ,整个集群中的数据存储中心,主要负责存储集群中的所有状态信息和元数据信息。它是k8s控制平面的核心组件之一,k8s中的所有配置信息,期望状态和 服务发现等等数据都存储在它内部。

功能介绍:

1.k8s的核心存储中心,集群中的所有状态信息都存储在etc中

2.提供高可用、强一致性的分布式存储, 确保信息在多个节点上同步**。**

3.唯一支持与apiserver进行数据交互, 实现集群的更新、扩缩容和自动部署**。**

总的来说 :etcd是整个kubernetes集群的数据存储中心,集群中的所有状态信息都存储在etcd中。通过高可用、强一致性的分布式数据库,提供可靠的数据存储,确保集群中各个节点的信息同步。

4.调度器------Scheduler

概述 :Scheduler是k8s集群中重要的调度中心,它负责将新创建的pod、集群中还未指定运行节点的pod安排到合适的k8s节点上运行。除此之外,通过监听apiserver,查询是否存在没有分配node的pod,将这些pod按照分配策略(内存、CPU资源等)分配给合适的节点上运行。

功能介绍:

1.监听未分配的pod节点 :Scheduler会监听apiserver接口,查询是否存在没有地方工作的pod节点,为这些pod分配工作地点(node)。

2.预选节点 :通过一系列过滤筛选规则,选择出能够正常工作的节点作为预选节点,供pod工作。如:满足pod资源要求,符合亲和性条件

3.优选节点: 通过一系列比较规则,自动选择出最适合该pod执行的工作节点。如:更多的CPU、更多的内存或者节点、pod亲和性更好的节点

4.绑定pod到node: scheduler将节点绑定到固定的node上,apiserver会不断更新pod状态。

5.管理者------Controller Manager

Controller的作用 :在k8s集群中,每个Controller通过监听apiserver接口,实时查询集群中特定资源的状态变化,进而监控整个集群的状态 。当集群中的某一个节点与etcd中存储的期望状态不同时,Controller会首先尝试将pod修复到与期望状态,这里的期望状态主要是pod数量和版本是否符合要求,确保pod在期望状态下正常工作。

概述 :Controller Manager就是用来管理这些操作系统------Controller 。它是整个集群的控制中心,也是k8s集群的自动化中心,负责运行控制器(Controller)进程。

控制器分类:逻辑上讲,这里的每一个控制器都是一个单一的进程。但为了较低集群的复杂性,一般会将控制器放到同一个可执行文件中运行,主要包含以下几类:

1.节点控制器 (Node Controller):当节点出现故障时,进行通信和响应。

2.任务控制器 (Job Controller):监测一次性代表对象Job任务,创建pods对象运行Job任务直到任务执行完毕。

3.端点分片控制器 (EndpointSlice controller):填充端点分片配对象,充当Server与pod间的链接。Server通过 EndpointSlice 可以同时与多个pod建立通信,是实现负载均衡的基础。

4.服务账号控制器 (ServerAccount Controller):为新的命名空间创建默认服务账号

6.节点守护进程------Kubelet

概述 :它是k8s集群的守护进程。它会在每一个node节点上运行,确保所有容器(controller)都在pod上正常运行 。kubelete通过各类机制提供的一组pod期望(pod期望存储在etcd上),与当前pod状态相比较,确保这些pod的状态一致,这里的pod期望状态是pod内部的container容器的期望状态,如正常运行、停止运行等等。

Kubelet只会管理由Kubernetes创建的容器,不会管理其他的容器。 在每个node上都会启动一个Kubelet服务进程,负责处理主节点上下发的任务,管理pod和pod内部的容器。每个Kubelet进程都会在apiserver上注册自己的信息,并定期汇报自己的资源使用情况。

功能介绍:

1.容器的生命周期管理: 根据k8s集群的指令**,启动、运行和停止容器。**

2.健康检查:定期进行容器的健康检查, 确保服务的正常运行**。**

3.状态同步 :与K8s集群的控制平面通信,确保pod状态与期望状态一致。

**4.资源管理:**监测并汇报自己节点的资源使用情况,如内存、CPU等等

**5.存储卷管理:**挂载和卸载Pod所需的持久化数据卷

6.网络配置:与网络插件(CNI)交互,为pod分发网络资源。同一个pod内部共享网络资源,即:同一个网络命名空间,pod内部的所有容器共享一个IP

7.网络代理------Kube-Proxy

概述 :Kube-proxy字如其名,就是K8S集群中每个节点的网络代理,主要用来维护节点上的一些网络规则,这些网络规则允许网络从外部或者内部会话与pod进行通信。他是实现集群中Service重要的一部分。

8.容器运行时------Container Runtime

概述 :负责真正将容器从底层启动的软件,支持多种容器运行环境,如:containerd、CRI-O以及Kubernetes CRI(容器运行环境接口)等等

9.DNS解析------CoreDNS

概述 :一种灵活性、可扩展的DNS服务器,主要负责集群内部的Pod提供DNS服务 。用于K8S集群内部的服务(Service)解析,让Pod把服务Service名称解析成Service的IP,然后通过Service的IP地址连接到对应的服务上。同时扮演着服务发现和DNS解析的重要角色,使得集群中的Pod和Service可以通过DNS通信,而无需手动管理IP地址。

工作方式:

1.服务发现 :服务是通过DNS解析名称访问的。当一个Pod需要访问服务时,会向CoreDNS发起一个DNS查询。

2.查询处理:CoreDNS收到查询请求时,会根据DNS服务名称和命名空间,通过Kubernetes API 查询相应的Service和EndPointSlices对象。

3.响应构造: 一旦找到匹配的Service和Pod**,CoreDNS会构造一个DNS响应,返回请求者,Service的Cluster IP和Pod的IP地址。**

4.负载均衡: 如果存在多个EndPointSlices对象**,可以把流量均匀分配给多个Pod**

10.分配IP------Calico

概述 :负责为每个 Pod 分配一个唯一的 IP 地址,并确保 Pod 能够跨节点通信。每个 Kubernetes 节点上都会运行一个 calico-node 容器,该容器包含 Calico 的核心代理(Felix)和 BGP 客户端,负责管理和维护路由信息。

Calico 将每个节点的路由信息分发到集群中的其他节点,从而实现不同节点上的 Pod 之间的直接通信。Calico 是一个基于纯三层网络模型的网络和网络安全解决方案,使用容器网络接口(CNI)插件来为 Kubernetes 集群中的 Pod 提供网络连接。

二.部署K8s集群的控制节点

2.1准备工作

说明 :需要准备四台虚拟主机,版本均为Rock Linux 9。一台虚拟机用来充当docker仓库与k8s客户端,一台虚拟机用来充当k8s的control plane;剩余两台用来充当k8s的工作节点。

注意:

具体的主机名解析如下:

|---------------|------------------------|-------------------|
| IP地址 | 主机名解析 | 作用 |
| 192.168.7.161 | docker1 reg.westos.org | docker仓库、k8s集群客户端 |
| 192.168.7.163 | k8s1 | k8s集群的控制节点 |
| 192.168.7.164 | k8s2 | k8s集群的工作节点 |
| 192.168.7.165 | k8s3 | k8s集群的工作节点 |

2.2关闭交换分区

说明:k8s集群需要我们关闭交换分区,因为它会计算我们的节点内存,观察是否还存有多余资源。当开启交换分区后,k8s集群会误认为还存在多余内存,超出的物理内存会被放到磁盘IO上,降低节点性能。

临时关闭交换分区:

bash 复制代码
swapoff -a

永久关闭交换分区:注释掉,挂载交换分区动作

bash 复制代码
sed -i '/swap/s/^/#/' /etc/fstab

2.3添加yum软件源软件源

2.3.1添加epel9软件源

bash 复制代码
yum install -y epel-release

2.3.2添加k8s集群源,版本为1.35

bash 复制代码
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
enabled=1
gpgcheck=0
EOF

2.3.3刷新软件源

bash 复制代码
yum makecache

2.4开启网络转发

1.设置网络转发

bash 复制代码
cat <<EOF > /etc/sysctl.d/k8s.conf 
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

参数介绍:

net.ipv4 .ip_forward = 1:开启IPv4转发,允许网络将数据包从一个接口转发到另一个接口

net.bridge.bridge-nf-call-iptables = 1:启用网桥,调用iptables对数据包过滤

2.使设置生效,刷新系统内核

bash 复制代码
sysctl --system

出现问题

说明:初始化前没有打开网络转发

2.5修改系统限制

说明:容器和k8s会需要大量的文件句柄,需要提高资源限制

临时生效:

bash 复制代码
ulimit -n 65535

作用:把当前 shell 会话中进程能打开的最大文件描述符数量(nofile)临时设置为 65535。

永久生效:将限制写入到系统文件中

bash 复制代码
cat <<EOF >> /etc/security/limits.conf
* soft nofile  65536
* hard nofile  65536
* soft nproc  65536
* hard nproc  65536
* soft memlock unlimited
* hard memlock unlimited
EOF

参数介绍:

soft nofile 65536: # nofile 表示每个进程可以打开的最大文件描述符数(即最大可打开的文件数)。soft 表示这是软限制,用户可以在不超过硬限制的情况下通过 ulimit命令调整此值。适用于需要大量文件句柄的应用,如大型数据库、Web 服务器等。

hard nofile 65535: # hard 表示这是硬限制,用户无法通过 ulimit 命令将其值调得超过此限制。适用于限制系统上所有进程的资源使用,以防止过度消耗系统资源。

soft nproc 65535: # nproc 表示每个用户可创建的最大进程数。soft 限制可以通过 ulimit 命令在运行时调整,但不能超过硬限制。适用于需要大量进程的应用或服务,如批处理作业、高并发应用等。

hard nproc 65535: # hard 限制是不能被用户通过 ulimit 命令调整的最大进程数限制。防止单个用户启动过多的进程,影响系统稳定性。

memlock 限制用于控制进程可**"锁定在物理内存中"** 的内存量(避免被交换到 swap分区)。K8s 集群中,以下场景需要解除该限制:

  1. 必须添加的场景:Etcd 节点或使用 Etcd 的组件

Etcd 是 K8s 的核心数据库,对性能和稳定性要求极高,其官方文档明确建议:

解除内存锁定限制,避免 Etcd 进程内存被 swap 到磁盘(swap 会导致 Etcd 响应延迟、数据一致性风险)。

若 Etcd 运行在独立节点或容器中,必须配置 memlock unlimited,否则可能出现频繁 GC、性能骤降甚至集群崩溃。

  1. 建议添加的场景:高性能容器或低延迟需求

若集群中运行以下类型的工作负载,建议解除 memlock 限制:

数据库(如 MySQL、PostgreSQL)、缓存服务(如 Redis)等对内存访问延迟敏感的应用。

机器学习、实时计算等需要高频访问大内存数据的容器。

依赖 DPDK、RDMA 等高性能网络技术的应用(这类技术通常要求内存锁定)

2.6升级系统内核(可选)

说明:k8s集群对内核由版本要求,当前的rocky linux 内核版本符合要求,但会存在警告。

1.下载新内核的软件包

bash 复制代码
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-5 .
19.9-1.el7 .elrepo.x86_64.rpm

wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-de 
vel-5.19.9-1.el7.elrepo.x86_64.rpm

2.安装内核

bash 复制代码
yum localinstall -y kernel-ml*

3.设置默认内核项

说明:系统本身存在一个内核,需要将新内核设置成默认项,防止系统重启后使用原先的内核版本

bash 复制代码
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg

作用:将新内核(第0项)设置成默认项,并重新生成引导文件

4.给默认内核追加 user_namespace.enable=1 和 net.ifnames=0 两个启动参数。

bash 复制代码
grubby --args="user_namespace.enable=1 net.ifnames=0" \
 --update-kernel="$(grubby --default-kernel)"

参数介绍:

user_namespace.enable=1:开启用户命名空间

net.ifnames=0:关闭网卡的可预测命名规则

5.重启系统,使新内核生效

bash 复制代码
reboot

6.查看内核信息

bash 复制代码
grubby --default-kernel

2.7安装IPVS依赖工具

说明 :为 kube-proxy 启用 IPVS 模式提供必要的支持,以提升集群在大规模 Service 场景下的负载均衡性能。

1.安装IPVS软件包

bash 复制代码
yum install -y ipset ipvsadm

2.修改ipvs.conf配置文件

bash 复制代码
cat <<EOF > /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh 
nf_conntrack
EOF

参数介绍:

ip_vs: 通过将客户端请求转发到多台后端服务器上来实现负载均衡。ip_vs 是负载均衡模块的核心部分。

ip_vs_lc: lc 是 IPVS 的一个负载均衡算法,即 Least Connection(最少连接数)。它将流量转发到当前连接数最少的后端服务器。

ip_vs_wlc: wlc 是 IPVS 的一种负载均衡算法,即 Weighted Least Connection(加权最少连接数)。它基于每个后端服务器的连接数和权重来决定流量的分配。

ip_vs_rr: rr 是 IPVS 的一种负载均衡算法,即 Round Robin(轮询)。该算法按照轮询的方式将请求分配给每个后端服务器。

ip_vs_wrr: wrr 是 IPVS 的一种负载均衡算法,即 Weighted Round Robin(加权轮询)。它在轮询的基础上增加了权重,允许按权重分配流量。

ip_vs_sh: sh 是 IPVS 的一种负载均衡算法,即 Source Hashing(源地址哈希)。该算法通过计算客户端的源地址的哈希值来决定请求的后端服务器。适用于需要根据客户端来源地址进行流量分配的场景。

nf_conntrack: nf_conntrack 是 Linux 的一个网络连接跟踪模块,用于跟踪所有活动的网络连接的状态(如 NAT、状态防火墙等)。在防火墙、路由器以及需要监控连接状态的网络环境中使用。

3.加载配置文件中的模块,并使之生效

bash 复制代码
systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack

2.9配置Containerd模块

作用 :为 Kubernetes 提供符合 CRI(容器运行时接口)标准的容器运行时环境,使其能正常创建和管理 Pod 。如果不进行配置,kubelet 将无法通过 Containerd 启动任何容器,集群也就无法工作

1.加载Containerd依赖模块

bash 复制代码
cat <<EOF > /etc/modules-load.d/containerd.conf
overlay 
br_netfilter 
nf_conntrack 
ip_tables 
EOF

2.加载配置文件中定义的模块

bash 复制代码
systemctl restart systemd-modules-load.service
lsmod | grep -e overlay -e br_netfilter -e nf_conntrack -e ip_tables    #验证模块是否加载

2.8安装k8s软件工具

bash 复制代码
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet #启动服务

工具介绍:

kubeadm :集群安装工具,负责初始化集群 和添加节点。

kubelet :节点代理,运行在每个节点上的"监工",负责管理本节点的容器。

kubectl:集群的客户端,用户直接管理集群的工具

2.9拉取集群所需的镜像文件

1.查看集群所需的镜像文件

bash 复制代码
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.35.8

2.拉取所需的所有镜像文件

**说明:**这里提供两种方式:一种是直接一个个拉取;另一种是将所拉取的镜像放入一个文件当中,自动拉取文件中的所有镜像

注意:该操作要在Docker端完成

bash 复制代码
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.35.8    
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.35.8    
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.35.8
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.35.8
docker pull registry.aliyuncs.com/google_containers/coredns:v1.14.2
docker pull registry.aliyuncs.com/google_containers/pause:3.10.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.6.8-0

3.修改镜像名称

**说明:**将镜像名称,修改成私有仓库里的项目

注意:该操作要在Docker端完成

bash 复制代码
docker images | grep registry.aliyuncs.com/google_containers/ | awk '{print $1":"$2}' |awk -F/ '{system("docker tag "$0" reg.westos.org/k8s/"$3"")}'

4.将镜像上传到私有仓库中

说明:使用离线仓库,安装k8s集群

注意:该操作要在Docker端完成

4.1进入harbor,创建 k8s项目

4.2将镜像文件上传到仓库中

bash 复制代码
docker images | grep k8s | awk -F/ '{system("docker push "$1":"$2"")}'

2.10安装Containerd软件

1.安装containerd软件

bash 复制代码
yum install -y containerd cri-tools

2.修改配置文件

2.1生成默认配置文件

说明:把 containerd 的默认配置输出并保存到 /etc/containerd/config.toml 文件里,从而生成一份可编辑的配置文件。

bash 复制代码
containerd config default > /etc/containerd/config.toml

2.2开启Cgroup

bash 复制代码
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep SystemdCgroup

2.3修改容器的镜像仓库位置

bash 复制代码
sed -i "s|sandbox = 'registry.k8s.io/pause:3.10.1'|sandbox = 'reg.westos.org/k8s/pause:3.10.1'|" /etc/containerd/config
cat /etc/containerd/config.toml | grep pause:

3.启动服务

bash 复制代码
systemctl enable --now containerd

2.11配置仓库证书

说明:将docker仓库的证书拷贝到k8s1上

1.复制证书到本地仓库

bash 复制代码
mkdir -p /etc/containerd/certs.d/reg.westos.org
scp reg.westos.org:/data/certs/westos.org.crt /etc/containerd/certs.d/reg.westos.org/ca.crt

2.配置证书位置

bash 复制代码
vim /etc/containerd/config.toml

找出证书配置位置,填入你的证书位置:

bash 复制代码
/etc/containerd/certs.d

3.重启Contained服务

bash 复制代码
systemctl restart containerd

2.12配置Crictl连接Containerd

说明 :告诉 crictl 命令去哪里找容器运行时(containerd),以及怎么跟它通信

1.完成文件配置

bash 复制代码
cat <<EOF > /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock 
EOF

2.测试

说明:拉取仓库中的pause镜像

bash 复制代码
crictl pull reg.westos.org/k8s/pause:3.10.1
crictl images

2.13完成集群初始化

2.13.1完成k8s集群控制节点的初始化

说明:指定pod的网络段,镜像仓库项目,k8s集群版本

bash 复制代码
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s --kubernetes-version v1.35.8

出现下面的情况说明初始化成功:

注意 :后面,我们需要这个命令来将工作结点加入到集群中,建议先记下命令,或者新开个终端

bash 复制代码
kubeadm join 192.168.7.166:6443 --token o3lye9.2d46rsbutqkrpx8h \
        --discovery-token-ca-cert-hash sha256:ff0f2fc4393599120ef08d4ff031d074a2f2c53d6fb7cebb0deea3f90625c106

2.13.2配置admin用户

说明:k8s集群中的任意一个节点,都必须要有一个用户(.config文件),否则无法访问k8s集群。

admin用户,默认会在k8s集群初始化后自动生成,并放在 /etc/kubernetes/admin.conf中。

临时添加环境变量:

bash 复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf

永久添加到环境变量中:

bash 复制代码
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

查看集群节点状态:

bash 复制代码
kubectl get node

2.13.3添加kubectl命令自动补齐功能

1.安装bash命令自动补全软件包

bash 复制代码
yum install -y bash-completion

2.将kubectl 自动补全命令,加入到环境变量文件中

bash 复制代码
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

3.测试

说明:输入kubectl,按两下 Tab 键,会自动补充kubectl的相关命令

2.14安装Calico网络插件

说明 :前面讲过,Calico核心功能是分配IP地址。如果没有Calico插件,各个node之间无法进行通信,同时node状态也会保持在NoReady状态。

2.14.1下载镜像文件

注意:该操作要在Docker端完成

1.下载镜像软件

bash 复制代码
docker pull quay.io/calico/cni:v3.31.0
docker pull quay.io/calico/node:v3.31.0
docker pull quay.io/calico/kube-controllers:v3.31.0

2.修改镜像名称

bash 复制代码
docker images |grep calico | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/calico/"$3"")}'

筛选出符合的镜像名称:我这里是修改后的结果

3.创建calico项目

说明:我这里的项目已经存在了,如果名字有冲突,记得换个名字

4.上传镜像

bash 复制代码
docker images |grep 'reg.westos.org/calico'|awk '{system("docker push "$1":"$2"")}'

筛选结果如下:

2.14.2启动Calico网络插件

1.下载Calico网络清单

bash 复制代码
mkdir yml && cd yml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.0/manifests/calico.yaml

说明:在calico.yaml文件中,可以看到所需的镜像文件,可以根据这个下载所需的镜像文件

2.修改镜像文件的地址

bash 复制代码
vim calico.yaml

新地址如下:

bash 复制代码
reg.westos.org/calico/cni:v3.31.0
reg.westos.org/calico/cni:v3.31.0
reg.westos.org/calico/node:v3.31.0

3.部署网络插件

bash 复制代码
kubectl apply -f calico.yaml

2.15查看节点是否就绪

说明:出现Ready,说明状态就绪。

bash 复制代码
kubectl get node

三.部署K8s集群工作节点

说明 :K8s工作节点和哦控制节点有很多相同之处,首先按照第二大章的内容,再K8S工作节点的虚拟机上完成 2.1~2.8节和2.10~2.12阶段的内容,完成K8s集群的相关配置。

3.1工作节点加入k8s集群

说明:这里输入的是你初始化后给出的命令

bash 复制代码
kubeadm join 192.168.7.166:6443 --token o3lye9.2d46rsbutqkrpx8h \
        --discovery-token-ca-cert-hash sha256:ff0f2fc4393599120ef08d4ff031d074a2f2c53d6fb7cebb0deea3f90625c106

注意:默认token过期时间是24h,如果token过期需要重新生成

补充:重新生成新的token,需要在控制节点生成token

bash 复制代码
kubeadm token create --print-join-command

3.2为工作节点添加标签

bash 复制代码
kubectl label nodes k8s2 node-role.kubernetes.io/worker=

四.部署K8S集群的客户端

4.1客户端安装k8s软件工具

bash 复制代码
yum install -y kubectl kubelet

4.2添加admin.config用户

bash 复制代码
scp /etc/kubernetes/admin.conf docker1:/etc/kubernetes/admin.conf

4.3开启服务

bash 复制代码
systemctl enable --now kubelet
相关推荐
SL_staff1 小时前
合规性折旧:当知识资产因主权缺位在审计中‘功能性清零’
java·设计模式·开源
Dreams_l1 小时前
基于SpringBoot实现的抽奖系统(一)
java·spring boot·后端
落魄实习生1 小时前
Agent Scope Java 2.x 系列【1】核心架构
java·开发语言·架构
鬼手点金2 小时前
Claude Code示范案例-常用快捷命令
java·服务器·前端·计算机视觉·前向传播
温暖小土2 小时前
Spring AI 接入通义千问向量模型
java·人工智能·spring
Sarvartha2 小时前
数组基础知识
java·开发语言
泡海椒2 小时前
金融报表开发:jquick-pdf K 线图 PDF 可视化解决方案
java·开发语言·金融·pdf
余槐i2 小时前
rollbackFor 不设置,Checked 异常不回滚:Spring 默认规则与两行修复的取舍
java·spring boot·后端·spring·事务管理
❀͜͡傀儡师2 小时前
Spring AI 集成 TypeSafe:用判断模型处理工单分流与链路决策
java·人工智能·spring