Kubernetes 架构原理与集群环境部署

发布于:2025-07-18 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

一、Kubernetes 的核心优势

二、Kubernetes 的主要挑战

三:Kubernetes 架构解析

1:master 节点的组件

2:Node 节点包含的组件

3:kubernetes 网络插件

四:Kubeadm 快速安装 Kubernetes 集群

1:部署 Kubernetes 集群(注意命令执行的节点)

五:Metrics-server 部署

六:Kuboard 部署

七:安装 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   <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 支持)
  • 网络应支持以下通信:
  1. 控制平面到指标服务器。控制平面节点需要到达 Metrics Server 的 pod IP 和端口10250(或节点 IP 和自定义端口,如果 hostNetwork 已启用)
  2. 所有节点上的 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

用宿主机浏览器访问:

http://192.168.10.101:31050


网站公告

今日签到

点亮在社区的每一天
去签到