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

Kubernetes 部署

Kubernetes

Kubernetes概述

基本概念
  • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
  • K8S用于容器化应用程序的部署,扩展和管理。
  • K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
  • Kubernetes目标是让部署容器化应用简单高效。

官方网站:http://www.kubernetes.io

特性
  • 自我修复。在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
  • 弹性伸缩。使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
  • 自动部署和回滚。K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
  • 服务发现和负载均衡。K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
  • 机密和配置管理。管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
  • 存储编排。挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
  • 批处理。提供一次性任务,定时任务;满足批量数据处理和分析的场景。
Kubernetes的集群架构与组件

在这里插入图片描述

Master组件
  • kube-apiserver,Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给 Etcd存储。
  • kube-controller-manager,处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager 就是负责管理这些控制器的。
  • kube-scheduler,根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在 同一个节点上,也可以部署在不同的节点上。
  • etcd分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
Node组件
  • kubelet,kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创 建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每 个Pod转换成一组容器。
  • kube-proxy在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
  • pod,它是Kubernetes 中可部署的最小、最简单的计算单元。下面是它的作用:
    • 容器组: 一个 Pod 包含一个或多个共享资源的容器(例如,网络命名空间、IP 地址、端口空间、存储卷)。这些容器总是被共同调度在同一个节点上。
    • 原子单位: Pod 是 Kubernetes 扩缩容、调度和管理的基本单位。
    • ephemeral: Pod 是短暂的,设计为可以随时被销毁和重建。它们通常由更高级别的抽象(如 Deployment)来管理。
  • Container,它是应用程序的实际运行实例。下面是他的作用:
    • 包含应用程序的代码、运行时环境、系统工具、库和设置。它是标准化、轻量级、可移植的软件打包和运行方式。Pod 为这些容器提供了一个共享的运行环境。
总结与交互流程

以一个简单的 kubectl create -f nginx.yaml 命令为例,说明组件间如何协作:

  1. 请求入口kubectl 将创建 Pod 的请求发送给 API Server
  2. 持久化状态API Server 验证请求后,将 Pod 数据写入 etcd
  3. 决策制定Scheduler 持续监听 API Server,发现这个待调度的 Pod。它根据调度算法选择一个最优节点,并通过 API Server 将这个绑定决定写回 etcd。
  4. 驱动执行: 目标节点上的 Kubelet 也持续监听 API Server,发现有一个 Pod 被调度到它所在的节点。
  5. 实际部署Kubelet 指示本地的 Container Runtime 拉取镜像并启动容器。
  6. 网络配置Kube-Proxy 监听到此 Pod 的变化,如果该 Pod 属于某个 Service,它会更新本节点的网络规则,以确保服务流量可以路由到这个新 Pod。
  7. 状态监控Kubelet 持续向 API Server 报告 Pod 的状态。
  8. 确保状态: 与此同时,Controller Manager 中的各种控制器(如副本控制器)也在持续运行,确保集群的当前状态始终与用户在 etcd 中定义的期望状态保持一致。

安装与部署(基于docker)

基于docker安装Kubernetes1.28.2-0版本

实验拓扑

在这里插入图片描述

1.主机配置
CPU内存硬盘ip主机名软件
2核4G200G192.168.108.10masterdocker
4核6G400G192.168.108.11node1docker
4核6G400G192.168.108.12node2docker
配置主机名

在三台主机中各自设置对应主机名称

# hostnamectl set-hostname master
# hostnamectl set-hostname node1
# hostnamectl set-hostname node2
配置主机名解析

所有节点都配置,并测试ping通

[root@master ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.108.10 master
192.168.108.11 node1
192.168.108.12 node2
安装环境包
yum -y install vim lrzsz unzip wget net-tools tree bash completion conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
类别软件包核心功能
文件操作vim,lrzsz,unzip编辑/上传下载/解压 ZIP
网络管控net-tools,ipvsadm网络配置/IPVS 负载均衡
系统监控sysstat,psmisc性能监控/进程管理
开发编译gcc,make代码编译/自动化构建
安全防护iptables,libseccomp防火墙/容器系统调用限制
关闭防火墙和内核安全机制
[root@master ~]# systemctl disable firewalld --now
[root@master ~]# sed -i 's/enforcing/disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0
关闭swap分区

启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区

[root@master ~]# swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
关闭NetworkManager
[root@master ~]# systemctl stop NetworkManager
[root@master ~]# systemctl disable NetworkManager
调整系统内核参数
[root@master ~]# yum update -y kernel && reboot
[root@master ~]# cat >/etc/sysctl.d/kubernetes.conf<<EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1
EOF

立即生效

[root@master ~]# sysctl --system
调整Linux资源限制(可选)
#设置一个进程可以打开的最大文件句柄数
[root@master ~]# ulimit -SHn 65535
#在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024
[root@master ~]# cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited
EOF
时间同步
yum -y install chrony
systemctl restart chronyd#列出 Chrony 守护进程当前配置和使用的所有时间源(NTP 服务器)及其同步状态信息
chronyc sources -v 
#将硬件时钟的时间同步到系统时钟
hwclock -s
IPVS功能
cat >>/etc/modules-load.d/ipvs.conf<<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF

IPVS内核模块功能说明

  1. IPVS 核心模块
  • ip_vs :IPVS 负载均衡基础模块
  • ip_vs_rr :轮询(Round Robin)调度算法
  • ip_vs_wrr :加权轮询(Weighted RR)调度算法
  • ip_vs_sh :源地址哈希(Source Hashing)调度算法
  1. 网络连接与过滤
  • nf_conntrack_ipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并至 nf_conntrack )
  • ip_tables :iptables 基础框架
  • ipt_REJECT :实现数据包拒绝(REJECT 动作)
  1. IP 集合管理
  • ip_set :IP 地址集合管理

  • xt_set & ipt_set :iptables 与 IP 集合的扩展匹配

  1. 网络隧道与桥接
  • ipip :IP-over-IP 隧道协议
  • overlay :Overlay 网络支持(如 Docker 跨主机网络)
  • soft memlock unlimited
  1. 反向路径过滤
  • ipt_rpfilter :反向路径验证(防 IP 欺骗)

典型应用场景

  • Kubernetes 节点初始化:IPVS 模式 kube-proxy 依赖这些模块
  • 负载均衡服务器:启用 IPVS 调度算法
  • 容器网络配置:Overlay 和桥接模块支持

重启服务

[root@master ~]# systemctl restart systemd-modules-load

查看内核模块

[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.docker-ce环境
前置环境安装
yum install -y yum-utils device-mapper-persistent-data lvm2

说明:

  • yum-utils 提供了 yum-config-manager
  • device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
  • Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理

的块设备驱动提供了一个高度模块化的内核架构。

配置 Docker CE 仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce
yum install -y docker-ce
防火墙设置(已操作)
#增强安全功能临时关闭
setenforce 0
#增强安全功能永久关闭
vim /etc/selinux/config
SELINUX=disabled
#防火墙转发规则清空
iptables -F
#防火墙NAT规则清空
iptables -F
启动docker服务
systemctl enable --now docker
镜像加速
[root@master ~]# tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com","https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn","https://mirror.baidubce.com","https://docker.1panel.live"],
}
修改cgroup方式
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://05vz3np5.mirror.aliyuncs.com",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com",
"https://docker.1panel.live"
], #注意分隔符号
"exec-opts": ["native.cgroupdriver=systemd"] #添加cgroup方式
}
#重新启动服务
systemctl daemon-reload
systemctl restart docker
cri-dockerd安装

作用:cri-dockerd 的主要作用是为 Docker Engine 提供一个符合 Kubernetes CRI(ContainerRuntime Interface)标准的接口,使 Docker 能继续作为 Kubernetes 的容器运行时(Container Runtime),尤其是在 Kubernetes1.24版本后,官方移除对原生 Docker 支持(dockershim)之后。

github项目地址

也可以使用linux的wget直接下载

wget https://github.com/mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm

下载完成后直接安装

rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm

编辑服务配置文件

vim /usr/lib/systemd/system/cri-docker.service
#编辑第10行,中间添加 
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

启动cri-dockerd服务

systemctl daemon-reload
systemctl start cri-docker.service
systemctl enable cri-docker.service

检查文件是否启动

[root@master ~]# ls /run/cri-*
/run/cri-dockerd.sock
kubernetes集群部署
配置 Kubernetes 仓库

国内阿里云镜像源

[root@master ~]# cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
软件安装

查看可安装的版本

[root@master ~]# yum list kubeadm.x86_64 --showduplicates | sort -r
已加载插件:fastestmirror, langpacks
可安装的软件包
* updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
kubeadm.x86_64 1.9.9-0 kubernetes
kubeadm.x86_64 1.9.8-0 kubernetes
kubeadm.x86_64 1.9.7-0 kubernetes
kubeadm.x86_64 1.9.6-0 kubernetes
kubeadm.x86_64 1.9.5-0 kubernetes
kubeadm.x86_64 1.9.4-0 kubernetes
kubeadm.x86_64 1.9.3-0 kubernetes
kubeadm.x86_64 1.9.2-0 kubernetes
kubeadm.x86_64 1.9.11-0 kubernetes
...
kubeadm.x86_64 1.28.2-0 kubernetes
kubeadm.x86_64 1.28.1-0 kubernetes
kubeadm.x86_64 1.28.0-0 kubernetes

安装1.28.2-0版本

[root@master ~]# yum install -y kubeadm-1.28.0-0 kubelet-1.28.0-0 kubectl-1.28.0-0
kubelet配置

强制指定 kubelet 使用 systemd 作为 cgroup 驱动,确保与 Docker 或其他容器运行时保持一致将 kube-proxy 的代理模式设置为 ipvs ,替代默认的 iptables ,提升大规模集群的网络性能

[root@master ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
#因为没有初始化产生对应配置文件,我们先设置开机自启动状态
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable kubelet.service #只是设为开机自启动,并不立即开启
集群初始化

注意:只在master节点做操作

查看可使用镜像

[root@master ~]# kubeadm config images list --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1

镜像下载

[root@master ~]# kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.9-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.10.1

查看已下载的镜像

[root@master ~]# docker images
REPOSITORY TAG IMAGE
ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-apiserver v1.28.0
bb5e0dde9054 22 months ago 126MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.28.0
4be79c38a4ba 22 months ago 122MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.28.0
f6f496300a2a 22 months ago 60.1MB
registry.aliyuncs.com/google_containers/kube-proxy v1.28.0
ea1030da44aa 22 months ago 73.1MB
registry.aliyuncs.com/google_containers/etcd 3.5.9-0
73deb9a3f702 2 years ago 294MB
registry.aliyuncs.com/google_containers/coredns v1.10.1
ead0a4a53df8 2 years ago 53.6MB
registry.aliyuncs.com/google_containers/pause 3.9
e6f181688397 2 years ago 744kB

方式一:创建初始化集群配置文件(推荐)

[root@master ~]# kubeadm config print init-defaults > kubeadm-init.yaml

修改初始化配置文件

[root@master ~]# vim kubeadm-init.yamlapiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.108.10 #12行 master的IP地址
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock #15行 修改docker运行时
imagePullPolicy: IfNotPresent
name: master #17行 修改master节点主机名
taints: #18行 去掉 Null- effect: NoSchedule #19行 添加污点key: node-role.kubernetes.io/control-plane #20行 添加
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0 #34行 k8s版本
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 #38行 增加Pod网段
scheduler: {}
--- #末尾添加 更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
--- #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

初始化完成

[root@master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
...省略
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as
root:
kubeadm join 192.168.100.128:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash
sha256:48b03ed5f255e142387fa4b58f4e6ef422aea8ec101b2221ea302d50e3921d25

方式二:命令初始化(可选)

[root@master ~]# kubeadm init \
--apiserver-advertise-address=192.168.100.128 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--upload-certs | tee kubeadm-init.log

解析如下:

--apiserver-advertise-address 集群通告地址
--image-repository 指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与软件包版本一致
--pod-network-cidr Pod网络的范围,与下面部署的CNI网络组件yaml中保持一致(可以修改)
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--upload-certs 将控制节点的证书上传到kubeadm-certs Secret中,可添加多个控制节点
--cri-socket 指定容器运行时
配置kubectl工具

根据初始化成功后的提示进行配置

Kubectl 是一个用于操作Kubernetes集群的命令行工具。

kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境

变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config

临时生效(退出当前窗口重连环境变量失效)

[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

永久生效(推荐)

在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文

件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。

[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master ~]# source ~/.bash_profile

检查核心组建控制平面的健康状态

[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy ok
scheduler Healthy ok
node工作节点加入集群

node1和node2都要做

注意:添加–cri-socket unix:///var/run/cri-dockerd.sock,否则会报错

[root@master ~]# kubeadm join 192.168.108.10:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:03c6490ecd92390775b17e9a301b39af6be5f7e7c15cab23a7fa1c5bfef8d434 \--cri-socket unix:///var/run/cri-dockerd.sock
----------------------------------------------------------------------------
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system
get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file
"/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file
"/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
网络CNI组建部署

查看集群状态

[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 72m v1.28.0
node1 NotReady <none> 23s v1.28.2
node2 NotReady <none> 8s v1.28.2

此时coredns中一直没有IP地址,主要原因缺少网络组建

[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP
NODE NOMINATED NODE READINESS GATES
coredns-66f779496c-bxpbx 0/1 Pending 0 96m <none>
<none> <none> <none>
coredns-66f779496c-s4f6n 0/1 Pending 0 96m <none>
<none> <none> <none>
etcd-master 1/1 Running 0 96m
192.168.100.128 master <none> <none>
kube-apiserver-master 1/1 Running 0 96m
192.168.100.128 master <none> <none>
kube-controller-manager-master 1/1 Running 0 96m
192.168.100.128 master <none> <none>
kube-proxy-bjx8l 1/1 Running 0 23m
192.168.100.136 node2 <none> <none>
kube-proxy-lbsrn 1/1 Running 0 23m
192.168.100.129 node1 <none> <none>
kube-proxy-xm94n 1/1 Running 0 96m
192.168.100.128 master <none> <none>
kube-scheduler-master 1/1 Running 0 96m
192.168.100.128 master <none> <none>

kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod的ip地址段,也称为cidr。

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当

做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border GatewayProtocol) 边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来进行

通信,是目前Kubernetes主流的网络方案。

官方下载地址:https://docs.tigera.io/calico

在这里插入图片描述

Github访问地址:https://github.com/projectcalico/calico

在这里插入图片描述

calico.yaml文件每个版本都有区别的,需要满足对应的k8s 版本

参考:https://archive-os-3-25.netlify.app/calico/3.25/getting-started/kubernetes/requirements

calico 3.25 版本对应的K8S版本有 v1.23—v1.28

下载Calico文件
[root@master ~]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
修改Calico文件
[root@master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"
部署Calico

注意:需要等待较长时间下载相关组建,主要看网络环境

[root@master ~]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalic
o.org created
---------------------------------------------------------------
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

在这里插入图片描述
在这里插入图片描述

验证检查集群
[root@master ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-658d97c59c-ts8ld   1/1     Running   0          40m
kube-system   calico-node-d47x6                          1/1     Running   0          40m
kube-system   calico-node-nc8r5                          1/1     Running   0          40m
kube-system   calico-node-wzqxn                          1/1     Running   0          40m
kube-system   coredns-66f779496c-7pm8r                   1/1     Running   0          17h
kube-system   coredns-66f779496c-mzmc9                   1/1     Running   0          17h
kube-system   etcd-master                                1/1     Running   0          17h
kube-system   kube-apiserver-master                      1/1     Running   0          17h
kube-system   kube-controller-manager-master             1/1     Running   0          17h
kube-system   kube-proxy-24z6b                           1/1     Running   0          17h
kube-system   kube-proxy-5bp2s                           1/1     Running   0          17h
kube-system   kube-proxy-pt25p                           1/1     Running   0          17h
kube-system   kube-scheduler-master                      1/1     Running   0          17h

如果出现长时间等待状态可以所有节点直接升级内核(解决)

原因:内核版本过低导致BPF文件系统缺失

[root@master ~]# yum update -y kernel && reboot

验证dns解析功能

[root@master ~]# dig -t a www.baidu.com @10.96.0.10; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 <<>> -t a www.baidu.com @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8093
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.                 IN      A;; ANSWER SECTION:
www.baidu.com.          5       IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       5       IN      CNAME   www.wshifen.com.
www.wshifen.com.        5       IN      A       103.235.46.115
www.wshifen.com.        5       IN      A       103.235.46.102;; Query time: 163 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Tue Sep 02 10:34:26 CST 2025
;; MSG SIZE  rcvd: 192

查看集群node状态

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   17h   v1.28.0
node1    Ready    <none>          17h   v1.28.0
node2    Ready    <none>          17h   v1.28.0

/etc/kubernetes/manifests/目录下存放Kubernetes集群中各个组件的Pod配置文件。

通常会包含以下几个重要的配置文件:

etcd.yaml:用于部署和管理etcd集群的配置文件
kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件

当Kubernetes集群启动时,kubelet会自动监视/etc/kubernetes/manifests/目录下的配置文件,并根据

这些配置文件创建和管理对应的Pod。

ca证书默认存放在/etc/kubernetes/pki/目录下

查看集群地址

[root@master ~]# kubectl get service -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   17h
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-65585   1/1     Running   0          32m
nginx-7854ff8877-h8ch4   1/1     Running   0          32m
nginx-7854ff8877-wl6tl   1/1     Running   0          32m[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        18h
nginx        NodePort    10.98.230.62   <none>        80:31177/TCP   10m[root@master ~]# kubectl get endpoints
NAME         ENDPOINTS                                           AGE
kubernetes   192.168.108.10:6443                                 18h
nginx        10.244.104.1:80,10.244.104.2:80,10.244.166.132:80   12m[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
nginx-7854ff8877-65585   1/1     Running   0          39m     10.244.166.132   node1   <none>           <none>
nginx-7854ff8877-h8ch4   1/1     Running   0          39m     10.244.104.2     node2   <none>           <none>
nginx-7854ff8877-wzfps   1/1     Running   0          2m18s   10.244.104.3     node2   <none>           <none>
优化操作
kubectl命令补全
[root@master ~]# yum install bash-completion -y
[root@master ~]# source /usr/share/bash-completion/bash_completion

在当前bash环境中永久设置命令补全

[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@master ~]# source ~/.bashrc
测试操作

创建应用服务nginx

[root@master ~]# kubectl create deployment nginx --image=nginx --replicas=3
deployment.apps/nginx created
[root@master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
service/nginx exposed

查看pod和service信息

默认情况下,master节点存在污点,不接受任何pod资源调度

[root@master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7854ff8877-65585   1/1     Running   0          2m53s
pod/nginx-7854ff8877-h8ch4   1/1     Running   0          2m53s
pod/nginx-7854ff8877-wl6tl   1/1     Running   0          2m53sNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   17h

测试访问

注意:关闭node节点防火墙

访问node1: http://192.168.108.11:31177/

访问node2: http://192.168.108.12:31177/

在这里插入图片描述
在这里插入图片描述

测试自我恢复功能

删除一个pod

[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-65585   1/1     Running   0          32m
nginx-7854ff8877-h8ch4   1/1     Running   0          32m
nginx-7854ff8877-wl6tl   1/1     Running   0          32m
#
[root@master ~]# kubectl delete pod nginx-7854ff8877-wl6tl
pod "nginx-7854ff8877-wl6tl" deleted
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-65585   1/1     Running   0          37m
nginx-7854ff8877-h8ch4   1/1     Running   0          37m
nginx-7854ff8877-wzfps   1/1     Running   0          7s
#发现新创建的nginx的ip也变了
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
nginx-7854ff8877-65585   1/1     Running   0          39m     10.244.166.132   node1   <none>           <none>
nginx-7854ff8877-h8ch4   1/1     Running   0          39m     10.244.104.2     node2   <none>           <none>
nginx-7854ff8877-wzfps   1/1     Running   0          2m18s   10.244.104.3     node2   <none>           <none>
#新ip也被自动关联到一起,因此不用管pod的ip地址,只需要管理CLUSTER-IP即可
[root@master ~]# kubectl get endpoints
NAME         ENDPOINTS                                           AGE
kubernetes   192.168.108.10:6443                                 18h
nginx        10.244.104.2:80,10.244.104.3:80,10.244.166.132:80   18m

在这里插入图片描述

删除
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-65585   1/1     Running   0          46m
nginx-7854ff8877-h8ch4   1/1     Running   0          46m
nginx-7854ff8877-wzfps   1/1     Running   0          9m39s
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        18h
nginx        NodePort    10.98.230.62   <none>        80:31177/TCP   24m
[root@master ~]# kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           47m
#先删
[root@master ~]# kubectl delete deployment nginx
deployment.apps "nginx" deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        18h
nginx        NodePort    10.98.230.62   <none>        80:31177/TCP   25m
[root@master ~]# kubectl delete svc nginx
service "nginx" deleted
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   18h

安装与部署(基于containerd)

升级内核

所有节点操作
1:升级内核(两个内核rpm包上传到服务器中再执行)

#下载内核软件包
wget -c http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-6.5.5-1.el7.elrepo.x86_64.rpm
wget -c http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.5.5-1.el7.elrepo.x86_64.rpm
yum localinstall -y kernel-ml-*#查看系统已安装的内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
显示
0 : CentOS Linux (6.5.5-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-de2f0c2376984509aa23f7bb88e529cf) 7 (Core)#设置grub2默认引导加载程序,用于启动操作系统
grub2-set-default 0#重新生成grub引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg#重启系统
yum update -y kernel && reboot#查看内核版本
uname -r
显示
6.5.5-1.el7.elrepo.x86_64

2:设置系统主机名和hosts文件

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02cat >>/etc/hosts<<EOF
192.168.100.128 k8s-master
192.168.100.129 k8s-node01
192.168.100.136 k8s-node02
EOF

3:安装环境包

yum -y install vim lrzsz unzip wget net-tools tree bash-completion \
conntrack ntpdate ntp ipvsadm ipset iptables \
curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make

4:关闭防火墙和内核安全机制

systemctl disable firewalld --now
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0

5:关闭swap分区
启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区

swapoff -a && sed -i '/swap/s/^/#/'  /etc/fstab 

6:关闭NetworkManager(可选)

systemctl stop NetworkManager
systemctl disable NetworkManager

7:调整系统内核参数

cat >/etc/sysctl.d/kubernetes.conf<<EOF
#开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1     
net.bridge.bridge-nf-call-ip6tables=1
#开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
#尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
#不检查物理内存是否够用
vm.overcommit_memory=1                
EOF#立即生效
sysctl --system

8:调整Linux资源限制(可选)

设置一个进程可以打开的最大文件句柄数

ulimit -SHn 65535

#在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024cat >> /etc/security/limits.conf <<EOF
#为所有用户设置文件描述符软限制
* soft nofile 655360
#为所有用户设置文件描述符硬限制
* hard nofile 131072
#为所有用户设置进程数软限制
* soft nproc 655350
#为所有用户设置进程数硬限制
* hard nproc 655350
#为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
#为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited      
EOF

9:配置时间同步

yum -y install chrony
systemctl restart chronyd
chronyc sources -v
hwclock -s                    #将硬件时钟的时间同步到系统时钟

10:配置IPVS功能

yum -y install ipvsadm ipset sysstat conntrack libseccomp(已安装)#添加ipvs模块和内核模块
cat >>/etc/modules-load.d/ipvs.conf<<EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4         #内核4.19以上版本设置为nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF#重启服务
systemctl restart systemd-modules-load#查看内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 

注意:

Linux内核4.19+版本已经将nf_conntrack_ipv4更新为nf_conntrack。
nf_conntrack是Linux内核中用于连接跟踪的模块,它负责跟踪网络连接的状态,包括连接的建立、维护和终止,以及相关的网络数据包的处理。这个模块在防火墙、网络地址转换(NAT)、负载均衡等网络功能中起着重要作用。

安装containerd

11:安装containerd软件(注意:k8s v1.24 版本以后放弃对Docker Engine的支持,而采用containerd容器进行时。)

containerd 是一个高级容器运行时,又名容器管理器。简而言之,它是一个守护进程,在单个主机上管理整个容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置装载、网络等。
containerd 被设计为易于嵌入到更大的系统中。Docker 引擎使用 containerd 来运行容器。Kubernetes 可以通过 CRI 使用 containerd 来管理单个节点上的容器。

#指定 containerd 在系统启动时加载的内核模块
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF#加载模块
modprobe overlay
modprobe br_netfilter#立即生效
sysctl --system#安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2#添加 Docker 软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast#查看containerd版本
yum list containerd.io --showduplicates | sort -r#安装指定版本containerd
yum -y install containerd.io-1.6.16#默认安装最新版本containerd(省略) 
yum -y install containerd.io #生成containerd的配置文件
mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml#修改containerd的驱动程序
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
#修改镜像仓库地址
#61行
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd#查看containerd版本
ctr version
1.6.16

在这里插入图片描述

12:镜像加速配置

vim /etc/containerd/config.toml
#145行
[plugins."io.containerd.grpc.v1.cri".registry]config_path = "/etc/containerd/certs.d"mkdir /etc/containerd/certs.d
mkdir /etc/containerd/certs.d/docker.iovim /etc/containerd/certs.d/docker.io/hosts.tomlserver = "https://docker.io"
[host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]capabilities = ["pull","resolve","push"][host."https://hub-mirror.c.163.com"]capabilities = ["pull","resolve","push"][host."https://do.nark.eu.org"]capabilities = ["pull","resolve","push"][host."https://dc.j8.work"]capabilities = ["pull","resolve","push"][host."https://docker.m.daocloud.io"]capabilities = ["pull","resolve","push"][host."https://dockerproxy.com"]capabilities = ["pull","resolve","push"][host."https://docker.mirrors.ustc.edu.cn"]capabilities = ["pull","resolve","push"][host."https://docker.nju.edu.cn"]capabilities = ["pull","resolve","push"][host."https://registry.docker-cn.com"]capabilities = ["pull","resolve","push"][host."https://hub.uuuadc.top"]capabilities = ["pull","resolve","push"][host."https://docker.anyhub.us.kg"]capabilities = ["pull","resolve","push"][host."https://dockerhub.jobcher.com"]capabilities = ["pull","resolve","push"][host."https://dockerhub.icu"]capabilities = ["pull","resolve","push"][host."https://docker.ckyl.me"]capabilities = ["pull","resolve","push"][host."https://docker.awsl9527.cn"]capabilities = ["pull","resolve","push"][host."https://mirror.baidubce.com"]capabilities = ["pull","resolve","push"][host."https://docker.1panel.live"]capabilities = ["pull","resolve","push"]#启动containerdsystemctl enable containerd
systemctl start containerd
systemctl status containerd#查看containerd版本
ctr version
1.6.16#测试下载镜像
ctr images pull docker.io/library/httpd:latest --hosts-dir=/etc/containerd/certs.d#查看镜像
ctr i lsREF                            TYPE                                    DIGEST                                                                  SIZE     PLATFORMS                                                                                               LABELS 
docker.io/library/httpd:latest application/vnd.oci.image.index.v1+json sha256:4564ca7604957765bd2598e14134a1c6812067f0daddd7dc5a484431dd03832b 55.8 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x -#删除测试镜像
ctr i remove docker.io/library/httpd:latest

在这里插入图片描述

安装kubeadm

13:安装kubeadm

#添加k8s软件源
cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF#快速建立yum缓存
yum makecache fast#查看k8s版本
yum list kubectl --showduplicates | sort -r#默认安装最新版本k8s(省略)
yum install -y kubelet kubeadm kubectl#安装指定版本k8s
yum -y install kubectl-1.28.0 kubelet-1.28.0 kubeadm-1.28.0

kubelet使用systemd来作为cgroup驱动,使系统运行稳定,限制Pod和容器的资源使用情况,如cpu、内存等。

注意:k8s v1.22开始,使用 kubeadm 创建集群时,默认使用systemd为cgroup驱动程序;

#修改kubelet的crgoup与containerd的crgoup保持一致
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF#kubelet设置为开机自启动
systemctl daemon-reload
systemctl enable kubelet

各工具包作用

  • kubeadm:快速部署kubernetes集群的工具
  • kubelet:在集群中的每个节点上用来启动Pod和容器等
  • kubectl:负责管理kubernetes集群的命令行工具

查看k8s版本

kubelet --version 或 kubeadm version

14:配置crictl工具
crictl 是CRI兼容的容器运行时命令行接口,可以使用它来检查和调试kubelet节点上的容器运行时和镜像

设置crictl连接containerd

cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
在master节点操作

15:主节点部署Kubernetes

#查看k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images list --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers#下载k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images pull --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers#查看k8s集群所有的镜像
[root@k8s-master ~]# crictl images ls
#显示
IMAGE                                                             TAG                 IMAGE ID            SIZE
registry.aliyuncs.com/google_containers/coredns                   v1.10.1             ead0a4a53df89       16.2MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0             73deb9a3f7025       103MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0             bb5e0dde9054c       34.6MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0             4be79c38a4bab       33.4MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0             ea1030da44aa1       24.6MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0             f6f496300a2ae       18.8MB
registry.aliyuncs.com/google_containers/pause                     3.9                 e6f1816883972       322kB

方法一:初始化集群手动开启IPVS

[root@k8s-master ~]# kubeadm init \
--apiserver-advertise-address=192.168.10.131 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.0 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--upload-certs | tee kubeadm-init.log

参数解释:

–apiserver-advertise-address 集群通告地址
–image-repository 指定阿里云镜像仓库地址
–kubernetes-version K8s版本,与软件包版本一致
–pod-network-cidr Pod网络的范围,与下面部署的CNI网络组件yaml中保持一致(可以修改)
–service-cidr 集群内部虚拟网络,Pod统一访问入口
–upload-certs 将控制节点的证书上传到kubeadm-certs Secret中,可添加多个控制节点

方法二:初始化集群自动开启IPVS(推荐)

# 创建初始化集群配置文件
[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm-init.yaml# 修改初始化集群配置文件
[root@k8s-master ~]# vim kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.108.10   #12行 修改master节点ipbindPort: 6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sock   #15行 修改容器进行时imagePullPolicy: IfNotPresentname: k8s-master                   #17行 修改master节点主机名taints:                                        #18行  注意!去掉Null- effect: NoSchedule               #19行 添加污点key: node-role.kubernetes.io/control-plane     #20行 添加
---
apiServer:timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers    #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0            #34行 修改k8s版本
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16           #38行 增加pod网段
scheduler: {}# 末尾添加
---                                  #更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---                                  #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1 
kind: KubeletConfiguration
cgroupDriver: systemd
完整kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.100.128bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-mastertaints:- effect: NoSchedulekey: node-role.kubernetes.io/control-plane
---
apiServer:timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1 
kind: KubeletConfiguration
cgroupDriver: systemd
# 初始化集群
[root@k8s-master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log#显示
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.100.128:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:ed3d99a29dda0cf925d25765bc1031380cd1542ce6b1bad444a6ccea8a4fc242 # 查看 kube-proxy 代理模式
curl localhost:10249/proxyMode# 注意:k8s集群初始化失败,查看日志解决
journalctl -xeu kubelet 或 tail kubeadm-init.log

故障:初始化集群失败

#查看日志
journalctl -xeu kubelet 或 tail kubeadm-init.log# 重置 kubeadm
kubeadm reset -f#删除启动端口进程
pkill -9 kubelet
plikk -9 kube-controll
pkill -9 kebu-schedule# 清理残留文件
rm -rf /etc/kubernetes/pki
rm -rf /etc/kubernetes/manifests
rm -f $HOME/.kube/config# 重新初始化集群(如果是docker运行时,则使用cri-docker.sock)
kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log

16:配置kubectl工具(根据初始化成功后的提示进行配置)

#Kubectl 是一个用于操作Kubernetes集群的命令行工具。
#kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config#临时生效(退出当前窗口重连环境变量失效)
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf#永久生效(推荐)
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source  ~/.bash_profile
#在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。

17:查看组建状态

[root@k8s-master ~]# kubectl get cs
#显示
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
controller-manager   Healthy   ok        
scheduler            Healthy   ok        
etcd-0               Healthy   ok#获取加入密令
[root@master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.108.10:6443 --token y0y9tl.aduvi7wsx13xg7xa --discovery-token-ca-cert-hash sha256:1b4c33b0501e2d4c734a4ea0aefe5188350e7f181e3085bbcd8786c45402e473
node工作节点操作

18:node工作节点加入集群

[root@k8s-node01 ~]# kubeadm join 192.168.108.10:6443 --token y0y9tl.aduvi7wsx13xg7xa --discovery-token-ca-cert-hash sha256:1b4c33b0501e2d4c734a4ea0aefe5188350e7f181e3085bbcd8786c45402e473

端口号6443:通常用于Kubernetes集群的API接口,提供对集群的管理和控制。

19:查看集群节点状态

#此时,k8s内部不具备网络功能,因此节点信息都是 “Not Ready” 状态
[root@k8s-master .kube]# kubectl get nodes
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   18m   v1.28.0
k8s-node01   NotReady   <none>          82s   v1.28.0
k8s-node02   NotReady   <none>          5s    v1.28.0
部署网络CNI组建

kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod的ip地址段,也称为cidr。

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。
calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border Gateway Protocol) 边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来进行通信,是目前Kubernetes主流的网络方案。
官方下载地址:https://docs.tigera.io/calico
Github访问地址:https://github.com/projectcalico/calico
calico.yaml文件每个版本都有区别的,需要满足对应的k8s 版本
参考:https://archive-os-3-25.netlify.app/calico/3.25/getting-started/kubernetes/requirements
calico 3.25 版本对应的K8S版本有 v1.23—v1.28

# 下载Calico文件
[root@k8s-master ~]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml# 修改Calico文件
[root@k8s-master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"# 部署Calico
[root@k8s-master ~]# kubectl apply -f calico.yaml
#显示
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
验证检查
#查看所有pod运行情况
[root@k8s-master ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-658d97c59c-lt5xv   1/1     Running   0          2m23s
kube-system   calico-node-k99ls                          1/1     Running   0          2m23s
kube-system   calico-node-m8sxm                          1/1     Running   0          2m23s
kube-system   calico-node-ntxjd                          1/1     Running   0          2m23s
kube-system   coredns-66f779496c-9pz6n                   1/1     Running   0          29m
kube-system   coredns-66f779496c-nh9th                   1/1     Running   0          29m
kube-system   etcd-k8s-master                            1/1     Running   0          29m
kube-system   kube-apiserver-k8s-master                  1/1     Running   0          29m
kube-system   kube-controller-manager-k8s-master         1/1     Running   0          29m
kube-system   kube-proxy-kxlfz                           1/1     Running   0          12m
kube-system   kube-proxy-l2kc4                           1/1     Running   0          11m
kube-system   kube-proxy-psc5q                           1/1     Running   0          29m
kube-system   kube-scheduler-k8s-master                  1/1     Running   0          29m

/etc/kubernetes/manifests/目录下存放Kubernetes集群中各个组件的Pod配置文件。

通常会包含以下几个重要的配置文件:

etcd.yaml:用于部署和管理etcd集群的配置文件
kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件

当Kubernetes集群启动时,kubelet会自动监视/etc/kubernetes/manifests/目录下的配置文件,并根据这些配置文件创建和管理对应的Pod。

ca证书默认存放在/etc/kubernetes/pki/目录下

查看集群节点状态

[root@master ~]# watch kubectl get pods -n kube-system[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   32m   v1.28.0
k8s-node01   Ready    <none>          15m   v1.28.0
k8s-node02   Ready    <none>          14m   v1.28.0
完成后优化操作

主节点安装kubectl命令自动补全

1)安装bash-completion工具

[root@k8s-master ~]# yum install bash-completion -y

2)执行bash_completion

[root@k8s-master ~]# source /usr/share/bash-completion/bash_completion

3)加载kubectl completion

在当前bash环境中临时设置命令补全

[root@k8s-master ~]# source <(kubectl completion bash)

在当前bash环境中永久设置命令补全

[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source  ~/.bashrc
主节点测试kubernetes集群
#创建应用服务nginx
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx --replicas=3#暴露服务端口
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort#查看pod和service信息
#默认情况下,master节点存在污点,不接受任何pod资源调度
[root@k8s-master ~]# kubectl get pod,svc
#显示
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7854ff8877-6vtlw   1/1     Running   0          96s
pod/nginx-7854ff8877-b2v7l   1/1     Running   0          96s
pod/nginx-7854ff8877-xkzp9   1/1     Running   0          96s
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        38m
service/nginx        NodePort    10.106.93.139   <none>        80:31086/TCP   15s
测试访问

浏览器输入地址:nodeIP:port 则可以看到nginx测试页面!!!

node1和node2地址都可以访问

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

相关文章:

  • 网站建设投标人资质要求wordpress邮箱如何解析
  • 鞍山商城网站建设运城手机网站制作
  • 【GitLab/CD】前端 CD
  • 做简报的网站竹制品网站怎么做
  • Kafka使用-Consumer
  • 诸暨网站建设怎么建立微网站?
  • 【Docker】【1.docker常用命令总结】
  • 深圳的网站建设公司的外文名是wordpress异步加载
  • 创客匠人2025万人高峰论坛:如何融合创始人IP与AI?
  • Linux中完成根文件系统的最终准备和切换prepare_namespace函数的实现
  • A800 部署 Qwen2-VL-8B-Instruct 完整指南
  • rust:第一个程序HelloWorld
  • 给新公司建网站用代理访问永久域名
  • 启动Hana失败 FAIL: process hdbdaemon HDB Daemon not running
  • iOS 26 内存占用监控 多工具协同下的性能稳定性分析实战
  • Kubernetes service管理
  • 布吉企业网站建设百度网站两两学一做心得体会
  • 深入仓颉(Cangjie)编程语言:循环的革命——从“命令式”操控到“声明式”安全迭代
  • 画出网站和目录结构图wordpress 自定义表
  • linux gpio errno EBUSY问题举例分析
  • 如何在 macOS 中清理 Homebrew 软件包 ?
  • 手机网站设计立找亿企邦湖南长沙房价2023年最新房价
  • 如何选择徐州网站开发wordpress新建页面位置
  • nestjs引篇
  • apmserv 设置网站目录yy头像在线制作网站
  • 基于YOLO+多模态大模型+人脸识别+视频检索的智慧公安综合研判平台(vue+flask+AI算法)
  • 二手车网站程序德阳网站建设 选哪家好
  • 极智算服务器用的还是自己的网络吗安全吗
  • Jenkins vs GitLab CI/CD vs Arbess,CI/CD工具一文纵评
  • 机器学习—— 回归分析之如何建立回归模型