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(避免网络问题)#

Terminal window
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

1.2 关闭 swap(K8s 要求)#

Terminal window
swapoff -a
# 永久关闭,注释 /etc/fstab 中的 swap 行
sed -i '/swap/d' /etc/fstab

1.3 配置内核参数#

Terminal window
# 1. 加载 br_netfilter 内核模块
modprobe br_netfilter
# 2. 验证模块是否加载成功
lsmod | grep br_netfilter
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 使内核参数生效
sysctl -p /etc/sysctl.d/k8s.conf

1.4 安装必要工具#

Terminal window
# [openEuler] 使用 dnf 替代 yum
dnf install -y yum-utils device-mapper-persistent-data lvm2 wget curl git

1.5 代理相关配置(如有)#

Terminal window
# 1. 创建或编辑 bashrc 配置文件
cat >> ~/.bashrc <<'EOF'
# Proxy settings for minikube
export 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#

Terminal window
# [openEuler] openEuler 优先使用 dnf 包管理器,但 Docker 官方源基于 CentOS,因此仍使用 yum-config-manager
dnf 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 8
sed -i 's+$releasever+8+' /etc/yum.repos.d/docker-ce.repo
dnf makecache
# 安装 Docker CE
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2.2 配置 Docker#

Terminal window
mkdir -p /etc/docker
cat > /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
# 启动 Docker
systemctl enable docker
systemctl start docker

2.3 为 Docker 服务配置代理(如需)#

Terminal window
mkdir -p /etc/systemd/system/docker.service.d
cat > /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-reload
systemctl restart docker

2.4 创建普通用户#

Terminal window
# 创建用户 k8s
useradd -m -s /bin/bash k8s
# 将 k8s 用户添加到 docker 组
usermod -aG docker k8s
# 验证
id k8s
passwd k8s

三、安装 Minikube 和 kubectl#

3.1 下载 Minikube 二进制#

Terminal window
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

3.2 下载 kubectl#

Terminal window
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/kubectl

3.3 切换用户并启动 Minikube#

Terminal window
su - k8s
# [openEuler] 启动 Minikube
minikube 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_PROXY

3.4 验证#

Terminal window
kubectl cluster-info
kubectl get nodes

四、准备微服务应用镜像(CPU 密集型)#

4.1 创建应用代码#

Terminal window
mkdir -p ~/k8s-hpa-demo/app
cd ~/k8s-hpa-demo/app

app.py

from flask import Flask
import 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-slim
WORKDIR /app
RUN pip install flask
COPY app.py .
EXPOSE 8080
CMD ["python", "app.py"]

4.2 构建镜像(切换到 Minikube 内部 Docker 环境)#

Terminal window
# 重要
eval $(minikube docker-env)
docker build -t hpa-demo:latest .

五、部署应用到 K8s 并配置 HPA#

5.1 创建 Deployment YAML#

Terminal window
mkdir -p ~/k8s-hpa-demo/k8s
cd ~/k8s-hpa-demo/k8s

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: hpa-demo
spec:
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: v1
kind: Service
metadata:
name: hpa-demo-svc
spec:
selector:
app: hpa-demo
ports:
- port: 80
targetPort: 8080
type: NodePort

hpa.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-demo-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-demo
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50

5.2 部署#

Terminal window
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f hpa.yaml
# minikube addons enable metrics-server

5.3 验证#

Terminal window
kubectl get pods
kubectl get svc
kubectl get hpa

5.4 获取服务访问地址#

Terminal window
minikube service hpa-demo-svc --url
# 记录输出的 URL,例如 http://192.168.49.2:31876

六、部署 Prometheus+Grafana 监控系统#

6.1 安装 Helm#

Terminal window
wget https://get.helm.sh/helm-v3.14.0-linux-amd64.tar.gz
tar -zxvf helm-v3.14.0-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/bin/helm
chmod +x /usr/bin/helm
helm version

6.2 添加 Prometheus 社区 Helm 仓库#

Terminal window
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

6.3 安装 kube-prometheus-stack#

Terminal window
# 创建监控命名空间
kubectl create namespace monitoring
# 安装
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.service.type=NodePort \
--set prometheus.service.type=NodePort

6.4 等待所有 Pod 就绪#

Terminal window
kubectl get pods -n monitoring -w
# 等待所有 Pod 状态为 Running

6.5 获取 Grafana 访问端口#

Terminal window
kubectl get svc -n monitoring | grep grafana
# 假设 NodePort 为 30495

获取 Grafana 管理员密码:

Terminal window
kubectl get secret -n monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

七、安装压测工具 hey#

Terminal window
wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
chmod +x hey_linux_amd64
sudo mv hey_linux_amd64 /usr/local/bin/hey

八、功能验证:压测触发弹性伸缩#

8.1 打开三个终端窗口#

终端1:实时监控 Pod 数量

Terminal window
kubectl get pods -w

终端2:实时监控 HPA 状态

Terminal window
kubectl get hpa -w

终端3:执行压测(替换 URL 为你的服务地址)

Terminal window
hey -z 60s -c 20 -q 100 http://<服务IP>/cpu

8.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。


九、清理环境(可选)#

Terminal window
# 删除所有部署资源
kubectl delete -f ~/k8s-hpa-demo/k8s/
# 卸载 Prometheus
helm uninstall prometheus -n monitoring
# 停止 Minikube
minikube stop
# 如需彻底删除
minikube delete
Minikube + HPA 弹性伸缩部署实践:openEuler 24.03 LTS SP3
https://blog.xeu.asia/posts/minikube-hpa-openeuler/
作者
Xeu
发布于
2026-05-01
许可协议
CC BY-NC-SA 4.0