目录
一、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 <none> 2m30s v1.19.4
k8s-node02 NotReady <none> 21s v1.19.4
# Pods status (CoreDNS pending)
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-7sw19 0/1 Pending 0 3m58s
kube-system coredns-6d8c4cb4d-rr1pp 0/1 Pending 0 3m58s
[...other system pods running...]
因为此时还没安装网络插件,coredns 无法获得解析的 IP,就会使得 coredns 处于 pending 状态。各个节点的状态也处于 NotReady 的状态,这些异常情况待安装过网络插件后都会自行解决。
部署 calico 网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
备注:
也可以提前下载好 calica 的资源清单直接部署
[root@k8s-master ~]# kubectl create -f calico.yaml
# 查看集群节点状态(全部Ready)
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 22h v1.23.0
k8s-node01 Ready <none> 22h v1.23.0
k8s-node02 Ready <none> 22h v1.23.0
# 查看所有命名空间的Pod状态
kubectl get pod --all-namespaces
五:Metrics-server 部署
Metrics Server 是一种可扩展、高效的容器资源指标来源,适用于 Kubernetes 内置的自动缩放管道。Metrics Server 从 Kubelets 收集资源指标,并通过 Metrics API 将它们暴露在 Kubernetesapiserver 中,供 Horizontal Pod Autoscaler 和 Vertical Pod Autoscaler 使用。指标 API 也可以通过 访问 kubectl top,从而更容易调试自动缩放管道。
Metrics Server 对集群和网络配置有特定的要求。这些要求并不是所有集群分布的默认要求。在使用 Metrics server 之前,请确保您的集群分布支持这些要求:
- kube-apiserver 必须启用聚合层。
- 节点必须启用 webhook 身份验证和授权。
- Kubelet 证书需要由集群证书颁发机构签名(或通过传递--kubelet-insecure-tls 给Metrics Server 来禁用证书验证)注意这里是重点,如果本地没有签名需要传递 args:"--kubelet-insecure-tls"给Metrics Server
- 容器运行时必须实现容器指标RPC(或具有cAdvisor 支持)
- 网络应支持以下通信:
- 控制平面到指标服务器。控制平面节点需要到达 Metrics Server 的 pod IP 和端口10250(或节点 IP 和自定义端口,如果 hostNetwork 已启用)
- 所有节点上的 Kubelet 的指标服务器。指标服务器需要到达节点地址和 Kubelet 端口。地址和端口在Kubelet中配置并作为Node 对象的一部分发布。字段中的地址.status.addresses 和端口.status.daemonEndpoints.kubeletEndpoint.port(默认 10250)。Metrics Server 将根据 kubelet-preferred-address-types 命令行标志(InternalIP,ExternalIP,Hostname 清单中的默认值)提供的列表选择第一个节点地址
源码位置:
metrics-server的github 地址:https://github.com/kubernetes-sigs/metrics-server
Metrics Server 版本 | Metrics API 组/版本 | 支持的 Kubernetes 版本范围 | 备注 |
---|---|---|---|
0.6.x | metrics.k8s.io/v1beta1 |
1.19+ | 最新稳定版本,推荐新集群使用 |
0.5.x | metrics.k8s.io/v1beta1 |
1.8+ | 兼容性广,适合旧版本集群 |
0.4.x | metrics.k8s.io/v1beta1 |
1.8+ | 已逐步淘汰 |
0.3.x | metrics.k8s.io/v1beta1 |
1.8-1.21 | 仅适用于历史版本集群 |
下载Metrics-server 的yaml 文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yamI
修改 yaml 文件并安装
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- name: metrics-server
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.3
args:
- --kubelet-insecure-tls
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
测试安装结果
kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 99m 4% 1201Mi 31%
k8s-node01 57m 2% 1597Mi 42%
k8s-node02 37m 3% 616Mi 16%
kubectl top pod -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system calico-kube-controllers-64cc74d646-vtjgc 1m 27Mi
kube-system calico-node-jswkq 17m 156Mi
kube-system calico-node-kfcr7 18m 169Mi
kube-system calico-node-srz8f 15m 161Mi
kube-system coredns-6d8c4cb4d-gggss 2m 64Mi
kube-system coredns-6d8c4cb4d-l6plx 2m 21Mi
kube-system etcd-k8s-master 14m 64Mi
kube-system kube-apiserver-k8s-master 37m 361Mi
kube-system kube-controller-manager-k8s-master 9m 55Mi
kube-system kube-proxy-4vndc 1m 23Mi
kube-system kube-proxy-5dg8m 1m 69Mi
kube-system kube-proxy-tbqkz 1m 24Mi
kube-system kube-scheduler-k8s-master 3m 25Mi
kube-system metrics-server-66bdc46d86-4mfgw 3m 25Mi
六:Kuboard 部署
功能模块 | 核心能力 | 用户价值 |
---|---|---|
资源可视化 | • 图形化展示 Pod/Deployment/Service/Node 等资源状态 • 拓扑关系展示(如 Deployment→ReplicaSet→Pod) |
无需记忆命令,快速掌握集群状态和应用架构 |
监控与运维 | • 实时监控 CPU/内存/网络等指标 • 直接查看 Pod 日志 • 界面一键扩缩容/更新资源 |
提升故障排查效率,简化运维操作 |
多集群管理 | • 统一管理多个集群 • 基于角色的权限控制(RBAC) |
降低多集群管理复杂度,保障安全性 |
应用部署 | • 向导式部署(表单填写) • YAML 文件导入 • 版本管理与灰度发布 |
加速应用交付,支持灵活部署策略 |
部署 Kuboard
# (1) 安装kuboard插件
[root@localhost ~]# kubectl apply -f kuboard-v3.yaml
# (2) 查看dashboard状态
[root@localhost ~]# kubectl get pods -n kuboard
# (3) 查看service暴露端口
[root@localhost ~]# kubectl get svc -n kuboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kuboard-v3 NodePort 10.1.236.103 <none> 80:30080/TCP,10081:30081/TCP,10081:30081/UDP 4m42s
访问测试
浏览器访问 http://<Kubernetes 集群任意节点的 IP>:30080
用户名: admin
密码: Kuboard123
七:安装 helm 客户端
# (1) 下载安装包
[root@localhost ~]# wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz
# (2) 解压
[root@localhost ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz
# (3) 安装
[root@localhost ~]# mv linux-amd64/helm /usr/local/bin/
# (4) 查看版本
[root@localhost ~]# helm version
version.BuildInfo{Version:"v3.9.4", GitCommit:"ee407bdf364942bcb8e8665f82e15aa28009b71", GitTreeState:"clean", GoVersion:"go1.16.5"}
小技巧:
在使用 kubectl 命令的时候,如果觉得单词不好打,可以设置一个别名:
[root@localhost ~]# vim ~/.bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ku='kubectl'
重启后生效
关闭所有的节点,为实验环境做快照,所有的节点都做快照,
八:测试
# nginx-service.yaml 完整内容
apiVersion: v1
kind: Service
metadata:
name: mynginx
namespace: default
labels:
app: mynginx
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mynginx-deployment
namespace: default
labels:
app: mynginx
spec:
replicas: 2
selector:
matchLabels:
app: mynginx
template:
metadata:
labels:
app: mynginx
spec:
containers:
- name: mynginx
image: nginx:1.7.9
ports:
- name: http
containerPort: 80
protocol: TCP
# 部署应用
[root@localhost ~]# kubectl apply -f nginx-service.yaml
# 检查部署状态
[root@localhost ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deployment-6ddb8c4786-rt24d 1/1 Running 0 66s
mynginx-deployment-6ddb8c4786-tn2cq 1/1 Running 0 66s
# 查看服务状态
[root@localhost ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m39s
mynginx LoadBalancer 10.97.243.236 <pending> 80:31050/TCP 69s
用宿主机浏览器访问: