2025年07月26日/ 浏览 2
在微服务架构成为主流的今天,传统虚拟机部署方式面临资源利用率低、扩缩容慢等问题。某电商平台的数据显示,迁移到Kubernetes后,其Spring Boot服务的部署效率提升300%,服务器成本降低45%。通过Kubernetes的声明式配置和自动调度能力,开发者可以:
bash
brew install kubectl helm docker kind # MacOS
apt-get install kubectl docker.io # Ubuntu
建议使用Minikube或Kind搭建本地Kubernetes集群:
bash
kind create cluster --config=./kind-config.yaml
在application.yml
中增加K8s感知配置:
yaml
management:
endpoint:
health:
show-details: always
endpoints.web.exposure.include: health,info,metrics
dockerfile
FROM maven:3.8-jdk-11 as builder
COPY . /app
RUN mvn -f /app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY –from=builder /app/target/*.jar /app.jar
USER nobody # 非root用户运行
ENTRYPOINT [“java”,”-Djava.security.egd=file:/dev/./urandom”,”-jar”,”/app.jar”]
关键技巧:
– 使用.dockerignore
排除无关文件
– 镜像标签采用Git Commit ID
– 设置JVM内存参数:-XX:MaxRAMPercentage=75.0
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: app
image: registry.example.com/order-service:1.0.0
resources:
limits:
cpu: "1"
memory: "1Gi"
requests:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: springboot-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: api.example.com
http:
paths:
- path: /order(/|$)(.*)
pathType: Prefix
backend:
service:
name: order-service
port:
number: 8080
bash
kubectl apply -f deploy-v2.yaml
kubectl patch svc order-service -p ‘{“spec”:{“selector”:{“version”:”v2″}}}’
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.yaml: |
spring:
datasource:
url: jdbc:mysql://db-prod:3306/orders
username: ${DB_USER}
推荐集成方案:
1. Prometheus + Grafana监控JVM指标
2. EFK(Elasticsearch+Fluentd+Kibana)日志系统
3. 使用Spring Boot Actuator暴露指标端点
yaml
问题1:Pod持续CrashLoopBackOff
– 检查:kubectl logs -p <pod_name>
– 常见原因:内存不足、数据库连接失败
问题2:服务不可访问
– 检查:kubectl describe ingress <ingress_name>
– 常见原因:Ingress Controller未安装、Service端口不匹配