a.kubernets基本概念和功能
1)Kubernetes概念
简单来说,Kubernetes(K8s)是一个容器编排平台,用来自动化管理容器化应用的部署、扩展、调度和生命周期。
核心目标:让部署容器化应用像管理物理服务器一样简单,甚至更高效。
关键词:容器编排、微服务、弹性扩缩、自愈能力。
2)背景与起源
起源背景
时间线 | 关键事件 |
2000年代 | Google内部用Borg系统管理超大规模容器集群,积累十余年编排经验。 |
2013年 | Docker开源,容器化爆发,但缺少大规模管理方案(手动部署、扩缩容困难)。 |
2014年 | Google开源Kubernetes,基于Borg设计,联合RedHat、Docker等成立社区。 |
2015年 | 成立CNCF(云原生计算基金会),K8s成为核心项目,逐步替代Docker Swarm。 |
解决的核心问题
传统部署痛点:
- 容器多了难管理(IP冲突、服务发现)
- 应用扩容/故障恢复靠手动
- 资源利用率低(服务器闲置或过载)
K8s通过声明式API、自动化调度、弹性伸缩解决这些问题。
3)Kubernetes带来的挑战
虽然强大,但落地需应对以下挑战:
挑战类型 | 具体问题 |
学习成本 | 概念复杂(Pod、Service、Controller等),需理解分布式系统原理。 |
部署运维 | 集群搭建复杂(尤其是高可用Master),需掌握ETCD、网络插件等组件运维。 |
网络复杂性 | 容器间通信、服务网格(如Istio)、南北流量管理需专业知识。 |
监控告警 | 需整合Prometheus、Grafana等工具,构建全链路监控体系。 |
生态选择 | 插件生态丰富(存储、网络、日志),但选型和兼容性需测试(如CSI存储插件)。 |
4)架构解析:Master与Node组件
Master节点核心组件(4个)
组件名称 | 角色描述 | 关键点 |
API Server | 集群唯一入口,处理所有请求(创建Pod、查询状态等)。 | - 基于HTTP/RESTful API - 认证授权(RBAC) - 支持水平扩展 |
Scheduler | 负责将Pod调度到合适的Node节点。 | - 基于调度策略(如资源亲和性、反亲和性) - 可自定义插件 |
Controller Manager | 管理集群状态,包含多个控制器(如ReplicaSet、Service、Namespace控制器)。 | - 自动修复故障(如Pod意外终止后重建) - 控制资源配额、垃圾回收 |
ETCD | 分布式键值存储,保存集群所有数据(配置、状态、元数据)。 | - 高可用部署(至少3节点) - 数据持久化+版本控制 - 强一致性 |
举个例子:当你用kubectl create deployment
创建应用时,流程是:
- 请求先到API Server,数据存入ETCD;
- Scheduler选择Node;
- Controller Manager确保Pod副本数正确;
- Node上的组件接收到指令并执行。
Node节点核心组件(3个)
组件名称 | 角色描述 | 关键点 |
Kubelet | Node的“管家”,负责维护Pod生命周期,与Master通信同步状态。 | - 监控Pod健康(Liveness/Readiness探针) - 拉取镜像、启动容器 |
Kube Proxy | 实现Service的网络代理,负责Pod与Service的流量转发。 | - 支持IPVS/iptables模式 - 负载均衡(轮询、随机等策略) |
Container Runtime | 运行容器的引擎(如Docker、containerd、CRI-O)。 | - 通过CRI(容器运行时接口)与K8s解耦 - 主流默认是containerd |
注意:Node需注册到Master(通过Kubelet配置--apiserver
地址),否则无法调度Pod。
5)Kubernetes网络插件
K8s本身不实现网络,依赖插件解决Pod间通信、Service负载均衡、集群内外流量等问题。
1. 主流网络插件对比
插件名称 | 类型 | 核心特点 | 适用场景 |
Flannel | Overlay | - 简单轻量 - 基于VXLAN封装 - 支持IPv4/IPv6(需配置) | 中小型集群,快速部署 |
Calico | Underlay | - 基于BGP路由或IPIP隧道 - 支持网络策略(NetworkPolicy) - 高性能 | 复杂网络策略,企业级场景 |
Canal | 混合模式 | - Flannel(数据平面)+ Calico(策略平面) - 兼顾简单性与策略控制 | 需流量加密+策略的场景 |
Weave Net | Overlay | - 自动加密通信 - 支持跨云部署 - 轻量级但性能稍低 | 多集群或安全敏感场景 |
2. 核心网络概念
- Pod网络:同一Node内Pod共享网络命名空间,不同Node间通过插件实现互通(如Flannel的VXLAN隧道)。
- Service网络:Kube Proxy将Service IP映射到后端Pod,实现负载均衡(如
ClusterIP
、NodePort
类型)。 - Ingress网络:管理集群外到内部Service的流量(如HTTP/HTTPS路由,需配合Ingress Controller,如NGINX)。
b.kubeadm快速安装kubernets集群
1)环境规划表
节点类型 | IP地址 | 主机名 | CPU/内存 | 系统版本 | 职责 |
Master | 192.168.10.101 | k8s-master | 2核/4GB | CentOS 8 | 控制平面(API/调度等) |
Node1 | 192.168.10.102 | k8s-node1 | 2核/2GB | CentOS 8 | 工作节点 |
Node2 | 192.168.10.103 | k8s-node2 | 2核/2GB | CentOS 8 | 工作节点 |
2)所有节点通用准备步骤
1. 关闭防火墙/SELinux/swap
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭SELinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
# 关闭swap(必须!否则kubeadm会报错)
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
2. 配置系统内核参数(K8s必需)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl --system
3. 安装Docker(使用systemd cgroup驱动)
操作步骤 | 命令 |
安装依赖 |
|
添加Docker源 |
|
安装Docker CE |
|
配置cgroup驱动(关键!) | `mkdir /etc/docker && cat <<EOF |
{ "exec-opts": ["native.cgroupdriver=systemd"] } | |
EOF` | |
启动Docker并设置开机自启 |
|
4. 安装Kubeadm/Kubelet/Kubectl
# 添加K8s官方源(注意:CentOS 8已停止维护,可能需用CentOS Stream源)
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# 安装指定版本(示例:1.28.2,需确保各节点版本一致)
yum install -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2 --disableexcludes=kubernetes
# 启动Kubelet(此时状态会是exited,因为未初始化集群)
systemctl enable kubelet
3)Master节点初始化(192.168.10.101)
1. 执行初始化命令
kubeadm init \
--apiserver-advertise-address=192.168.10.101 \ # 指定Master节点IP
--control-plane-endpoint="k8s-master" \ # 可选:用于高可用的DNS/IP
--node-name=k8s-master \ # 节点名称
--kubernetes-version=1.28.2 \ # 版本号
--pod-network-cidr=10.244.0.0/16 \ # Flannel默认网络段
--image-repository registry.aliyuncs.com/google_containers \ # 阿里云镜像加速
关键参数说明表:
参数名称 | 作用 |
| 指定Master对外暴露的IP,避免绑定到错误网卡 |
| 定义Pod网络地址段,需与后续网络插件(如Flannel)配置一致 |
| 国内镜像加速,避免拉取官方镜像失败 |
2. 初始化成功后配置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. 生成Node节点加入命令(保存以下输出!)
kubeadm token create --print-join-command
# 示例输出(需记录完整命令):
# kubeadm join 192.168.10.101:6443 --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4)Node节点加入集群(102/103节点执行)
1. 重复“通用准备步骤”(关闭防火墙/装Docker/Kubeadm等)
确保Node节点完成:
- 关闭swap/SELinux/防火墙
- 安装Docker(systemd驱动)
- 安装Kubeadm/Kubelet(版本与Master一致)
- 启动Kubelet服务
2. 执行Master生成的join命令
# 替换为实际的join命令(含token和CA哈希)
kubeadm join 192.168.10.101:6443 --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5)安装网络插件(Flannel为例,在Master执行)
# 下载Flannel配置文件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 检查Pod网络是否正常
kubectl get pods -n kube-system | grep flannel
6)验证集群状态(在Master执行)
# 查看节点列表
kubectl get nodes -o wide
# 预期输出:
# NAME STATUS ROLES AGE VERSION INTERNAL-IP OS-IMAGE KERNEL-VERSION
# k8s-master Ready control-plane 10m v1.28.2 192.168.10.101 CentOS 8 5.14.0-284.el8.x86_64
# k8s-node1 Ready <none> 5m v1.28.2 192.168.10.102 CentOS 8 5.14.0-284.el8.x86_64
# k8s-node2 Ready <none> 5m v1.28.2 192.168.10.103 CentOS 8 5.14.0-284.el8.x86_64
7)可能遇到的问题及解决方案
问题现象 | 原因分析 | 解决方法 |
| swap未关闭 | 执行 |
| 镜像拉取失败 | 使用阿里云镜像加速(如初始化时加 |
| Docker cgroup驱动错误 | 检查 |
| 网络插件未安装 | 确保执行 |
注意事项
- 版本一致性:所有节点的Kubeadm/Kubelet版本必须一致(如均为1.28.2)。
- 资源限制:Node节点2GB内存可能在运行复杂应用时紧张,建议至少4GB(或调整Pod资源请求)。
- 生产环境:需额外配置ETCD高可用、Master节点高可用(如使用HAProxy+Keepalived)。
c.metrics-server部署
1)Metrics Server 概念解析
- 定位:Kubernetes 官方推荐的资源指标收集组件,为 HPA(Horizontal Pod Autoscaler)、
kubectl top
等功能提供核心数据支持。 - 作用:周期性采集节点和 Pod 的 CPU、内存使用量,通过 Kubernetes API 公开指标,供其他组件调用。
- 架构:基于
k8s.io/metrics-server
项目,以 Deployment 形式运行,通过 Kubelet API(默认端口10250
)拉取节点和 Pod 指标,支持 HTTPS 认证和聚合 API 集成。
2)部署步骤
前提条件
Kubernetes 集群已就绪:
- Master 节点和 Worker 节点正常运行,
kubectl
可连通集群。 - Kubelet 服务已启动(
systemctl status kubelet
确认)。
防火墙配置:
- 开放 Worker 节点
10250
端口(Kubelet API 端口):
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --reload
步骤 1:下载官方部署清单
# 下载 metrics-server 最新部署 YAML(基于 Kubernetes v1.28 为例)
curl -O https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
步骤 2:修改部署配置
添加安全上下文与启动参数:
- 编辑
components.yaml
,找到spec.containers
部分,添加以下内容:
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server/metrics-server:v0.6.4 # 确保镜像可拉取,若无法访问可替换为国内镜像
args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP # 指定节点 IP 类型
- --kubelet-insecure-tls # 临时绕过 TLS 验证(生产环境建议配置证书)
- --requestheader-allowed-names=""
- --requestheader-client-ca-file=/etc/kubernetes/pki/ca.crt # 使用集群 CA 证书
- --requestheader-extra-headers-prefix="X-Remote-Extra-"
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
步骤 3:部署 Metrics Server
# 应用 YAML 配置
kubectl apply -f components.yaml
# 检查 Pod 状态(等待状态变为 Running)
kubectl get pods -n kube-system -l k8s-app=metrics-server
步骤 4:验证指标采集
查看节点指标:
kubectl top nodes
预期输出:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
worker01 100m 5% 800Mi 20%
master01 150m 7% 1.2Gi 30%
查看 Pod 指标:
kubectl top pods -n <命名空间>
预期输出:
NAME CPU(cores) MEMORY(bytes)
nginx-78d... 50m 200Mi
步骤 5:处理常见问题
- 问题 1:
kubectl top
提示 metrics not available
- 原因:Metrics Server 未正确获取 Kubelet 数据。
- 解决:
- 检查 Pod 日志:
kubectl logs -n kube-system <metrics-server-pod-name>
- 确认 Worker 节点
10250
端口可被 Master 访问:curl <Worker-IP>:10250/metrics
- 若使用自定义 CA 证书,需在 Metrics Server 中挂载证书路径。
- 问题 2:镜像拉取失败
- 解决:使用国内镜像源,例如:
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.4
d.kuboard部署
一、Kuboard概念解析(表格形式)
维度 | 说明 |
定位 | 开源Kubernetes图形化管理工具,提供集群监控、资源管理、日志查看等可视化功能。 |
核心功能 | - 集群状态监控(节点/ Pod/ 资源指标) - 资源对象CRUD(YAML编辑/ 图形化创建) - 服务发现与负载均衡管理 - 日志查看与终端调试 - 插件扩展(如Helm、Ingress管理) |
架构组件 | - 前端:Vue.js构建的可视化界面 - 后端:Go语言开发的API服务 - 数据库:内置SQLite(支持MySQL/ PostgreSQL外置存储) - 代理模块:通过Kubernetes API Server通信,支持RBAC权限控制 |
部署方式 | - 单节点容器部署(推荐Docker) - Kubernetes集群内部署(作为Pod运行) - 支持ARM/ x86架构,提供多平台镜像 |
与其他工具对比 | - 优势:轻量级、中文界面友好、功能集成度高 - 对比KubeUI:功能更全面,支持插件扩展 - 对比Dashboard:操作流程更简化,适合中小型集群管理 |
2)部署步骤
步骤1:拉取Kuboard镜像
# 拉取最新稳定版(当前版本v3.5.1,2025年更新)
docker pull eipwork/kuboard:v3.5.1
# 或国内镜像(若拉取慢):
docker pull registry.cn-hangzhou.aliyuncs.com/kuboard/kuboard:v3.5.1
步骤2:运行Kuboard容器
用Docker命令启动容器,注意挂载数据目录(避免重启后配置丢失):
sudo docker run -d \
--name=kuboard \
-p 8080:8080 \
-v /root/kuboard-data:/data \ # 数据持久化目录
-v /etc/localtime:/etc/localtime:ro \ # 同步系统时间
eipwork/kuboard:v3.5.1
关键参数说明:
-p 8080:8080
:将容器8080端口映射到主机8080端口-v /root/kuboard-data:/data
:挂载数据目录,存储配置和日志- 如果是生产环境,建议添加
-e KUBOARD_PASSWORD=自定义密码
指定登录密码(默认密码Kuboard123
)
步骤3:访问Kuboard界面
容器启动后,在浏览器输入服务器IP:8080,进入初始化界面:
首次登录:默认用户名admin
,密码Kuboard123
(若步骤3自定义了密码,用自定义密码)。
绑定Kubernetes集群:
- 选择“导入Kubeconfig”,将Kubernetes集群的
~/.kube/config
文件内容粘贴到界面中。 - 或选择“自动发现”,确保Kuboard容器能访问集群API Server(通常集群内部署更简单)。
- Kubeconfig文件权限是否正确(需包含证书和访问权限)。
- 服务器是否能ping通Kubernetes API Server地址。
- Kuboard容器是否有权限通过RBAC访问集群(可先尝试绑定集群时勾选“自动创建RBAC权限”)。
步骤4:验证与常用操作
登录后可查看这些功能确认部署成功:
- 集群状态:左侧菜单“集群管理”→“节点”,查看节点在线状态。
- 资源监控:进入具体Pod详情页,查看CPU/内存指标(需先部署Metrics Server,之前讲过的~)。
- 创建资源:尝试用图形化界面创建一个Nginx Deployment,验证YAML编辑和部署功能。
e.安装helm客户端和测试
1)给 kubectl
设别名
vim ~/.bashrc
alias rm='rm -i' # 删除时提示确认,避免误删
alias cp='cp -i' # 复制时提示确认
alias mv='mv -i' # 移动时提示确认
alias ku='kubectl' # 把 `kubectl` 简化为 `ku`!
source ~/.bashrc
2)编写 Nginx 的 Service 配置(nginx-service.yaml
)
vim nginx-service.yaml
apiVersion: v1 # Kubernetes API 版本(Service 用 v1)
kind: Service # 资源类型:Service
metadata:
name: mynginx # Service 的名字
namespace: default # 命名空间(默认是 default)
labels: # 标签(方便后续筛选)
app: mynginx
spec:
type: LoadBalancer # 服务类型:LoadBalancer(云厂商环境会分配公网IP,本地集群自动转 NodePort)
ports:
- port: 80 # 集群内访问的端口
targetPort: http # 转发到 Pod 的端口(**必须和 Pod 里的端口名字一致**)
protocol: TCP # 协议
name: http # 端口名称(和 targetPort 对应,方便识别)
selector: # 标签选择器:匹配带 `app=mynginx` 的 Pod
app: mynginx
3)编写 Nginx 的 Deployment 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: mynginx-deployment # Deployment 名字
labels:
app: mynginx # 标签,和 Service 保持一致
spec:
replicas: 2 # 副本数:2个 Pod(对应图里的两个 Pod)
selector:
matchLabels:
app: mynginx # 匹配 Pod 的标签
template:
metadata:
labels:
app: mynginx # Pod 的标签,和 Service selector 一致
spec:
containers:
- name: mynginx # 容器名字
image: nginx:1.7.9 # 镜像版本(图里的配置)
ports:
- name: http # 端口名字!必须和 Service 的 targetPort 一致
containerPort: 80 # 容器内的端口(Nginx 默认 80)
protocol: TCP
4)部署资源 + 查看状态
ku create -f nginx-service.yaml # 用别名 `ku` 代替 `kubectl`
# 再部署 Deployment(如果有单独的 YAML 文件):
ku create -f nginx-deployment.yaml
NAME READY STATUS RESTARTS AGE
mynginx-deployment-6ddb8c4786-rt24d 1/1 Running 0 66s
mynginx-deployment-6ddb8c4786-tn2cq 1/1 Running 0 66s
http://192.168.10.101:端口