常规手段:通过 service 访问对应的 pod
-
通常情况下,从外部访问 kubernetes 内部 pod 服务的方法是创建 service,再通过访问 service 的方式来访问对应的 Pod,但是这样做会变更 kubernetes 环境现有配置,例如原本注册中心对应的 service type 是 ClusterIP,这里只有改成 NodePort 或者 LoadBalancer 才能让外部访问到,又例如服务 A 原本没有 service,这里为了外部访问只能为其创建 service。
-
如果这个 Kubernetes 环境是生产环境,上述改动都是不允许的,如果是开发环境,又会造成开发和生产环境有大量不一样的配置,因此,创建 service 虽然可行但并不是好方案。
更适合本地开发的方案:kubefwd 服务
-
比 service 更适合本地开发的方案是使用 kubectl port-forward 命令在本地电脑创建 kubefwd 服务,例如将对当前电脑 8081 端口的请求,可以 kubefwd 转发到 kubernetes 上的注册中心 Pod 的 8080 端口;
-
有了 kubefwd,我们在开发服务 B 的时候,只要把发往注册中心和服务 A 的请求都 kubefwd 服务转发到 kubernetes 上去就可以了,如下图:
-
理论分析就到此吧,接下来一起实战本地服务调用 K8S 环境中的微服务。
实战环境
-
kubernetes:
-
kubectl:1.7.0
-
kubernetes 所在 Linux 服务器:CentOS7.4
-
本地环境:win10 专业版 64 位
-
SpringCloud:Edgware.SR1
源码下载
实战
kubectl run my-eureka --image=bolingcavalry/eureka-server:0.0.1-SNAPSHOT --replicas=1
kubectl expose deployment my-eureka --name=eurekahost --port=8080
kubectl run my-provider --image=bolingcavalry/service-provider:0.0.1-SNAPSHOT --replicas=1
c:\software\kubectl>kubectl get pods
NAME READY STATUS RESTARTS AGE
my-eureka-7f958f96b7-drgt6 1/1 Running 0 25m
my-provider-78dcc87bcc-s7cvq 1/1 Running 0 19m
kubectl port-forward my-eureka-7f958f96b7-drgt6 8081:8080
kubectl port-forward my-provider-78dcc87bcc-s7cvq 8082:8080
-
此时用浏览器访问本机的 8082 端口,就能调用服务 A 的 http 接口了,地址是:http://localhost:8082/getuserinfo?id=101&name=Tom
-
此时注册中心和服务 A 都可以在本地访问了,可以在本地开发服务 B 的代码了,详细源码请按照前面给出的地址下载,这里只贴出关键代码,首先是配置信息 application.yml,这是个普通的 SpringCloud 工程的配置,要注意的是 eureka 的地址和端口要改成 localhost:8081,这样请求才会被 kubefwd 服务转发到 kubernetes 上去:
server:
port: 8080
spring:
application:
name: service-consumer
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8081/eureka/
instance:
prefer-ip-address: true
@FeignClient(name = "microservice-provider-user", url = "http://localhost:8082")
public interface UserFeignClient {
@RequestMapping(value = "/getuserinfo", method = RequestMethod.GET)
String getUserInfoWithRequestParam(@RequestParam("id") String id, @RequestParam("name") String name);
}
@RestController
public class UserFacadeController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}/{name}")
public String getUserInfo(@PathVariable("id") final String id, @PathVariable("name") final String name) {
return "1. ---" + userFeignClient.getUserInfoWithRequestParam(id, name);
}
}
一点小遗憾
kubectl port-forward deployment/my-eureka 8081:8080
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)