1221 字
6 分钟
Minikube + HPA 弹性伸缩部署实践:openEuler 24.03 LTS SP3
本手册基于 Minikube 单节点集群,所有命令均在 openEuler 24.03 LTS SP3 上验证。
前置提醒:openEuler 24.03 LTS SP3 基于 Linux 6.6 内核开发,主要面向服务器、云和 AI 场景,提供 4 年社区支持。openEuler 以
dnf为主流包管理工具,比yum更现代高效。
一、基础环境配置
1.1 关闭防火墙和 SELinux(避免网络问题)
systemctl stop firewalldsystemctl disable firewalldsetenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config1.2 关闭 swap(K8s 要求)
swapoff -a# 永久关闭,注释 /etc/fstab 中的 swap 行sed -i '/swap/d' /etc/fstab1.3 配置内核参数
# 1. 加载 br_netfilter 内核模块modprobe br_netfilter# 2. 验证模块是否加载成功lsmod | grep br_netfilter
cat > /etc/sysctl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF
# 使内核参数生效sysctl -p /etc/sysctl.d/k8s.conf1.4 安装必要工具
# [openEuler] 使用 dnf 替代 yumdnf install -y yum-utils device-mapper-persistent-data lvm2 wget curl git1.5 代理相关配置(如有)
# 1. 创建或编辑 bashrc 配置文件cat >> ~/.bashrc <<'EOF'
# Proxy settings for minikubeexport HTTP_PROXY="http://192.168.0.1:7897"export HTTPS_PROXY="http://192.168.0.1:7897"export NO_PROXY="localhost,127.0.0.1,0.0.0.0,10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,10.126.126.0/24,.svc,.cluster.local"EOF
# 2. 立即应用配置source ~/.bashrc
# 3. 验证环境变量echo "HTTP_PROXY=$HTTP_PROXY"echo "HTTPS_PROXY=$HTTPS_PROXY"echo "NO_PROXY=$NO_PROXY"二、安装 Docker
2.1 安装 Docker CE
# [openEuler] openEuler 优先使用 dnf 包管理器,但 Docker 官方源基于 CentOS,因此仍使用 yum-config-managerdnf install -y dnf-utils device-mapper-persistent-data lvm2 dnf-plugins-core
# 添加 Docker 官方源dnf config-manager --add-repo=https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
# 备份原始仓库配置文件cp /etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/docker-ce.repo.bak
# 替换仓库配置中的下载地址为华为云镜像站sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#强制指定系统版本为 CentOS 8sed -i 's+$releasever+8+' /etc/yum.repos.d/docker-ce.repo
dnf makecache
# 安装 Docker CEdnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin2.2 配置 Docker
mkdir -p /etc/dockercat > /etc/docker/daemon.json <<EOF{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "proxies": { "http-proxy": "http://192.168.0.1:7897", "https-proxy": "http://192.168.0.1:7897" }}EOF
# 启动 Dockersystemctl enable dockersystemctl start docker2.3 为 Docker 服务配置代理(如需)
mkdir -p /etc/systemd/system/docker.service.dcat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF[Service]Environment="HTTP_PROXY=http://192.168.0.1:7897"Environment="HTTPS_PROXY=http://192.168.0.1:7897"Environment="NO_PROXY=localhost,127.0.0.1,0.0.0.0,10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,10.126.126.0/24,.svc,.cluster.local"EOF
systemctl daemon-reloadsystemctl restart docker2.4 创建普通用户
# 创建用户 k8suseradd -m -s /bin/bash k8s
# 将 k8s 用户添加到 docker 组usermod -aG docker k8s
# 验证id k8s
passwd k8s三、安装 Minikube 和 kubectl
3.1 下载 Minikube 二进制
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/local/bin/minikube3.2 下载 kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl3.3 切换用户并启动 Minikube
su - k8s
# [openEuler] 启动 Minikubeminikube start \ --driver=docker \ --extra-config=apiserver.bind-address=0.0.0.0 \ --docker-env HTTP_PROXY=$HTTP_PROXY \ --docker-env HTTPS_PROXY=$HTTPS_PROXY \ --docker-env NO_PROXY=$NO_PROXY3.4 验证
kubectl cluster-infokubectl get nodes四、准备微服务应用镜像(CPU 密集型)
4.1 创建应用代码
mkdir -p ~/k8s-hpa-demo/appcd ~/k8s-hpa-demo/appapp.py:
from flask import Flaskimport time
app = Flask(__name__)
@app.route('/')def hello(): return "Hello from K8s HPA Demo"
@app.route('/cpu')def cpu_load(): start = time.time() x = 0 while time.time() - start < 0.5: x += 1 for i in range(1000): _ = i * i return f"CPU load done, result={x}"
if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)Dockerfile:
FROM python:3.9-slimWORKDIR /appRUN pip install flaskCOPY app.py .EXPOSE 8080CMD ["python", "app.py"]4.2 构建镜像(切换到 Minikube 内部 Docker 环境)
# 重要eval $(minikube docker-env)docker build -t hpa-demo:latest .五、部署应用到 K8s 并配置 HPA
5.1 创建 Deployment YAML
mkdir -p ~/k8s-hpa-demo/k8scd ~/k8s-hpa-demo/k8sdeployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: hpa-demospec: replicas: 2 selector: matchLabels: app: hpa-demo template: metadata: labels: app: hpa-demo spec: containers: - name: app image: hpa-demo:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"service.yaml:
apiVersion: v1kind: Servicemetadata: name: hpa-demo-svcspec: selector: app: hpa-demo ports: - port: 80 targetPort: 8080 type: NodePorthpa.yaml:
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: hpa-demo-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hpa-demo minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 505.2 部署
kubectl apply -f deployment.yamlkubectl apply -f service.yamlkubectl apply -f hpa.yaml# minikube addons enable metrics-server5.3 验证
kubectl get podskubectl get svckubectl get hpa5.4 获取服务访问地址
minikube service hpa-demo-svc --url# 记录输出的 URL,例如 http://192.168.49.2:31876六、部署 Prometheus+Grafana 监控系统
6.1 安装 Helm
wget https://get.helm.sh/helm-v3.14.0-linux-amd64.tar.gztar -zxvf helm-v3.14.0-linux-amd64.tar.gzsudo mv linux-amd64/helm /usr/bin/helmchmod +x /usr/bin/helmhelm version6.2 添加 Prometheus 社区 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm repo update6.3 安装 kube-prometheus-stack
# 创建监控命名空间kubectl create namespace monitoring
# 安装helm install prometheus prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set grafana.service.type=NodePort \ --set prometheus.service.type=NodePort6.4 等待所有 Pod 就绪
kubectl get pods -n monitoring -w# 等待所有 Pod 状态为 Running6.5 获取 Grafana 访问端口
kubectl get svc -n monitoring | grep grafana# 假设 NodePort 为 30495获取 Grafana 管理员密码:
kubectl get secret -n monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo七、安装压测工具 hey
wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64chmod +x hey_linux_amd64sudo mv hey_linux_amd64 /usr/local/bin/hey八、功能验证:压测触发弹性伸缩
8.1 打开三个终端窗口
终端1:实时监控 Pod 数量
kubectl get pods -w终端2:实时监控 HPA 状态
kubectl get hpa -w终端3:执行压测(替换 URL 为你的服务地址)
hey -z 60s -c 20 -q 100 http://<服务IP>/cpu8.2 观察现象
- 压测开始后约 30 秒,
kubectl top pods显示 CPU 使用率超过 50%。 - HPA 的
TARGETS变为 65%/50%,REPLICAS从 2 开始增加(2→3→4…)。 - 新 Pod 陆续启动,最终稳定在 6~8 个。
- Grafana 仪表盘上 CPU 使用率曲线上升,Pod 数量曲线同步上升。
8.3 停止压测后观察缩容
压测结束后约 5 分钟,Pod 数量自动降回 2。
九、清理环境(可选)
# 删除所有部署资源kubectl delete -f ~/k8s-hpa-demo/k8s/
# 卸载 Prometheushelm uninstall prometheus -n monitoring
# 停止 Minikubeminikube stop
# 如需彻底删除minikube delete Minikube + HPA 弹性伸缩部署实践:openEuler 24.03 LTS SP3
https://blog.xeu.asia/posts/minikube-hpa-openeuler/