欢迎光临
我们一直在努力

Kubernetes(K8s)超详细讲解

Kubernetes 简称 K8s(8 代替中间 8 个字母),是 Google 基于 Borg 开源的容器编排平台,用于自动化部署、扩缩容、管理容器应用,是云原生领域事实标准。

一、基础认知

1. 什么是容器编排

单纯 Docker 只能单机运行容器,当集群几十 / 上百台机器、上千容器时,人工管理无法实现:

  • 容器挂了自动重启
  • 流量负载均衡
  • 按需扩缩容
  • 版本滚动更新 / 回滚
  • 跨机器调度、资源配额

K8s 就是解决以上问题的容器编排系统。

2. 核心定位

  • 平台:容器云操作系统
  • 作用:统一管理整个集群的容器生命周期
  • 生态:CNCF 顶级项目,云原生基石,对接 Docker、容器镜像、CI/CD、监控、日志、服务网格等。

3. 核心优势

  • 自愈能力:节点 / 容器故障,自动重建、迁移
  • 滚动更新 & 回滚:零停机发布,出错一键回退
  • 弹性扩缩容:根据 CPU / 内存 / 自定义指标自动增减实例
  • 服务发现 & 负载均衡:内置集群网络、服务访问
  • 资源精细化管理:CPU / 内存配额、优先级、调度策略
  • 声明式配置:只定义期望状态,K8s 自动维持
  • 二、K8s 整体架构(集群架构)

    K8s 集群分为两大角色:控制平面(Master 主控节点) + 工作节点(Node)

    架构总览

    [ 客户端 ] kubectl

    [ 控制平面 Master ](集群大脑)
    ├─ kube-apiserver # 入口、认证、授权
    ├─ etcd # 集群数据存储(数据库)
    ├─ kube-scheduler # 调度器:选节点运行Pod
    └─ kube-controller-manager # 控制器:维持期望状态

    [ 工作节点 Node ](运行业务容器)
    ├─ kubelet # 节点代理,管理本机Pod
    ├─ kube-proxy # 网络代理,Service负载均衡
    └─ 容器运行时 (Docker/containerd)

    2.1 控制平面组件(Master 节点)

    Master 是集群大脑,不运行业务 Pod(生产建议多 Master 高可用)。

    1.kube-apiserver

    集群唯一入口,所有请求必经组件:

    • 接收 kubectl、其他组件、客户端请求
    • 认证、鉴权、数据校验
    • 对接 etcd 读写数据
    • 所有组件只和 apiserver 通信,不直连 etcd

    三大核心能力拆解

    1. 集群唯一入口

    • 统一接入点:客户端(kubectl、SDK、UI)、集群内部组件,全部只访问 apiserver
    • 解耦:内部组件不用互相知道地址、不用互相通信,所有交互都经过它
    • 统一管控:所有操作集中收口,方便做安全、审计、限流

    2. 鉴权(Authentication + Authorization)

    分两步:认证 → 授权,就是「你是谁」+「你能干啥」

    (1)认证 Authentication:验身份(你是谁)

    判断请求方是不是集群认可的合法用户 / 组件。 常见方式:

    • 客户端:证书、Token、用户名密码

    • 集群内部组件(kubelet / 控制器):专用证书 / ServiceAccount Token

    举例:陌生人刷门禁,先看有没有合法门禁卡,没卡直接拦在门外。

    (2)授权 Authorization:判权限(你能做什么)

    身份合法后,再判断这个账号有没有权限执行当前操作。 K8s 默认用 RBAC 权限模型

    • 比如普通用户只能查 Pod,不能删集群节点

    • 运维账号拥有全权限

    • 业务服务账号只能操作自己命名空间下的资源

    ps:RBAC = 基于角色的访问控制,核心逻辑:不给用户直接绑权限,先把权限打包成「角色」,再把用户绑定角色,权限统一管理、好维护。

    举例:有门禁卡进来了,但小区业主只能进住宅楼,不能进机房、中控室。

    3. 准入校验(Admission Control)

    身份、权限都通过后,最后一道规则校验,拦截不合规的配置 / 请求,分两类:

  • 变异准入(Mutating) 自动修正不规范的配置。 例:你创建 Pod 没写默认标签、没指定镜像拉取策略,apiserver 自动补上。

  • 校验准入(Validating) 严格检查规则,不满足直接拒绝请求。 常见校验场景:

    • 资源字段格式是否合法(YAML 语法、字段类型)

    • 资源配额:内存 / CPU 超集群限制,直接报错

    • 安全规则:禁止特权容器、禁止挂载主机敏感目录

    • 命名规范、标签规则校验

  • 举例:进大厅办事,材料格式不对先帮你补全(变异);内容违反规定,直接不予办理(校验)。

    2.etcd

    集群键值数据库,存储集群所有数据:

    • 所有资源对象(Pod、Deployment、Service、配置、状态)
    • 强一致性、高可用,生产必须集群化部署
    • 相当于 K8s 的「数据库」

    3.kube-scheduler 调度器

    负责为新 Pod 选择最合适的 Node 节点:

  • 预选(Predicate):过滤不满足条件的节点(资源不足、标签不匹配、污点等)
  • 优选(Priority):打分,选出最优节点
  • 支持自定义调度策略、亲和性、污点容忍。

    4.kube-controller-manager 控制器管理器

    内置多种控制器,循环对比「期望状态」和「实际状态」,不断调优:

    • Node Controller:节点宕机处理
    • Replication Controller:保证副本数
    • Deployment Controller:管理应用发布、滚动更新
    • Namespace Controller、PV/PVC 控制器等 每个控制器都是一个死循环,持续巡检。

    2.2 工作节点组件(Node 节点)

    真正运行业务容器的服务器,集群中可以有大量 Node。

    1.kubelet

    每个 Node 上的代理代理,核心职责:

    • 接收 apiserver 指令,管理本机 Pod
    • 创建 / 启动 / 停止容器、挂载存储、配置网络
    • 上报节点、Pod 状态给 Master
    • 直接对接容器运行时(Docker/containerd)

    2.kube-proxy

    集群网络 & 负载均衡组件:

    • 维护 Node 上网络规则
    • 实现 Service 访问、内部负载均衡
    • 三种模式:userspace(旧)、iptables(默认)、ipvs(高性能,生产推荐)

    3.容器运行时

    负责真正创建、运行容器:

    • 主流:containerd(K8s 官方默认)、Docker
    • 作用:拉取镜像、启动容器、销毁容器

    三、核心资源对象(重中之重)

    K8s 一切皆资源,通过 YAML/JSON 描述,kubectl 管理。 按使用频率排序讲解。

    1.Pod

    1. Pod 是什么

    K8s 最小调度单元,不是容器!

    • 一个 Pod 里可以包含一个或多个容器
    • 同一 Pod 内容器:共享网络栈、共享存储卷、同生命周期
    • 一个 Pod 只会运行在一个 Node 上,不会跨节点

    规范用法: 绝大多数场景:一个 Pod 一个业务容器 特殊场景:主容器 + 辅助容器(日志收集、监控、sidecar 边车)

    2.Pod 生命周期

    创建 → 运行 → 退出 → 重启 / 销毁

    • 容器异常退出:kubelet 根据重启策略自动重启
    • Pod 本身不会漂移,除非被控制器重建

    2. Deployment(最常用,无状态应用)

    管理无状态应用(Web、API、微服务),生产 90% 业务使用。 能力:

  • 维持指定副本数(副本挂了自动重建)
  • 滚动更新 / 灰度发布(零停机升级)
  • 版本回滚
  • 扩缩容
  • 工作逻辑

    Deployment → 管理 ReplicaSet → ReplicaSet → 管理 Pod

    • ReplicaSet:保证指定数量 Pod 正常运行
    • 版本更新时创建新 RS,逐步替换旧 Pod,实现滚动更新

    极简 YAML 示例

    yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-demo
    spec:
    replicas: 3 # 期望3个Pod副本
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    – name: nginx
    image: nginx:1.21
    ports:
    – containerPort: 80


    3. Service(服务发现 + 内部负载均衡)

    问题背景

    Pod 特点:IP 动态变化、随时重建、漂移,不能直接用 Pod IP 访问。

    Service 作用

  • 为一组 Pod 提供固定访问入口(固定 ClusterIP)
  • 实现集群内部负载均衡
  • 服务发现:集群内通过 Service 名称直接访问
  • Service 四种类型

    表格

    类型作用场景
    ClusterIP(默认) 仅集群内部访问,虚拟 IP 微服务内部互相调用
    NodePort 节点端口暴露,节点 IP + 端口访问 测试、简单对外暴露
    LoadBalancer 对接云厂商负载均衡 公有云环境对外提供服务
    ExternalName 映射外部服务 对接集群外地址

    访问逻辑

    客户端 → Service (ClusterIP) → kube-proxy → 后端多个 Pod(轮询负载)


    4. ConfigMap / Secret(配置 & 密钥)

    ConfigMap

    存放明文配置:配置文件、环境变量、启动参数

    • 解耦镜像和配置,配置变更不用重新打包镜像
    • 可挂载为文件、也可注入环境变量

    Secret

    存放敏感数据:密码、密钥、Token、证书

    • 数据 Base64 编码(非强加密,配合权限控制)
    • 用法同 ConfigMap,专门用于保密信息

    5. Volume 存储卷

    容器磁盘是临时的:容器删除数据丢失。Volume 实现数据持久化。

    常用卷类型

  • emptyDir:临时空目录,Pod 内共享,Pod 删除数据丢失
  • hostPath:映射 Node 本地目录,节点级持久化
  • PV / PVC(生产核心):集群持久化存储
    • PV:集群存储资源(由管理员创建)
    • PVC:存储申请(用户声明需要多大存储)
    • 解耦应用和底层存储,对接 NFS、Ceph、云盘等
  • 6. StatefulSet(有状态应用)

    专门管理有状态应用:MySQL、Redis、ZK、Elasticsearch 等 特点:

    • Pod 名称、IP、域名稳定不变
    • 有序创建、有序删除
    • 稳定持久化存储(Pod 重建仍绑定原存储)

    区分: 无状态 → Deployment 有状态 → StatefulSet

    7. DaemonSet

    在每一个 Node 上运行一个 Pod 典型场景:

    • 节点日志收集(Filebeat)
    • 节点监控(Prometheus Node-exporter)
    • 网络插件、安全代理

    8. Namespace 命名空间

    集群资源隔离,逻辑划分集群:

    • 多环境隔离:dev /test/prod
    • 多团队隔离
    • 资源配额、权限隔离

    默认命名空间:default、kube-system(系统组件)

    四、核心命令 kubectl(客户端工具)

    kubectl 是操作 K8s 的命令行工具,必背常用命令

    1. 基础查看

    # 查看集群节点
    kubectl get nodes

    # 查看所有命名空间
    kubectl get ns

    # 查看 Pod(默认default空间)
    kubectl get pods
    # 查看所有命名空间Pod
    kubectl get pods -A
    # 查看Pod详情(排错首选)
    kubectl describe pod <pod-name>

    # 查看 Deployment
    kubectl get deploy

    # 查看 Service
    kubectl get svc

    2. 创建 / 应用资源

    # 从YAML创建资源
    kubectl apply -f xxx.yaml

    # 递归应用整个目录YAML
    kubectl apply -f ./dir/

    3. 日志 & 进入容器

    # 查看Pod日志
    kubectl logs <pod-name>
    # 实时日志
    kubectl logs -f <pod-name>

    # 进入Pod容器
    kubectl exec -it <pod-name> — /bin/bash

    4. 扩缩容

    # 副本扩容到5个
    kubectl scale deploy nginx-demo –replicas=5

    5. 发布 & 回滚

    # 查看发布历史
    kubectl rollout history deploy nginx-demo

    # 回滚上一版本
    kubectl rollout undo deploy nginx-demo

    6. 删除资源

    kubectl delete pod <pod-name>
    kubectl delete -f xxx.yaml

    五、网络模型(K8s 网络四大准则)

    K8s 强制网络模型,所有 CNI 网络插件必须遵守:

  • 所有 Pod 可以直接互相通信,不使用 NAT
  • Node 和 Pod 可以直接通信
  • Pod 看到的自身 IP 和其他 Pod 访问的 IP 一致
  • 主流 CNI 网络插件

    负责集群容器网络实现:

    • Calico:生产最常用,支持网络策略、IP 池、路由
    • Flannel:简单轻量,适合测试 / 小型集群
    • Weave、Canal 等

    网络访问链路

  • Pod 内部互通 → 同节点直接通信
  • 跨节点 Pod → 经过 CNI 网络转发
  • Pod 访问 Service → ClusterIP + kube-proxy 负载均衡
  • 外部访问集群 → NodePort / LoadBalancer / 网关
  • 六、资源管理:Request & Limit

    限制 Pod CPU / 内存,避免资源抢占,生产必配置。

    • requests:Pod 最小需要资源(调度依据)
    • limits:Pod 最大可用资源(超过会被限制 / 杀死)

    单位:

    • CPU:100m = 0.1 核
    • 内存:Mi / Gi

    示例片段:

    yaml

    resources:
    requests:
    cpu: 100m
    memory: 256Mi
    limits:
    cpu: 500m
    memory: 512Mi

    七、自愈 & 调度机制

    1. 自愈能力

  • Pod 容器崩溃 → kubelet 重启容器
  • 节点宕机 → 控制器将 Pod 调度到其他健康节点
  • 副本数不足 → 自动新建 Pod
  • 2. 调度进阶

    • 节点亲和性 / Pod 亲和性:指定 Pod 跑在特定节点 / 和哪些 Pod 在一起
    • 污点 (Taint) & 容忍 (Toleration):节点排斥 Pod,特殊用途节点(Master 禁止运行业务)

    八、集群部署环境分类

  • 单机测试环境

    • minikube:单节点 K8s,本地测试
    • k3s:轻量 K8s,资源占用极低,边缘 / 测试首选
  • 正式集群

    • kubeadm:官方部署工具,手动搭建标准集群(学习主流)
    • 云厂商托管 K8s:ACK、EKS、GKE(开箱即用,免运维 Master)
  • 九、K8s 完整工作流程(举例:发布 Nginx)

  • 编写 Deployment YAML,声明 3 副本 Nginx
  • kubectl apply 提交到 apiserver,存入 etcd
  • Scheduler 选合适 Node
  • 对应 Node 的 kubelet 发现新 Pod,调用容器运行时拉取镜像、启动容器
  • kube-proxy 配置 Service 网络规则
  • 控制器持续巡检,保证始终 3 个副本
  • 客户端通过 Service 名称 / ClusterIP 访问应用
  • 十、K8s 生态体系(云原生全家桶)

    • 镜像仓库:Harbor
    • CI/CD:Jenkins、GitLab CI、ArgoCD
    • 监控:Prometheus + Grafana
    • 日志:ELK、Loki
    • 服务网格:Istio(流量治理、灰度、熔断)
    • 安全:OPA、Trivy
    • 存储:Rook、CSI 驱动对接各类存储

    十一、优缺点总结

    优点

  • 自动化程度极高,大幅降低运维成本
  • 故障自愈,业务高可用
  • 标准化容器编排,跨环境、跨云迁移
  • 丰富生态,完整云原生解决方案
  • 缺点

  • 架构复杂,学习曲线陡峭
  • 小规模应用部署略显笨重
  • 对运维人员技术要求高
  • 十二、k8s安装(基于centos7)

    1. 基础环境配置(所有节点)

    1.1 关闭防火墙 & SELinux

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld

    # 临时关闭SELinux
    setenforce 0
    # 永久关闭
    sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

    1.2 关闭 Swap 交换分区(K8s 强制要求)

    # 临时关闭
    swapoff -a
    # 永久注释 fstab 中的 swap
    sed -i '/swap/s/^/#/' /etc/fstab

    1.3 加载内核模块(容器网络依赖)

    modprobe overlay
    modprobe br_netfilter

    # 配置内核参数,开启IP转发
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward = 1
    EOF

    # 生效配置
    sysctl –system

    1.4 主机名 & 域名解析

    # Master节点执行
    hostnamectl set-hostname k8s-master
    # Node1执行
    hostnamectl set-hostname k8s-node01
    # Node2执行
    hostnamectl set-hostname k8s-node02

    # 所有节点配置hosts解析
    cat >> /etc/hosts << EOF
    192.168.1.100 k8s-master
    192.168.1.101 k8s-node01
    192.168.1.102 k8s-node02
    EOF

    2. 安装 Docker(所有节点)

    K8s 1.24+ 不再默认支持 Docker,本文选用 K8s 1.23 + Docker 稳定组合

    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2

    # 配置Docker阿里源
    yum-config-manager –add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    # 安装Docker
    yum install -y docker-ce docker-ce-cli containerd.io

    # 启动开机自启
    systemctl start docker
    systemctl enable docker

    # 配置Docker镜像加速(阿里云镜像)
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json << EOF
    {
    "registry-mirrors": ["https://mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
    }
    EOF

    # 重启Docker
    systemctl daemon-reload
    systemctl restart docker

    # 验证
    docker –version

    3. 安装 Kubeadm、kubelet、kubectl(所有节点)

    3.1 配置 K8s 阿里 YUM 源

    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF

    3.2 安装指定版本(1.23.17 稳定版)

    yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17

    # kubelet 设置开机自启(暂时不启动,集群初始化后自动运行)
    systemctl enable kubelet

    三、初始化 K8s 集群(仅 Master 节点执行)

    1. kubeadm 初始化集群

    kubeadm init \\
    –apiserver-advertise-address=192.168.1.100 \\
    –image-repository registry.aliyuncs.com/google_containers \\
    –kubernetes-version v1.23.17 \\
    –service-cidr=10.96.0.0/12 \\
    –pod-network-cidr=10.244.0.0/16

    参数说明

    • apiserver-advertise-address:Master 本机 IP
    • image-repository:使用阿里云镜像仓库(替代国外镜像)
    • kubernetes-version:K8s 版本,和安装包一致
    • service-cidr:Service 网段
    • pod-network-cidr:Pod 网段(适配 Flannel 网络插件)

    1. [WARNING Swap]: swap is enabled

    K8s 要求必须关闭 swap,否则 kubelet 会启动失败。

    # 临时关闭swap
    swapoff -a

    # 永久关闭(注释掉/etc/fstab里的swap行)
    sed -i '/swap/s/^/#/' /etc/fstab

    2. [WARNING Service-Kubelet]: kubelet service is not enabled

    kubelet 必须设置开机自启,否则重启机器后节点会失联。

    systemctl enable kubelet.service

    3. [WARNING Docker version is not validated: 26.1.4

    K8s 1.23 官方验证的 Docker 最高版本是 20.10.x,你用的 26.1.4 太新了,可能存在兼容性问题,导致节点 NotReady。

    解决方案: 降级到兼容的版本(推荐 20.10.x)

    # 先卸载当前高版本docker
    yum remove -y docker-ce docker-ce-cli containerd.io
    rm -rf /var/lib/docker /var/lib/containerd

    # 安装兼容的20.10版本
    yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io
    systemctl enable docker
    systemctl start docker

    备选方案:改用 containerd 作为容器运行时,避免 docker 版本兼容问题。

    4. [WARNING Hostname]: hostname "ansible-control" could not be reached

    系统无法解析主机名 ansible-control,会影响集群内部通信。

    # 把主机名和IP写入/etc/hosts(替换成你的真实IP)
    echo "192.168.1.100 ansible-control" >> /etc/hosts

    2. 执行成功后,保存输出信息

    执行成功会输出节点加入命令、kubectl 配置命令,依次执行:

    # 配置kubectl权限(当前用户使用kubectl)
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    3. 安装网络插件 Flannel(集群必备,仅 Master)

    没有网络插件,Pod 之间无法通信,节点状态会 NotReady

    # 应用Flannel网络yaml
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

    4. Node 节点加入集群(所有 Node 节点执行)

    使用 kubeadm init 输出的 join 命令,示例(以你实际输出为准):

    kubeadm join 192.168.1.100:6443 –token xxxxxx \\
    –discovery-token-ca-hash sha256:xxxxxx

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

    5. 集群状态验证(Master 执行)

    # 查看节点状态,全部 Ready 即为正常
    kubectl get nodes

    # 查看集群所有组件状态
    kubectl get cs


    四、K8s 实战案例(循序渐进)

    案例 1:基础 Pod 管理(最小单元)

    1. 手动创建 Pod(临时测试)

    bash

    运行

    # 运行一个Nginx Pod
    kubectl run nginx-pod –image=nginx:alpine –restart=Never

    # 查看Pod
    kubectl get pods

    # 查看Pod详情(排错用)
    kubectl describe pod nginx-pod

    # 进入Pod容器
    kubectl exec -it nginx-pod — /bin/sh

    # 删除Pod
    kubectl delete pod nginx-pod

    2. YAML 方式创建 Pod(生产标准)

    新建 pod-nginx.yaml

    yaml

    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-pod-yaml
    labels:
    app: nginx
    spec:
    containers:
    – name: nginx
    image: nginx:alpine
    ports:
    – containerPort: 80

    执行命令:

    bash

    运行

    # 创建资源
    kubectl apply -f pod-nginx.yaml

    # 查看
    kubectl get pods

    # 删除
    kubectl delete -f pod-nginx.yaml


    案例 2:Deployment 部署无状态应用(生产主流)

    Deployment 保证 Pod 副本数、自动重启、滚动更新。

    1. 编写 deploy-nginx.yaml

    yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deploy
    namespace: default
    spec:
    replicas: 3 # 副本数,启动3个Nginx Pod
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    – name: nginx
    image: nginx:alpine
    ports:
    – containerPort: 80

    2. 执行 & 验证

    bash

    运行

    # 创建Deployment
    kubectl apply -f deploy-nginx.yaml

    # 查看Deployment
    kubectl get deployments

    # 查看Pod(3个副本)
    kubectl get pods -o wide

    3. 扩缩容演示

    bash

    运行

    # 在线扩容到5个副本
    kubectl scale deployment nginx-deploy –replicas=5

    # 缩容到2个
    kubectl scale deployment nginx-deploy –replicas=2

    4. 滚动更新(镜像升级)

    bash

    运行

    # 直接更新镜像版本
    kubectl set image deployment/nginx-deploy nginx=nginx:1.21-alpine

    # 查看更新状态
    kubectl rollout status deployment nginx-deploy

    # 回滚版本
    kubectl rollout undo deployment nginx-deploy


    案例 3:Service 暴露应用(外部访问 Pod)

    Pod IP 动态变化,Service 提供固定访问入口,分三种常用类型:

    • ClusterIP:集群内部访问(默认)
    • NodePort:节点端口暴露,外部机器可访问
    • LoadBalancer:云厂商负载均衡

    这里使用 NodePort 实现外网访问 Nginx。

    1. 编写 svc-nginx.yaml

    yaml

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-svc
    spec:
    type: NodePort # 节点端口模式
    selector:
    app: nginx # 关联上面Deployment的Pod标签
    ports:
    – port: 80 # Service内部端口
    targetPort: 80 # 容器端口
    nodePort: 30080 # 节点端口(范围30000-32767)

    2. 创建 & 访问测试

    bash

    运行

    kubectl apply -f svc-nginx.yaml

    # 查看Service
    kubectl get svc

    访问方式 浏览器 /curl 访问任意节点 IP + 30080

    bash

    运行

    curl 192.168.1.100:30080
    curl 192.168.1.101:30080

    所有节点同一端口均可访问,K8s 自动负载均衡。


    案例 4:Namespace 资源隔离

    多项目 / 多环境(开发、测试、生产)用 Namespace 隔离资源。

    bash

    运行

    # 1. 创建命名空间 dev
    kubectl create namespace dev

    # 2. 在dev命名空间创建Nginx Pod
    kubectl run nginx-dev –image=nginx:alpine -n dev

    # 3. 查看所有命名空间
    kubectl get ns

    # 4. 查看dev空间下的Pod
    kubectl get pods -n dev

    # 5. 切换默认命名空间(可选)
    kubectl config set-context –current –namespace=dev

    # 6. 删除命名空间(会删除空间内所有资源)
    kubectl delete namespace dev


    五、常用排查命令(运维必备)

    bash

    运行

    # 查看所有资源
    kubectl get all

    # 查看Pod日志(排查应用报错)
    kubectl logs 【pod名称】

    # 实时查看日志
    kubectl logs -f 【pod名称】

    # 节点问题排查
    kubectl describe node 【节点名】

    # 临时进入Pod排错
    kubectl exec -it 【pod名称】 — /bin/sh


    六、集群重置(重装 / 出问题时使用)

    所有节点执行:

    # Master重置
    kubeadm reset -f

    # 删除网卡、目录
    rm -rf /etc/cni/net.d
    rm -rf $HOME/.kube

    Kubeadm、kubelet、kubectl

    1. kubeadm

    作用:快速搭建、维护 K8s 集群的工具 专门用来做集群初始化、节点入网,不负责日常业务管理。

    常用场景 & 命令

  • 初始化 Master 控制节点(搭建集群第一步)
  • kubeadm init

    执行后会生成集群配置、证书、join 加入命令。

  • 生成 Worker 节点加入命令
  • bash

    运行

    kubeadm token create –print-join-command

  • 新节点加入现有集群(所有从节点执行)
  • bash

    运行

    kubeadm join 主节点IP:6443 –token xxx –discovery-token-ca-cert-hash xxx

  • 集群升级、重置、修复等运维操作也用它。
  • 一句话记:kubeadm = 集群安装工,只管「搭集群、加节点」。


    2. kubelet

    作用:每个节点上的「代理服务」,常驻后台进程

    • 运行在所有 Master、Worker 节点,系统服务(systemd 管理)
    • 是 Pod / 容器 的直接管理者,K8s 调度器把 Pod 派到当前节点后,全由 kubelet 负责落地

    核心工作

  • 和 kube-apiserver 通信,接收集群指令;
  • 调用容器运行时(Docker/containerd)创建、启动、停止容器;
  • 监控 Pod 状态,异常就上报、配合集群自愈重建;
  • 管理节点上的卷、网络、日志等。
  • 查看状态命令

    bash

    运行

    # 查看运行状态
    systemctl status kubelet
    # 开机自启(安装后默认开启)
    systemctl enable kubelet

    一句话记:kubelet = 节点管家,守着本机所有容器,7×24 跑,不能停。


    3. kubectl

    作用:K8s 集群的「命令行客户端」 相当于集群的管理入口,90% 日常操作都用它。

    核心能力

    通过调用 kube-apiserver,增删改查集群所有资源:

    • 命名空间、Pod、Deployment、Service、节点、权限等

    高频命令举例

    bash

    运行

    # 查看节点
    kubectl get nodes
    # 查看Pod
    kubectl get pods
    # 创建/应用配置文件
    kubectl apply -f xxx.yaml
    # 扩缩容、滚动更新、日志、进入容器等

    一句话记:kubectl = 集群操作台,你和集群交互的主要工具。


    三、三者协作流程(串起整个集群)

  • 用 kubeadm 初始化 Master、把所有机器加入集群;
  • 每个节点启动 kubelet 后台服务,待命接管容器;
  • 你在任意一台装有 kubectl 的机器上,执行 kubectl 命令下发指令;
  • 指令经过 apiserver → 调度器分配节点 → 目标节点的 kubelet 最终创建 / 管理容器。

  • 四、关键区别速查表

    表格

    工具类型运行形态主要用途
    kubeadm 集群部署工具 临时执行,用完即退 初始化集群、节点入网、集群运维
    kubelet 系统服务进程 常驻后台,持续运行 管理本机 Pod / 容器,节点核心
    kubectl 客户端命令 交互式执行 日常管理集群所有资源

    赞(0)
    未经允许不得转载:171主机测评 » Kubernetes(K8s)超详细讲解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址