Java高级全套教程(十一)------ Kubernetes 超详细企业级实战详解
学习目标
本教程聚焦企业生产实战,全覆盖K8s核心技术栈,完成学习后可独立完成集群搭建、应用部署、服务治理、高可用架构搭建及微服务上云落地,具体掌握要求如下:
-
Kubernetes 基础概念:熟练掌握集群核心组件、资源对象定义、容器编排核心原理
-
Kubernetes 架构:精通Master、Node节点组件功能、通信机制与集群运行逻辑
-
Kubernetes 集群搭建:熟练使用kubeadm搭建单主多节点集群,解决环境适配、网络异常等各类问题
-
部署容器化应用:掌握命令行、YAML清单两种部署方式,熟练配置镜像策略、资源限制、健康检查
-
Dashboard 可视化工具:掌握部署、权限配置、集群可视化运维、资源监控操作
-
Ingress 服务网关:理解端口暴露方案优劣,精通Ingress-Nginx部署、路由规则配置、域名代理实战
-
Helm 包管理工具:掌握仓库配置、Chart创建、模板定制、应用升级与回滚、批量部署方案
-
K8s 高可用集群搭建:掌握多Master节点架构、Keepalived+Haproxy高可用方案、集群故障转移原理
-
K8s 微服务项目部署:掌握微服务容器化打包、镜像推送、集群部署、网关统一接入、生产环境适配方案
第一章 Kubernetes 核心介绍与发展背景
1.1 容器编排技术演进历程
在云计算与微服务普及之前,企业项目部署经历了三次核心架构迭代,每一次迭代都是为了解决资源利用率、部署效率、运维复杂度的核心问题:
第一代:物理机部署
早期企业直接将项目部署在物理服务器,一台物理机运行多个业务应用。核心弊端极其明显:硬件成本高昂、资源无法隔离,单个应用故障会导致整台服务器所有服务瘫痪,扩容、迁移难度极大,完全无法适配互联网快速迭代的业务需求。
第二代:虚拟机部署
为解决物理机资源浪费与隔离性问题,虚拟化技术应运而生(VMware、KVM)。通过在物理机上虚拟出多台独立虚拟机,每台虚拟机搭载完整操作系统,独立部署单个应用。优势是实现了环境隔离,但缺陷突出:虚拟机操作系统占用大量内存、CPU、磁盘资源,启动耗时分钟级,资源冗余严重,批量部署、扩容效率极低。
第三代:容器化部署
容器技术(以Docker为核心)摒弃了完整虚拟机操作系统,仅封装应用运行所需的依赖、库文件与运行环境,内核共享宿主机系统资源。容器具备秒级启动、资源占用极低、环境一致性、可移植性强的核心优势,彻底解决了虚拟机的资源冗余问题,成为云原生应用的基础载体。
第四代:容器编排时代
微服务架构落地后,单一项目会拆分出数十个甚至上百个微服务,对应数百个Docker容器。纯手动管理容器的启动、停止、扩容、故障恢复、负载均衡完全不现实,容器编排工具应运而生,用于自动化批量管理容器生命周期。
1.2 Kubernetes 简介与核心优势
Kubernetes(简称K8s,希腊语意为舵手、领航员),是Google基于内部Borg系统开源的云原生容器编排引擎,使用Go语言开发,2014年正式开源,后捐赠给CNCF云原生计算基金会,目前是容器编排领域的行业标准。
相较于传统容器编排工具(Docker Swarm、Apache Mesos),K8s具备全方位优势:
-
全自动运维:自动故障自愈、自动扩容缩容、滚动更新、版本回滚
-
资源精细化调度:基于CPU、内存、节点标签、亲和性策略智能调度容器
-
高可用高可靠:支持多主集群、故障转移、服务熔断,适配生产高并发场景
-
生态极其完善:拥有海量插件、监控、日志、网关、包管理生态,全覆盖企业运维需求
-
跨平台兼容:支持私有云、公有云、混合云,可无缝迁移部署环境
第二章 Kubernetes 核心架构与组件详解
K8s采用经典的主从架构(Master-Node),集群所有节点分为控制平面(Master)和数据平面(Node),分工明确、解耦彻底,保障集群高效稳定运行。
2.1 Master 控制节点(集群大脑)
Master节点是整个集群的管控核心,负责接收用户操作指令、调度资源、维护集群状态、处理故障,不运行业务容器(生产环境),核心包含四大核心组件,全部支持高可用部署:
2.1.1 kube-apiserver
集群唯一入口,提供RESTful API接口,所有集群操作(创建/删除资源、查询状态)都必须经过该组件。同时是各组件之间的通信枢纽,具备认证、鉴权、限流、资源校验能力,是集群最核心的组件。
2.1.2 etcd
高性能分布式键值对数据库,用于持久化存储集群所有资源状态数据(节点信息、Pod、服务、配置、权限等),支持数据备份与恢复,保证集群数据一致性,仅部署在Master节点。
2.1.3 kube-controller-manager
自动化控制中心,内置多种控制器,持续监控集群资源状态,确保集群实际状态与用户期望状态一致。核心包含:副本控制器、节点控制器、命名空间控制器、服务账号控制器等,实现故障自动修复、资源自动管理。
2.1.4 kube-scheduler
资源调度器,监听未调度的Pod资源,根据节点资源使用率、标签亲和性、污点容忍度、地域策略等多重规则,智能将Pod分配到最优的Node节点,实现集群资源均衡利用。
2.2 Node 工作节点(业务载体)
Node节点是真正运行业务容器的工作节点,接收Master节点的调度指令,执行容器创建、运行、销毁等操作。集群可扩展任意数量的Node节点,单节点故障不会影响整体集群运行,核心包含三大组件:
2.2.1 kubelet
每个Node节点的专属代理组件,直接与Master apiserver通信,负责管理当前节点所有Pod与容器。核心功能:接收调度指令、创建销毁容器、监控容器运行状态、上报节点资源信息、执行健康检查。
2.2.2 kube-proxy
节点网络代理组件,负责实现集群内部Service的负载均衡与网络转发。通过监听集群服务变化,动态更新节点路由规则,实现Pod之间、外部与集群内部的网络通信,支持IPVS、iptables两种转发模式。
2.2.3 容器运行时(Container Runtime)
容器运行环境,负责镜像拉取、容器启停、资源隔离等底层操作。K8s1.24版本前默认支持Docker,新版兼容containerd、CRI-O等主流运行时,是容器运行的底层依赖。
第三章 K8s 集群环境搭建(kubeadm 企业标准方案)
3.1 集群搭建方式对比
| 搭建方式 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 二进制部署 | 高度自定义、无版本绑定 | 步骤繁琐、配置复杂、极易出错 | 大型生产定制化集群 |
| kubeadm | 官方工具、一键部署、配置简洁、稳定性高 | 自定义程度有限 | 学习、中小型生产集群(主流) |
| 云平台一键部署 | 零配置、极速搭建、高可用 | 收费、厂商绑定、灵活性差 | 公有云快速落地场景 |
| 本教程采用kubeadm搭建集群,适配学习与企业生产基础环境,兼顾简单性与规范性。 |
3.2 环境硬件与系统要求
-
操作系统:CentOS 7.9+ / Ubuntu 18.04+(推荐CentOS7)
-
硬件配置:单节点内存≥2G,CPU≥2核,磁盘≥20G
-
网络要求:所有节点内网互通、可访问外网,关闭防火墙与SELinux
-
核心约束:必须关闭swap分区,否则会导致集群调度异常、Pod启动失败
3.3 集群规划
搭建经典单主两节点集群,后续可无缝扩容为高可用多主集群:
-
Master节点:1台,IP:192.168.1.100,主机名:k8s-master
-
Node1节点:1台,IP:192.168.1.101,主机名:k8s-node1
-
Node2节点:1台,IP:192.168.1.102,主机名:k8s-node2
3.4 全局环境初始化(所有节点执行)
所有节点统一执行环境预处理,规避集群搭建常见报错,以下为全套实操命令:
3.4.1 关闭防火墙与SELinux
bash
# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
# 永久关闭SELinux
sed -i 's/^enforcing/disabled/' /etc/selinux/config
setenforce 0
# 验证SELinux状态(确认显示Permissive)
getenforce
3.4.2 永久关闭Swap分区
bash
# 注释所有swap挂载配置
sed -ri 's/.*swap.*/#&/g' /etc/fstab
# 临时关闭swap
swapoff -a
# 验证swap是否关闭(无输出即为成功)
swapon -s
3.4.3 开启网桥转发与IP转发
解决容器跨节点网络通信异常问题,开启内核网络转发参数:
bash
# 写入内核配置
cat > /etc/sysctl.d/k8s-network.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 生效配置
sysctl --system
# 验证内核参数
sysctl net.ipv4.ip_forward
3.4.4 时间同步与主机名配置
bash
# 安装时间同步工具
yum install ntpdate -y
# 同步阿里云时间服务器
ntpdate ntp.aliyun.com
# 设置开机自动时间同步
echo "*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com" >> /var/spool/cron/root
# 分别设置各节点主机名(三台节点分别执行对应命令)
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
# 所有节点配置hosts映射
cat >> /etc/hosts << EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
192.168.1.102 k8s-node2
EOF
# 验证主机名
hostname
3.5 安装Docker容器运行时(所有节点)
3.5.1 配置清华镜像源
bash
# 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置Docker清华yum源
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 更新yum缓存
yum makecache fast
3.5.2 安装Docker并配置国内镜像加速
bash
# 安装稳定版Docker
yum install -y docker-ce docker-ce-cli containerd.io
# 配置Docker国内镜像加速器(阿里云+网易公共镜像)
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 启动并开机自启Docker
systemctl daemon-reload
systemctl start docker
systemctl enable docker
# 验证Docker安装成功
docker --version
docker info
3.6 安装K8s核心组件(所有节点)
3.6.1 配置阿里云K8s yum源
bash
# 新建K8s源文件
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 更新yum缓存
yum makecache fast
3.6.2 安装指定版本K8s组件
统一安装v1.19.4稳定版本,企业生产常用版本,兼容性极强:
bash
# 安装kubeadm、kubelet、kubectl
yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
# 锁定版本,防止自动升级
yum mark hold kubelet kubeadm kubectl
# 开机自启kubelet
systemctl enable kubelet
# 此时kubelet启动失败为正常现象,等待集群初始化后自动恢复
# 验证组件版本
kubeadm version
kubectl version --client
3.7 初始化Master节点(仅主节点执行)
bash
# 初始化K8s主节点
kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
执行成功后,控制台会输出node节点加入集群指令,务必保存,示例如下:
bash
kubeadm join 192.168.1.100:6443 --token xxxxx.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx
3.7.1 配置kubectl管理员权限
bash
# 创建.kube目录
mkdir -p $HOME/.kube
# 复制集群配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 授权当前用户
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证集群状态
kubectl get nodes
kubectl get cs
3.8 加入Node节点(所有从节点执行)
使用Master初始化输出的join指令,将两个Node节点加入集群:
bash
# 节点加入集群(替换为自己的token和hash)
kubeadm join 192.168.1.100:6443 --token xxxxx.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 若token过期,在Master节点重新生成token
kubeadm token create --print-join-command
3.9 安装Flannel网络插件(仅Master执行)
K8s集群默认无网络插件,节点、Pod之间无法通信,必须安装CNI网络插件,这里使用企业常用的Flannel:
bash
# 在线应用Flannel网络配置(国内适配稳定版)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 等待所有网络Pod启动,实时查看集群节点状态
kubectl get nodes -w
# 查看网络插件Pod运行状态
kubectl get pods -n kube-flannel
当所有节点状态变为Ready,代表集群搭建完成!
第四章 K8s 核心基础概念与资源对象
4.1 Pod 核心原理(最小调度单元)
Pod是K8s集群中最小的资源调度单元,不可分割,一个Pod封装一个或多个紧密耦合的业务容器,是容器的上层包装。
4.1.1 Pod 核心特性
-
共享网络栈:同一Pod内所有容器共享IP地址、端口、网络命名空间,容器之间可直接通过localhost通信
-
共享存储卷:同一Pod容器共享挂载的Volume数据卷,实现容器间数据共享
-
生命周期一致:Pod是原子单位,创建则所有容器启动,删除则所有容器销毁,不支持单个容器启停
-
唯一IP:每个Pod拥有集群唯一IP,集群内部通过PodIP通信
4.1.2 Pod 基础实操命令
bash
# 查看所有Pod(默认default命名空间)
kubectl get pods
# 查看所有命名空间Pod
kubectl get pods --all-namespaces
# 查看Pod详细信息(排查异常必备)
kubectl describe pod [Pod名称]
# 进入Pod容器内部
kubectl exec -it [Pod名称] -- /bin/bash
# 查看Pod日志
kubectl logs [Pod名称]
# 强制删除异常Pod
kubectl delete pod [Pod名称] --grace-period=0 --force
4.2 核心控制器(Pod 生命周期管理)
K8s不直接管理Pod,通过控制器实现Pod的批量管理、自愈、扩容、更新,六大核心控制器适配不同业务场景:
4.2.1 ReplicaSet(副本控制器)
核心作用:保证集群中始终维持指定数量的Pod副本,若Pod异常退出、删除,控制器会自动重建;若多余Pod则自动回收。仅负责副本数量维持,不支持版本更新与回滚,现已被Deployment替代。
4.2.2 Deployment(部署控制器,最常用)
企业生产首选控制器,基于ReplicaSet封装,新增大量生产级功能:
-
支持滚动更新:新版本逐步替换旧版本Pod,实现服务零停机更新
-
支持版本回滚:更新异常时一键回退到历史稳定版本
-
支持弹性扩容缩容:动态调整Pod副本数量
-
声明式管理:只需定义期望状态,控制器自动完成运维操作
4.2.3 Deployment 实操命令
bash
# 查看所有部署资源
kubectl get deployments
# 创建Deployment(命令行快速创建)
kubectl create deploy test-nginx --image=nginx:1.21-alpine
# 扩容副本数为5
kubectl scale deployment test-nginx --replicas=5
# 滚动更新镜像
kubectl set image deployment/test-nginx nginx=nginx:1.22-alpine
# 查看更新历史
kubectl rollout history deployment/test-nginx
# 回滚上一个版本
kubectl rollout undo deployment/test-nginx
# 重启部署(重建所有Pod)
kubectl rollout restart deployment/test-nginx
# 删除Deployment
kubectl delete deployment test-nginx
4.2.3 DaemonSet(守护进程控制器)
确保集群每个Node节点仅运行一个指定Pod,新节点加入集群自动创建Pod,节点下线自动回收。主要用于集群全局组件:日志收集、监控采集、网络插件等。
4.2.4 Job & CronJob(任务控制器)
-
Job:一次性任务控制器,保证任务Pod成功执行一次后自动销毁,适用于数据备份、脚本执行等一次性场景
-
CronJob:定时任务控制器,基于Linux cron表达式,周期性执行任务,适用于定时清理日志、定时统计数据等场景
4.2.4 Job/CronJob 实操命令
bash
# 查看任务资源
kubectl get jobs
kubectl get cronjobs
# 创建定时任务(每天凌晨2点执行)
kubectl create cronjob log-clean --image=busybox --schedule="0 2 * * *" -- rm -rf /var/log/*
# 手动触发定时任务
kubectl create job --from=cronjob/log-clean log-clean-manual
# 删除任务
kubectl delete cronjob log-clean
4.3 Service 服务暴露与负载均衡
Pod是临时性资源,重启、扩容后IP会动态变化,无法直接对外提供稳定服务。Service用于为一组Pod提供固定访问入口、负载均衡、服务发现能力,四种类型适配不同场景:
4.3.1 ClusterIP(默认类型)
自动分配集群内部虚拟IP,仅支持集群内部服务访问,默认负载均衡策略,适用于微服务内部互相调用。
4.3.2 NodePort(节点端口)
在所有节点开启固定端口,外部用户可通过「任意节点IP+端口」访问服务,端口范围30000-32767,适用于测试环境服务暴露。
4.3.3 LoadBalancer(负载均衡器)
在NodePort基础上,对接云厂商负载均衡服务,分配独立公网IP,适用于公有云生产环境对外服务。
4.3.4 ExternalName(外部服务映射)
将集群外部域名服务映射到集群内部,实现集群内部直接访问外部第三方服务,无端口、无代理,仅做域名转发。
4.3.5 Service 实操命令
bash
# 查看所有服务
kubectl get svc
# 查看服务详细信息
kubectl describe svc [服务名称]
# 暴露Deployment为NodePort服务
kubectl expose deployment test-nginx --type=NodePort --port=80
# 暴露为ClusterIP服务
kubectl expose deployment test-nginx --type=ClusterIP --port=80
# 删除服务
kubectl delete svc [服务名称]
第五章 K8s 容器化应用部署实战
本章通过YAML资源清单(企业标准方式)部署Nginx、Tomcat、SpringBoot微服务,全程采用声明式部署,包含资源限制、健康检查、镜像策略等生产配置。
5.1 YAML资源清单核心字段详解
所有K8s资源均通过YAML文件定义,核心通用字段:
-
apiVersion:资源API版本,核心资源为v1,控制器资源为apps/v1
-
kind:资源类型(Deployment、Service、Pod等)
-
metadata:元数据,包含资源名称、命名空间、标签、注释
-
spec:期望状态,定义资源运行参数(副本数、镜像、端口、资源限制等)
-
status:实际状态,集群自动生成,无需手动配置
5.1.1 YAML 通用实操命令
bash
# 基于YAML文件创建/更新资源
kubectl apply -f [文件名.yaml]
# 递归应用文件夹下所有YAML
kubectl apply -f ./yaml/
# 查看YAML资源配置
kubectl get [资源类型] [资源名称] -o yaml
# 删除YAML定义的资源
kubectl delete -f [文件名.yaml]
# 校验YAML语法是否正确
kubectl apply -f [文件名.yaml] --dry-run=client
5.2 生产级部署 Nginx 服务
5.2.1 编写部署清单 nginx-deploy.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-web
namespace: default
labels:
app: nginx-web
spec:
replicas: 3 # 启动3个Pod副本
selector:
matchLabels:
app: nginx-web
strategy:
type: RollingUpdate # 滚动更新策略
rollingUpdate:
maxSurge: 1 # 最多超1个副本
maxUnavailable: 0 # 更新时无不可用Pod
template:
metadata:
labels:
app: nginx-web
spec:
containers:
- name: nginx-container
image: nginx:1.21-alpine # 轻量稳定镜像
imagePullPolicy: IfNotPresent # 本地有则不拉取
ports:
- containerPort: 80
# 资源限制(生产必备)
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
# 健康检查(存活+就绪探针)
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5
5.2.2 编写服务暴露清单 nginx-svc.yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-web-svc
namespace: default
spec:
selector:
app: nginx-web
type: NodePort
ports:
- port: 80 # 集群内部端口
targetPort: 80 # 容器端口
nodePort: 30080 # 固定外部访问端口
5.2.3 执行部署与验证
bash
# 部署资源
kubectl apply -f nginx-deploy.yaml
kubectl apply -f nginx-svc.yaml
# 查看部署状态
kubectl get deploy
kubectl get pods
kubectl get svc
# 访问测试:任意节点IP:30080
# 查看Pod挂载、网络详情
kubectl get pods -o wide
5.3 SpringBoot 微服务容器化部署(完整流程)
5.3.1 项目打包与Dockerfile编写
基于JDK8基础镜像,优化镜像分层、减小镜像体积,生产级Dockerfile:
dockerfile
# 基础镜像
FROM openjdk:8-jre-alpine
# 作者信息
MAINTAINER k8s-admin
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 复制jar包
COPY target/demo-k8s-1.0.0.jar /app.jar
# 启动命令
ENTRYPOINT ["java","-jar","/app.jar","--server.port=8080"]
5.3.2 镜像构建与仓库推送
bash
# 构建镜像
docker build -t demo-springboot:1.0 .
# 登录DockerHub/阿里云镜像仓库
docker login
# 镜像打标签并推送(以阿里云镜像仓库为例)
docker tag demo-springboot:1.0 registry.cn-hangzhou.aliyuncs.com/你的仓库名/demo-springboot:1.0
docker push registry.cn-hangzhou.aliyuncs.com/你的仓库名/demo-springboot:1.0
# 查看本地镜像
docker images
5.3.3 K8s生产级部署清单
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-demo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: springboot-demo
template:
metadata:
labels:
app: springboot-demo
spec:
containers:
- name: springboot-demo
image: registry.cn-hangzhou.aliyuncs.com/你的仓库名/demo-springboot:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1000m
memory: 512Mi
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
---
apiVersion: v1
kind: Service
metadata:
name: springboot-demo-svc
spec:
selector:
app: springboot-demo
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30880
bash
# 部署SpringBoot微服务
kubectl apply -f springboot-deploy.yaml
# 验证部署状态
kubectl get deploy springboot-demo
kubectl get pods | grep springboot
kubectl get svc springboot-demo-svc
第六章 K8s Dashboard 可视化运维工具
6.1 Dashboard 核心作用
K8s Dashboard是官方开源Web可视化管理平台,替代繁琐的kubectl命令行操作,支持可视化查看集群资源、部署应用、监控状态、查看日志、管理权限,极大提升运维效率。
6.2 部署 Dashboard(适配v1.19集群)
bash
# 下载官方部署清单
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
# 修改配置:开启NodePort暴露、替换国内镜像(解决外网拉取失败问题)
# 直接应用修改后的配置
kubectl apply -f recommended.yaml
# 查看Dashboard运行状态
kubectl get pods -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
6.3 配置管理员访问权限
默认Dashboard权限受限,创建超级管理员账号,获取访问Token:
bash
# 创建管理员服务账号
kubectl create serviceaccount dashboard-admin -n kube-system
# 绑定集群超级管理员权限
kubectl create clusterrolebinding dashboard-admin-binding \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:dashboard-admin
# 获取登录Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | grep dashboard-admin | awk '{print $1}')
通过Token登录Web界面,即可实现全集群可视化运维。
第七章 Ingress 网关服务实战
7.1 传统服务暴露方案弊端
NodePort方式每个服务独占一个节点端口,微服务数量多会导致端口泛滥、管理混乱、安全性差;LoadBalancer依赖云厂商服务、成本高、耦合性强,均不适合生产环境。
Ingress是生产环境标准服务暴露方案,作为K8s集群网关,统一入口、统一域名、统一流量管控。
7.2 Ingress 核心优势
-
仅暴露一个统一端口,通过域名、路径路由区分不同微服务
-
支持HTTP/HTTPS、域名匹配、路径重写、权重分发、黑白名单
-
自带负载均衡、熔断、限流基础能力,适配微服务架构
-
无云厂商绑定,私有化集群、公有云集群均可使用
7.3 部署 Ingress-Nginx 控制器
bash
# 下载部署清单
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
# 替换国内镜像,修复拉取失败问题,部署组件
kubectl apply -f deploy.yaml
# 查看Ingress运行状态
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
7.4 自定义 Ingress 路由规则
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: micro-service-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: web.demo.com
http:
paths:
- path: /nginx
pathType: Prefix
backend:
service:
name: nginx-web-svc
port:
number: 80
- host: api.demo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: springboot-demo-svc
port:
number: 8080
bash
# 应用Ingress路由规则
kubectl apply -f ingress-rules.yaml
# 查看Ingress配置
kubectl get ingress
kubectl describe ingress micro-service-ingress
配置本地hosts域名映射,即可通过自定义域名访问不同微服务,实现统一网关接入。
第八章 Helm 包管理工具实战
8.1 Helm 核心价值
K8s部署复杂应用需要维护大量YAML文件,手动修改、升级、回滚效率极低、极易出错。Helm是K8s官方包管理工具,类似Linux的yum、Python的pip,通过Chart模板统一管理应用资源,实现应用一键部署、升级、回滚、批量运维。
8.2 Helm 三大核心概念
-
Helm:本地命令行工具,用于管理Chart、部署应用、管理版本
-
Chart:应用安装包,包含所有YAML模板、配置文件,是应用的封装集合
-
Release:Chart部署到集群后的运行实例,一个Chart可生成多个Release
8.3 Helm 安装与国内仓库配置
bash
# 上传解压Helm安装包,配置全局命令
mv linux-amd64/helm /usr/bin/
chmod +x /usr/bin/helm
# 验证Helm安装
helm version
# 添加国内稳定仓库
helm repo add stable https://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库索引
helm repo update
# 搜索仓库应用
helm search repo mysql
helm search repo nginx
8.4 自定义 Chart 模板部署微服务
bash
# 创建自定义Chart模板
helm create micro-chart
# 清空默认模板,自定义微服务模板
rm -rf micro-chart/templates/*
# 生成Deployment、Service模板文件
kubectl create deployment micro-demo --image=demo-springboot:1.0 --dry-run -o yaml > micro-chart/templates/deploy.yaml
kubectl expose deployment micro-demo --port=8080 --type=ClusterIP --dry-run -o yaml > micro-chart/templates/svc.yaml
# 基于模板一键部署
helm install micro-service ./micro-chart
# 查看部署版本
helm list
# 应用升级
helm upgrade micro-service ./micro-chart
# 版本回滚
helm rollback micro-service 1
# 卸载应用
helm uninstall micro-service
第九章 K8s 多Master高可用集群搭建
9.1 高可用架构原理
单Master集群存在单点故障风险,Master节点宕机将导致整个集群无法管控。生产环境采用多Master + Keepalived + Haproxy高可用方案:
-
Haproxy:实现多个Master节点apiserver负载均衡
-
Keepalived:实现虚拟IP(VIP)故障自动漂移,主节点故障自动切换备用节点
-
多Master节点:冗余备份,杜绝单点故障
9.2 高可用核心部署步骤
9.2.1 所有Master节点安装组件
bash
# 安装依赖与高可用组件
yum install -y keepalived haproxy conntrack-tools libseccomp
# 配置开机自启
systemctl enable keepalived haproxy
# 验证组件状态
systemctl status keepalived
systemctl status haproxy
9.2.2 Keepalived 虚拟IP配置
所有Master节点统一配置keepalived.conf,设置VIP为192.168.1.50,实现故障漂移。
bash
# 备份默认配置
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 写入高可用配置
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
router_id K8S-MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {