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

Kubernetes(K8s)基础知识与部署

Kubernetes(K8s)基础知识与部署

一、Kubernetes 概述

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它由 Google 发起并捐赠给 Cloud Native Computing Foundation(CNCF),现已成为容器编排领域的事实标准。

官网:https://kubernetes.io/

二、应用部署方式对比

1. 传统部署

  • 方式:直接将应用程序部署在物理机上
  • 优点:简单,无需额外技术支持
  • 缺点
    • 无法定义资源使用边界,资源分配不合理
    • 程序间易相互影响,隔离性差

2. 虚拟化部署

  • 方式:在物理机上运行多台虚拟机,每个虚拟机为独立环境
  • 优点
    • 程序环境隔离,互不影响
    • 提供基础安全性保障
  • 缺点
    • 需额外运行操作系统,资源浪费严重
    • 性能开销较大

3. 容器化部署

  • 方式:共享操作系统内核,容器封装应用及依赖
  • 优点
    • 拥有独立文件系统、CPU、内存和进程空间
    • 资源占用低,与底层架构解耦
    • 可跨云服务商、跨 Linux 发行版部署
  • 挑战:容器编排问题(故障恢复、扩展、负载均衡等)

三、容器编排工具

解决容器化部署中的编排问题的主流工具:

  • Swarm:Docker 官方提供的轻量级编排工具
  • Mesos:Apache 开源的资源管控工具,需与 Marathon 配合使用
  • Kubernetes:Google 开源的功能全面的容器编排平台,生态最完善

四、Kubernetes 主要功能

Kubernetes 通过集群管理实现资源自动化,核心功能包括:

  1. 自我修复:容器崩溃后 1 秒内自动重启
  2. 弹性伸缩:根据需求自动调整容器数量
  3. 服务发现:服务间自动发现依赖关系
  4. 负载均衡:自动实现多容器实例的请求分发
  5. 版本回退:支持快速回滚到历史稳定版本
  6. 存储编排:根据容器需求自动创建存储卷

五、Kubernetes 核心组件

K8s 集群由控制节点(Master)工作节点(Node) 构成,各组件分工如下:

1. 控制节点(Master)

  • Apiserver:资源操作唯一入口,提供认证、授权及 API 注册
  • Scheduler:负责资源调度,选择合适 Node 运行 Pod
  • Controller-manager:维护集群状态(部署安排、故障检测、自动扩展等)
  • Etcd:集群数据存储中心,保存所有资源对象信息

2. 工作节点(Node)

  • Kubelet:维护容器生命周期,通过控制 Docker 实现容器的创建、更新和销毁
  • Docker:负责节点上容器的实际操作
  • Kube-proxy:实现 Pod 网络代理,提供负载均衡和服务暴露能力

组件调用流程(以 Nginx 部署为例)

  1. 集群启动后,Master 和 Node 信息自动存储到 Etcd
  2. Nginx 部署请求发送至 Master 的 Apiserver
  3. Apiserver 调用 Scheduler 确定部署的 Node 节点
  4. Apiserver 通过 Controller-manager 调度 Node 执行部署
  5. Node 节点的 Kubelet 通知 Docker 启动 Nginx 容器(运行在 Pod 中)
  6. 外部通过 Kube-proxy 访问 Nginx 服务

六、Kubernetes 核心概念

  • Master:集群控制节点,负责集群管控(至少 1 个)
  • Node:工作负载节点,接收 Master 调度并运行容器
  • Pod:K8s 最小操作单元,一个 Pod 可包含 1 个或多个容器
  • Controller:管理 Pod 的控制器,负责 Pod 的启动、停止和伸缩
  • Service:Pod 对外服务的统一入口,维护同一类 Pod 的访问
  • Label:标签,用于对 Pod 分类,同一类 Pod 拥有相同标签
  • Namespace:命名空间,实现 Pod 运行环境的隔离

七、Kubernetes 集群部署指南(基于 Rocky Linux 9.4)

1. 集群规划

采用 "1 主 2 从" 架构,节点信息如下:

主机名

IP 地址

角色

操作系统

硬件配置

核心作用

master

192.168.100.100

管理节点

Rocky Linux 9.4

2core/4G 内存 / 50G

运行控制平面组件(API Server、etcd、Controller Manager、Scheduler)

node01

192.168.100.110

工作节点

Rocky Linux 9.4

2core/4G 内存 / 50G

运行容器化应用,接受 Master 调度

node02

192.168.100.120

工作节点

Rocky Linux 9.4

2core/4G 内存 / 50G

同 node01,提供冗余能力

扩展说明

  • 生产环境建议 Master 节点升级至 4 核 8G 内存,工作节点配置根据应用需求调整
  • Rocky Linux 9.4 为 CentOS 兼容版本,支持 K8s 官方推荐内核

2. 操作系统准备(所有节点)

2.1 配置主机名称
# master节点hostnamectl hostname master# node01节点hostnamectl hostname node01# node02节点hostnamectl hostname node02
2.2 配置 hosts 文件
echo "192.168.100.100 master" >> /etc/hostsecho "192.168.100.110 node01" >> /etc/hostsecho "192.168.100.120 node02" >> /etc/hosts

验证:执行ping master和ping node01测试连通性

2.3 关闭防火墙和 SELinux
# 关闭防火墙systemctl stop firewalld.servicesystemctl disable firewalld.service# 关闭SELinuxsetenforce 0sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config

验证:

  • 防火墙:systemctl status firewalld显示 "inactive (dead)"
  • SELinux:getenforce输出 "Permissive"(临时),重启后输出 "Disabled"(永久)
    2.4 配置国内镜像源
    # 配置阿里云系统源sed -e 's|^mirrorlist=|#mirrorlist=|g' \-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \-i.bak \/etc/yum.repos.d/rocky-*.repo# 配置EPEL源(华为云)cat > /etc/yum.repos.d/epel.repo << EOF[epel]name=Extra Packages for Enterprise Linux \$releasever - \$basearchbaseurl=https://repo.huaweicloud.com/epel/\$releasever/Everything/\$basearch/enabled=1gpgcheck=1countme=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-\$releaseverEOF# 安装工具yum -y install vim bash-completion net-tools lrzszyum makecache
    2.5 时间同步
    systemctl restart chronydsystemctl enable chronydhwclock -wtimedatectl # 验证时区为Asia/Shanghai
    2.6 修改最大打开文件数
    cat >> /etc/security/limits.conf << EOF* soft nofile 65535* hard nofile 65535EOF

    生效:重新登录后执行ulimit -n验证输出 65535

    2.7 修改内核参数
    cat >> /etc/sysctl.conf << EOFnet.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_tw_buckets = 20480net.ipv4.tcp_max_syn_backlog = 20480net.core.netdev_max_backlog = 262144net.ipv4.tcp_fin_timeout = 20EOFsysctl -p
    2.8 关闭 Swap
    swapoff -ased -ri 's/.*swap.*/#&/' /etc/fstab

    验证:free -m显示 Swap 总量为 0

    2.9 安装系统工具
    yum install -y gcc autoconf sysstat
    
    2.10 开启 Bridge 网桥过滤
    # 配置参数cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF# 加载模块modprobe br_netfilter && lsmod | grep br_netfilter# 生效配置sysctl -p /etc/sysctl.d/k8s.conf

    3. Docker 环境配置(所有节点)

    3.1 配置阿里云 Docker 源
    yum install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    3.2 安装指定版本 Docker
    # 查看可用版本yum list docker-ce.x86_64 --showduplicates | sort -r# 安装25.0.5版本yum -y install docker-ce-25.0.5-1.el9
    3.3 配置 Docker Cgroup 驱动
    cat > /etc/docker/daemon.json << EOF{"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"]}EOF
    3.4 启动 Docker
    systemctl enable docker --now
    

    验证:systemctl status docker显示 "active (running)"

    4. cri-docker 配置(所有节点)

    4.1 下载并解压 cri-docker(Master 节点先行)
    # 下载二进制包wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz# 解压tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/
    4.2 配置 systemd 服务(Master 节点先行)
    # 下载服务文件wget -O /etc/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.servicewget -O /etc/systemd/system/cri-docker.socket https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket# 修改服务文件sed -i 's#ExecStart=.*#ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker#' /etc/systemd/system/cri-docker.service# 修改socket文件sed -i 's#ListenStream=.*#ListenStream=/var/run/cri-dockerd.sock#' /etc/systemd/system/cri-docker.socket
    4.3 复制到其他节点(Master 执行)
    # 复制到node01scp cri-dockerd-0.3.9.amd64.tgz root@192.168.100.70:/root/scp /etc/systemd/system/cri-docker.s* root@192.168.100.70:/etc/systemd/system/# 复制到node02scp cri-dockerd-0.3.9.amd64.tgz root@192.168.100.80:/root/scp /etc/systemd/system/cri-docker.s* root@192.168.100.80:/etc/systemd/system/

    其他节点执行解压命令:tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/

    4.4 启动 cri-docker(所有节点)
    systemctl daemon-reloadsystemctl enable cri-docker.service --now

    验证:systemctl status cri-docker显示 "active (running)"

    5. K8s 集群部署

    5.1 配置阿里云 K8s 源(所有节点)
    cat > /etc/yum.repos.d/k8s.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/enabled=1gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.keyEOF
    5.2 安装 K8s 组件(所有节点)
    yum install -y kubelet kubeadm kubectl
    
    5.3 配置 kubelet Cgroup(所有节点)
    cat > /etc/sysconfig/kubelet << EOFKUBELET_EXTRA_ARGS="--cgroup-driver=systemd"EOFsystemctl enable kubelet.service
    5.4 初始化 Master 节点(仅 Master 执行)
    # 生成配置文件kubeadm config print init-defaults > kubeadm-config.yaml# 编辑配置文件(关键修改)cat > kubeadm-config.yaml << EOFapiVersion: kubeadm.k8s.io/v1beta3bootstrapTokens:- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 192.168.100.60 # Master节点IPbindPort: 6443nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sock # cri-docker端点imagePullPolicy: IfNotPresentname: master01 # Master主机名taints: null---apiServer:timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns: {}etcd:local:dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 阿里云镜像仓库kind: ClusterConfigurationkubernetesVersion: 1.28.0networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12scheduler: {}EOF# 初始化集群kubeadm init --config kubeadm-config.yaml --upload-certs
    5.5 配置 kubectl(仅 Master 执行)
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profilesource /etc/profile

    验证:kubectl version显示客户端和服务端版本

    5.6 工作节点加入集群(node01 和 node02 执行)
    # 使用Master初始化输出的join命令,示例:kubeadm join 192.168.100.60:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \--cri-socket=unix:///var/run/cri-dockerd.sock

    若 token 过期,在 Master 执行:kubeadm token create --print-join-command重新生成

    5.7 部署 Calico 网络插件(仅 Master 执行)
    # 下载配置文件wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml# 部署kubectl apply -f calico.yaml

    验证:kubectl get pods -n kube-system查看 Calico 组件运行状态

    6. 集群状态验证(Master 节点执行)

    6.1 检查节点状态
    kubectl get nodes
    
    • 正常输出示例(所有节点状态为Ready):
    NAME STATUS ROLES AGE VERSIONmaster Ready control-plane 10m v1.28.0node01 Ready <none> 5m v1.28.0node02 Ready <none> 5m v1.28.0
    • 若节点状态为NotReady,等待 2-3 分钟(网络插件初始化需要时间),或通过kubectl describe node <节点名>排查原因。
    6.2 检查系统组件状态
    kubectl get pods -n kube-system
    
    • 核心组件(kube-apiserver、kube-controller-manager、kube-scheduler、etcd、calico-*)状态应为Running。
    • 若 Calico 相关 Pod 状态为Pending或ImagePullBackOff,执行以下命令手动拉取镜像(所有节点):
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/node:v3.24.1docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/cni:v3.24.1docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/kube-controllers:v3.24.1

    拉取完成后,重启 Pod:kubectl delete pods -n kube-system <calico-pod-name>。

    7. 常见故障排查

    7.1 节点状态为 NotReady
    • 检查网络插件状态:kubectl get pods -n kube-system | grep calico,确保 Calico 正常运行;
    • 检查 kubelet 状态:systemctl status kubelet,查看日志:journalctl -u kubelet -f;
    • 检查容器运行时:systemctl status cri-docker,确保 Docker 和 cri-dockerd 正常。
    7.2 Pod 镜像拉取失败(ImagePullBackOff)
    • 手动拉取镜像:docker pull <镜像名>,验证镜像是否可访问;
    • 配置镜像仓库加速器(已在 Docker 配置中包含,若仍失败可更换加速器地址);
    • 替换镜像源为国内地址(如nginx:1.23替换为registry.cn-hangzhou.aliyuncs.com/library/nginx:1.23)。
    7.3 节点无法加入集群(Unauthorized)
    • 重新生成 join 命令:在 Master 节点执行kubeadm token create --print-join-command;
    • 清理节点残留配置:在 Node 节点执行kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock,再重新加入。

    8. 集群维护建议

    8.1 备份 etcd 数据(Master 节点)
    # 备份数据到/backup目录ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \--cacert=/etc/kubernetes/pki/etcd/ca.crt \--cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \--key=/etc/kubernetes/pki/apiserver-etcd-client.key \snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db
    8.2 升级集群版本(谨慎操作)
    • 先升级 Master 节点:kubeadm upgrade apply v1.28.x(x 为具体版本号);
    • 再升级各 Node 节点:kubeadm upgrade node,并重启 kubelet。
    8.3 清理无用资源
    # 删除终止状态的Podkubectl delete pods --field-selector=status.phase=Succeeded -Akubectl delete pods --field-selector=status.phase=Failed -A# 清理未使用的镜像(Node节点)docker system prune -a -f

    10. 总结

    Kubernetes 通过组件协同实现了容器的自动化管理,核心优势在于自愈能力弹性伸缩跨环境部署。本文基于 kubeadm 工具完成了 “1 主 2 从” 集群的部署,涵盖环境准备、组件安装、网络配置等关键步骤,并通过 Nginx 示例演示了基本操作。

    后续学习可重点关注:

    • 深入理解 Pod 生命周期与控制器(Deployment/StatefulSet/DaemonSet);
    • 掌握 Service 与 Ingress 的网络转发机制;
    • 学习配置管理(ConfigMap/Secret)和存储卷(PV/PVC)的使用;
    • 了解集群监控(Prometheus+Grafana)和日志收集(EFK Stack)方案。
    http://www.dtcms.com/a/548792.html

    相关文章:

  • 嵊州做网站钻磊云主机
  • 网站建设时间及简介靖安县城乡规划建设局网站
  • 记一次从文件读取到getshell
  • 从顶流综述,发现具身智能的关键拼图----具身智能的内部模拟器:World Model如何成为AI走向真实世界的关键技术
  • 学习笔记—契比雪夫多项式和契比图过滤器
  • 【机器学习入门】9.2:感知机 Python 实践代码模板(苹果香蕉分类任务适配)
  • 大会的网站架构企业网站设计的基本内容包括哪些
  • 打印对称的X。
  • 生产管理系统详解:生产产品,bom,生产线,生产工序,bom清单,生产订单,生产任务单,他们之间的关系梳理
  • 企业微信SCRM系统有什么作用,满足哪些功能?从获客到提效的功能适配逻辑
  • JS如何操作IndexedDB
  • 网站正在维护中wordpress 评分
  • Kafka关闭日志,启动一直打印日志
  • 搬家网站建设思路荆门哪里有专门做企业网站的
  • 前后端分离
  • curl开发常用方法总结
  • rust实战:基础框架Rust + Tauri Windows 桌面应用开发文档
  • knife4j在配置文件(xml文件)的配置错误
  • Java的多线程——多线程(二)
  • 小企业也能用AI?低成本智能转型实战案例
  • ros2 播放 ros1 bag
  • 网页设计做一个网站设计之家官方网站
  • 基于STM32单片机 + DeepSeek-OCR 的智能文档扫描助手设计与实现
  • 微信小程序如何传递参数
  • 【数据结构】:数组及特殊矩阵
  • 记录一下微信小程序里使用SSE
  • API 接口安全:用 JWT + Refresh Token 解决 Token 过期与身份伪造问题
  • 云手机搬砖 高效采集资源
  • GitHub Actions CI/CD 自动化部署完全指南
  • Fastlane 结合 开心上架 命令行版本实现跨平台上传发布 iOS App