You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将简单REST服务部署为Kubernetes Pod并对外开放访问

部署Java REST服务到Kubernetes并对外访问

一、核心资源的作用与关联关系

先对应你提到的7类资源到Kubernetes实际组件,理清依赖逻辑:

  • 镜像:服务的运行载体,Deployment会拉取镜像创建Pod实例
  • Pod:服务的运行单元,由Deployment管理(不建议直接创建独立Pod,意外终止后无法自动恢复)
  • Deployment:负责Pod的创建、副本数量管控、滚动更新等生命周期管理
  • Service:通过标签选择器关联Pod,提供稳定的集群内/外访问入口
  • 路由表/网关:对应Kubernetes的Ingress资源,Ingress Controller作为网关处理路由转发规则
  • 负载均衡器:云厂商提供的LoadBalancer类型服务,为Ingress Controller或Service分配公网IP,实现集群外访问

二、分步配置实现

1. 构建Docker镜像

先把你的Java REST服务打包成可执行Jar包(假设包名为hello-service.jar),然后编写Dockerfile:

# 基于OpenJDK 17 slim镜像构建
FROM openjdk:17-jdk-slim

# 设置容器内工作目录
WORKDIR /app

# 复制本地Jar包到容器内
COPY target/hello-service.jar .

# 暴露服务运行端口(假设你的服务监听8080端口)
EXPOSE 8080

# 启动服务的命令
CMD ["java", "-jar", "hello-service.jar"]

构建并推送到镜像仓库(以Docker Hub为例):

# 构建镜像,替换为你的仓库地址
docker build -t your-docker-username/hello-service:v1 .

# 推送到镜像仓库
docker push your-docker-username/hello-service:v1

2. Deployment配置(替代独立Pod,更稳定)

虽然你提到需要独立Pod,但直接创建Pod无自愈能力,用Deployment管理单副本Pod是最佳实践。创建hello-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-service-deployment
  labels:
    app: hello-service
spec:
  replicas: 1 # 单副本,对应你需要的"独立Pod"
  selector:
    matchLabels:
      app: hello-service
  template:
    metadata:
      labels:
        app: hello-service
    spec:
      containers:
      - name: hello-service-container
        image: your-docker-username/hello-service:v1 # 替换为你的镜像地址
        ports:
        - containerPort: 8080 # 容器内服务端口
        resources:
          requests:
            cpu: "100m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"

部署命令:

kubectl apply -f hello-deployment.yaml

3. Service配置(访问入口)

Service通过标签匹配Pod,提供稳定访问地址。分两种场景:

场景1:测试环境直接用NodePort对外访问

apiVersion: v1
kind: Service
metadata:
  name: hello-service-nodeport
spec:
  type: NodePort
  selector:
    app: hello-service # 与Deployment的Pod标签一致
  ports:
    - protocol: TCP
      port: 8080 # Service自身端口
      targetPort: 8080 # 容器内服务端口
      nodePort: 30007 # 可选,指定集群节点端口(范围30000-32767)

部署后,集群外可通过http://<集群节点IP>:30007/hello访问服务。

场景2:生产环境用ClusterIP配合Ingress

apiVersion: v1
kind: Service
metadata:
  name: hello-service-clusterip
spec:
  type: ClusterIP
  selector:
    app: hello-service
  ports:
    - protocol: TCP
      port: 80 # Service端口
      targetPort: 8080 # 容器内服务端口

部署命令:

kubectl apply -f hello-service.yaml

4. Ingress配置(路由规则+网关)

Ingress负责路由转发,需先安装Ingress Controller(如NGINX Ingress Controller),再创建hello-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-service-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: hello.your-domain.com # 替换为你的域名
    http:
      paths:
      - path: /hello
        pathType: Prefix
        backend:
          service:
            name: hello-service-clusterip # 关联ClusterIP Service
            port:
              number: 80

部署命令:

kubectl apply -f hello-ingress.yaml

5. 负载均衡器(公网IP分配)

云厂商K8s集群中,部署Ingress Controller时会自动创建LoadBalancer类型Service,云厂商将分配公网IP。查看公网IP命令:

kubectl get svc -n ingress-nginx # 假设Ingress Controller在ingress-nginx命名空间

将域名解析到该公网IP后,即可通过http://hello.your-domain.com/hello访问服务。

三、资源关联关系总结

  1. 镜像 → 被Deployment拉取,作为Pod容器的运行镜像
  2. Deployment → 通过selector.matchLabels匹配Pod标签,管控Pod生命周期
  3. Pod → 运行服务的实例,携带Deployment定义的标签
  4. Service → 通过selector匹配Pod标签,为Pod提供稳定访问地址
  5. Ingress → 通过backend.service.name关联Service,定义外部流量的路由规则
  6. 负载均衡器 → 为Ingress Controller或Service提供公网IP,打通集群内外流量

验证访问

  • NodePort方式:访问http://<集群节点IP>:<nodePort>/hello,返回Hello World
  • Ingress方式:访问http://<公网IP>/hello或http://hello.your-domain.com/hello,返回Hello World

内容的提问来源于stack exchange,提问作者Nirmalya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:12:44