0
点赞
收藏
分享

微信扫一扫

第六章kubernets架构原理与集群环境部署

金牛豆豆 06-26 12:00 阅读 8

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,实现负载均衡(如ClusterIPNodePort类型)。
  • 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驱动)

操作步骤

命令

安装依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

添加Docker源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装Docker CE

yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

配置cgroup驱动(关键!)

`mkdir /etc/docker && cat <<EOF

{ "exec-opts": ["native.cgroupdriver=systemd"] }


EOF`


启动Docker并设置开机自启

systemctl start docker && systemctl enable 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 \  # 阿里云镜像加速

关键参数说明表

参数名称

作用

--apiserver-advertise-address

指定Master对外暴露的IP,避免绑定到错误网卡

--pod-network-cidr

定义Pod网络地址段,需与后续网络插件(如Flannel)配置一致

--image-repository

国内镜像加速,避免拉取官方镜像失败

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必须关闭

swap未关闭

执行swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

Failed to pull image

镜像拉取失败

使用阿里云镜像加速(如初始化时加--image-repository参数)

cgroup: "systemd" not found

Docker cgroup驱动错误

检查/etc/docker/daemon.json是否配置"native.cgroupdriver=systemd"

Node未Ready,状态为NotReady

网络插件未安装

确保执行kubectl apply -f kube-flannel.yml

注意事项

  • 版本一致性:所有节点的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 数据。
  • 解决:
  1. 检查 Pod 日志:kubectl logs -n kube-system <metrics-server-pod-name>
  2. 确认 Worker 节点 10250 端口可被 Master 访问:curl <Worker-IP>:10250/metrics
  3. 若使用自定义 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:端口

举报

相关推荐

PTA第六章

第六章 BOM

第六章 容器

第六章:接口

第六章总结

第六章 初识MyBatis

0 条评论