目录
[一、Kubernetes 的核心优势](#一、Kubernetes 的核心优势)
[二、Kubernetes 的主要挑战](#二、Kubernetes 的主要挑战)
[三:Kubernetes 架构解析](#三:Kubernetes 架构解析)
[1:master 节点的组件](#1:master 节点的组件)
[2:Node 节点包含的组件](#2:Node 节点包含的组件)
[3:kubernetes 网络插件](#3:kubernetes 网络插件)
[四:Kubeadm 快速安装 Kubernetes 集群](#四:Kubeadm 快速安装 Kubernetes 集群)
[1:部署 Kubernetes 集群(注意命令执行的节点)](#1:部署 Kubernetes 集群(注意命令执行的节点))
[五:Metrics-server 部署](#五:Metrics-server 部署)
[六:Kuboard 部署](#六:Kuboard 部署)
[七:安装 helm 客户端](#七:安装 helm 客户端)
一、Kubernetes 的核心优势
简化开发与测试流程
- 日志管理:通过 Kubernetes Dashboard 快速查看多环境日志,无需手动定位容器。
- 发布与回滚:支持蓝绿发布、金丝雀发布等,结合 Jenkins/Git 实现自动化,提升迭代速度。
- 服务网格(Service Mesh):解耦网络逻辑(如负载均衡、限流),开发者专注业务代码。
- 环境隔离:通过不同配置(参数、变量、文件)实现一次构建多环境部署,测试环境一键创建。
运维效率提升
- 自动化运维:
健康检查与自愈:自动处理节点故障,减少人工干预。
弹性扩缩容:一键调整资源,避免传统服务器采购和部署的繁琐流程。
- 标准化与高可用:
容器镜像确保环境一致性,减少依赖冲突。
Ingress 替代复杂 Nginx 配置,Service 自动管理负载均衡。
- 中间件与端口管理:秒级部署高可用中间件集群(如 Redis),统一端口配置避免冲突。
- 成本与资源优化
多环境共享集群资源,按需分配,提高利用率。
减少重复性运维工作,降低人力成本。
二、Kubernetes 的主要挑战
- 学习曲线陡峭
概念复杂(如 Pod、Service、Ingress),需掌握广泛知识(网络、存储、安全)。
初期部署和调试困难,可能需数月才能熟练。
- 运维角色转型
从传统运维转向 DevOps,需了解业务代码、CI/CD 流程,甚至参与开发规范制定。
需持续跟进新技术(如服务网格、Operator 框架)。
- 技术生态整合
与现有工具链(监控、日志收集)的兼容性需额外配置。按an
三:Kubernetes 架构解析
1:master 节点的组件
组件 | 核心功能 | 关键特性 | 与其他组件的交互 |
---|---|---|---|
API Server | 集群网关,提供 REST API 入口,管理资源对象的增删改查 | 唯一直接操作 etcd 的组件,支持水平扩展,负责认证、授权、请求校验 | 接收所有客户端请求(kubectl/Dashboard),其他控制平面组件均通过 API Server 通信 |
Scheduler | 将未调度的 Pod 分配到合适的工作节点 | 基于资源需求(CPU/内存)、亲和性规则调度,支持自定义调度器 | 监听 API Server 的新 Pod 事件,调度后更新 Pod 的节点绑定信息 |
Controller Manager | 运行各类控制器(如 Deployment、Node Controller),确保集群状态符合预期 | 包含多个逻辑独立的控制器,自动修复异常(如重启 Pod、扩缩容) | 通过 API Server 监听资源状态,驱动实际状态向期望状态收敛 |
etcd | 分布式键值存储,持久化保存集群所有状态和配置数据 | 高可用需部署奇数节点,数据一致性要求高(Raft 协议),集群的"唯一真相来源" | 仅由 API Server 直接读写,其他组件通过 API Server 间接访问 etcd |
节点数量 | 容错能力(允许故障节点数) | 说明 | 推荐场景 |
---|---|---|---|
1 | 0 | 单节点无容错,故障即集群不可用 | 仅测试环境 |
3 | 1 | 半数以上(≥2)节点存活即可正常工作,最优性价比 | 生产环境最小部署 |
5 | 2 | 更高容错能力,但写入性能略有下降(需更多节点确认) | 超大规模或高可用要求严格场景 |
偶数(如4) | 1(与3节点相同) | 不推荐,选举或网络分区时可能脑裂,资源浪费(容错能力与3节点相同,但需维护更多节点) | 避免使用 |
2:Node 节点包含的组件
组件 | 核心功能 | 关键特性 | 与其他组件的交互 |
---|---|---|---|
容器运行时 | 运行容器(Pod 内的容器),管理镜像拉取、容器启停等操作 | 支持多种运行时(Docker、containerd、CRI-O),通过 CRI(容器运行时接口)与 Kubernetes 集成 | 由 kubelet 调用,负责实际运行容器 |
kubelet | 节点代理,管理 Pod 生命周期,上报节点状态,确保容器健康运行 | 监听 API Server 的指令,驱动容器运行时执行操作,管理存储卷(CVI)和网络(CNI) | 与 API Server 通信,接收 Pod 调度指令并反馈节点状态 |
kube-proxy | 实现 Service 的负载均衡和网络代理,维护节点网络规则(如 iptables/IPVS) | 为 Pod 提供唯一 IP,支持服务发现和内部通信,确保服务可访问 | 与 API Server 同步 Service 和 Endpoints 信息,动态更新网络规则 |
3:kubernetes 网络插件
特性 | 说明 |
---|---|
项目来源 | 由 CoreOS 开发,被多个 Kubernetes 发行版默认集成 |
数据存储 | 利用集群现有的 etcd 存储状态信息,无需额外存储 |
网络类型 | IPv4 Overlay 网络 |
IP 分配 | 每个节点分配一个子网,节点上的网桥接口为 Pod 分配 IP |
通信方式 | 同一主机 Pod 通过网桥通信;跨主机 Pod 流量封装在 UDP/VXLAN 包中转发 |
后端模式 | 支持 UDP(测试)、VXLAN(推荐)、host-gateway(需二层网络) |
适用场景 | 中小规模集群,简单易用 |
模式类型 | 工作原理 | 依赖条件 | 特点 | 适用场景 |
---|---|---|---|---|
Overlay | 通过隧道封装(如 VXLAN)实现跨主机通信 | 三层网络可达 | 配置简单,性能中等 | 通用场景,跨云/跨机房 |
路由 | 依赖路由表直接转发 | 需底层网络支持路由 | 高性能,但配置复杂 | 对性能要求高的环境 |
桥接 | 通过网桥连接同主机容器 | 仅限同主机通信 | 低开销,无法跨节点 | 单节点测试/开发环境 |
四:Kubeadm 快速安装 Kubernetes 集群
主机名 | IP地址 | 操作系统 | CPU/内存 | 主要软件组件 | 角色 |
---|---|---|---|---|---|
k8s-master | 192.168.10.101 | CentOS7.9 | 2核、4G | Docker CE, Kube-apiserver, Kube-controller-manager, Kube-scheduler, Etcd, Kubelet, Kube-proxy | Master(控制平面) |
k8s-node01 | 192.168.10.102 | CentOS7.9 | 2核、2G | Docker CE, Kubectl, Kube-proxy, Calico | Worker(工作节点) |
k8s-node02 | 192.168.10.103 | CentOS7.9 | 2核、2G | Docker CE, Kubectl, Kube-proxy, Calico | Worker(工作节点) |
正式开始部署 kubernetes 集群之前,先要进行如下准备工作。基础环境相关配置操作在三台主机k8s-master、k8s-node01、k8s-node82 上都需要执行,下面以 k8s-master 主机为例进行操作演示
完成基础环境准备之后,在三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持。以 k8s-master 主机为例进行操作演示,首先安装一些 Docker 的依赖包,然后将Docker 的 YUM 源设置成国内地址,最后通过 YUM 方式安装 Docker 并启动。
1:部署 Kubernetes 集群(注意命令执行的节点)
配置三台主机的主机名
# 主机一(Master节点)
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-master ~]# exec bash
# 主机二(Node01节点)
[root@k8s-node01 ~]# hostnamectl set-hostname k8s-node01
[root@k8s-node01 ~]# exec bash
# 主机三(Node02节点)
[root@k8s-node02 ~]# hostnamectl set-hostname k8s-node02
[root@k8s-node02 ~]# exec bash
在三台主机上绑定 hosts
# 配置集群节点hosts解析
cat <<EOF >> /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
EOF
关闭交换分区
# 禁用swap并永久生效
swapoff -a # 立即关闭swap
sed -i '/swap/s/^/#/' /etc/fstab # 注释掉fstab中的swap条目
配置 Kubernetes 的 YUM 源
操作节点:k8s-master,k8s-node01,k8s-node02
# 配置Kubernetes阿里云镜像源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
# 清理yum缓存
dnf clean all
安装Kubelet、Kubeadm 和 Kubectl
操作节点:k8s-master,k8s-node01,k8s-node02
dnf install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
如果在命令执行过程中出现索引 gpg 检査失败的情况,请使用 yum install -y --nogpgcheck kubelet-1.23.0 kubeadm-1.23.0 kubect1-1.23.0来安装,或者将gpgcheck=1和repo_gpgcheck=1设置为 0
Kubelet 设置开机启动
操作节点:k8s-master,k8s-node01,k8s-node02
systemctl enable kubelet
kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。
生成初始化配置文件
操作节点:k8s-master
kubeadm config print init-defaults > init-config.yaml
Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在 ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配置内容是通过 kubeadm config 命令写入配置文件的。
其中,kubeadm config 除了用于输出配置项到文件中,还提供了其他一些常用功能,如下所示。
- kubeadm config view:查看当前集群中的配置值。
- kubeadm config print join-defaults:输出 kubeadm join 默认参数文件的内容。
- kubeadm config images list:列出所需的镜像列表。
- kubeadm config images pull:拉取镜像到本地。
- kubeadm config upload from-flags:由配置参数生成 ConfigMap。
修改初始化配置文件
操作节点:k8s-master
# init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
localAPIEndpoint:
advertiseAddress: 192.168.10.101
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master
taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.23.6
imageRepository: registry.aliyuncs.com/google_containers
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
apiServer:
timeoutForControlPlane: 4m0s
controllerManager: {}
scheduler: {}
注意:1.24.8 的版本中 apiVersion:kubeadm.k8s.io/v1beta2 被弃用,
serviceSubnet:指定使用 ipvs 网络进行通信,ipvs 称之为 IP 虚拟服务器(IP Virtual server,简写为 IPVS)。是运行在 LVS 下的提供负载平衡功能的一种技术。含义 IPVS 基本上是一种高效的Layer-4交换机
podsubnet 10.244.0.0/16 参数需要和后文中 kube-flannel.yml 中的保持一致,否则,可能会使得 Node 间 Cluster Ip 不通。
默认情况下,每个节点会从 Podsubnet 中注册一个掩码长度为 24 的子网,然后该节点的所有 podip 地址都会从该子网中分配。
拉取所需镜像
操作节点:k8s-master
如果地址无法解析,可以使用阿里的公共 DNS:223.5.5.5 或 223.6.6.6
kubeadm config images list--config init-config.yaml
kubeadm config images pull --config=init-config.yaml
备注:
此步骤是拉取 k8s 所需的镜像,如果已经有离线镜像,可以直接导入,这一步就不需要了
初始化 k8s-master
操作节点:k8s-master
注意:master 节点最少需要2个CPU
kubeadm init --config=init-config.yaml
执行完该命令后一定记下最后生成的 token:
kubeadm join 192.168.10.101:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107
Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如k8s-master 节点上査看节点信息都是"Not Ready"状态、Pod 的 coreDNS 无法提供服务等。
备注:
如果要重复初始化,先重置 kubeadm
root@k8s-master \~\]# kubeadm reset
**复制配置文件到用户的 home 目录**
操作节点:k8s-master
# 配置kubectl访问权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
**node 节点加入集群**
操作节点:k8s-node01、k8s-node02
注意:将master 中生成的 token,直接复制过来即可
kubeadm join 192.168.16.161:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8b17b7d607ab7f79c2249c58d74525368bbb15ad884c365aaa1a968b9833d107
**在 k8s-master 节点设置环境变量并查看节点信息**
# Nodes status (all NotReady)
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 13m v1.19.4
k8s-node01 NotReady