如何将简单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访问服务。
三、资源关联关系总结
- 镜像 → 被Deployment拉取,作为Pod容器的运行镜像
- Deployment → 通过
selector.matchLabels匹配Pod标签,管控Pod生命周期 - Pod → 运行服务的实例,携带Deployment定义的标签
- Service → 通过
selector匹配Pod标签,为Pod提供稳定访问地址 - Ingress → 通过
backend.service.name关联Service,定义外部流量的路由规则 - 负载均衡器 → 为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
相关产品推荐
相关产品推荐

