我有一个 aks 集群,其中部署了 spring boot REST API,连接到 psql 服务。
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-app
spec:
replicas: 1
selector:
matchLabels:
app: springboot-app
template:
metadata:
labels:
app: springboot-app
spec:
containers:
- name: springboot-app
image: someImage
ports:
- containerPort: 8080
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:postgresql://postgres:5432/student
- name: SPRING_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: postgres-secret
key: username
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
---
apiVersion: v1
kind: Service
metadata:
name: springboot-service
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: springboot-app
这是 API 控制器类的一部分:
@RestController
@RequestMapping(path = "api/product")
public class ProductController {
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping(path = "products")
public List<Product> getProducts() {
return productService.getProducts();
}
我想将 API 公开到互联网,所以我安装了 nginx 控制器并创建了一个入口文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster.issuer: letsencrypt-staging
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/ssl-redirect: "false"
generation: 2
name: aks-helloworld
spec:
ingressClassName: nginx
rules:
- http:
paths:
- backend:
service:
name: springboot-service
port:
number: 80
path: /
pathType: Prefix
当我执行 Spring API pod 并尝试像这样卷曲资源时
curl http://localhost:8080/api/product/products
它工作正常并返回正确的输出。 但是,当我尝试使用 nginx 控制器中的公共静态 ip 连接到 api 时,我得到了 spring 白色标签错误页面,404 not found
http://<public-ip>/api/product/products
入口控制器日志是这么说的
[05/Jul/2024:08:57:56 +0000] "GET /api/product/products HTTP/1.1" 404 306 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 OPR/111.0.0.0" 489 0.005 [default-springboot-service-80]
而且也没有提及该电话。在 spring API pod 日志中,与我在 pod 本身中使用curl 时不同。我是 k8s 的新手,如果我对我做错了什么有任何建议,我们将不胜感激。
还值得一提的是,当我部署本教程中的 aks-helloworld 映像时 https://learn.microsoft.com/en-us/azure/aks/app-routing?tabs=default%2Cdeploy-app-default 我可以通过公共IP连接没有问题。
您可以交叉验证您的入口和服务模板,特别是比较端口映射。它应该与您的 springboot 中的 application.properties 文件匹配。
假设您的 ACR 中已提供申请,
创建您的 springboot-deployment、服务和入口 yaml
部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-app
labels:
app: springboot-app
spec:
replicas: 1
selector:
matchLabels:
app: springboot-app
template:
metadata:
labels:
app: springboot-app
spec:
containers:
- name: springboot-app
image: arkoacr.azurecr.io/my-spring-boot-app:latest
ports:
- containerPort: 8091
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:postgresql://postgres-postgresql.postgres.svc.cluster.local:5432/student
- name: SPRING_DATASOURCE_USERNAME
value: arko
- name: SPRING_DATASOURCE_PASSWORD
value: Welcome@12345
readinessProbe:
httpGet:
path: /greeting
port: 8091
initialDelaySeconds: 10
periodSeconds: 5
imagePullSecrets:
- name: acr-secret
服务
apiVersion: v1
kind: Service
metadata:
name: springboot-service
labels:
app: springboot-app
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8091
selector:
app: springboot-app
入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: springboot-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /greeting
pathType: Prefix
backend:
service:
name: springboot-service
port:
number: 80
如果您仍然遇到问题,请检查
kubectl describe ingress <ingress-name>
以检查您的入口资源的配置,以及 kubectl describe service <service-name>
以检查您的服务的配置以及 kubectl logs <nginx-controller-pod-name>
参考资料: