经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
K8S | Service服务发现
来源:cnblogs  作者:知了一笑  时间:2023/8/4 9:03:58  对本文有异议

服务发现与负载均衡。

一、背景

在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;

对于测试「Tes」环境或者生产「Pro」环境,出于安全或者环境隔离性来考虑,在正常情况下只会开放网关服务,而「注册、配置」中心并不会对外暴露;

对于架构中的其它业务服务一般不会对外开放,在K8S集群内部服务间是可以正常通信的,对于「Dev」环境来说,研发会使用「注册、配置」中心,网关是系统的访问入口;

在K8S集群中,通过Service组件,可以快速简单的实现服务发现和负载均衡;

二、Service组件

1、简介

在K8S集群中是通过Pod组件来部署应用服务,Deployment组件实现Pod编排管理,Service组件实现应用的访问;

【Pod】自身的特点是临时的,使用过后直接抛弃的实体,这样在Pod创建和销毁的状态中,会导致IP地址发生变化,即无法使用固定的IP进行应用访问;

【Deployment】控制器通过管理ReplicaSet间接实现Pod管理,比如发布方式,更新和回滚策略,维持Pod副本数量,对应用进行快速的编排,但是并没有涉及应用的访问;

【Service】是将运行在一个或一组Pod上的网络应用程序公开为网络服务的方法,可以在不修改现有应用程序的情况下,使用服务发现机制访问到该应用;

基于Pod、Deployment、Service三个组件的协作,同一个应用的部署脚本可以在开发、测试、生产不同环境中复用;

2、基础语法

这里提供一个简单的【Service】语法做参考;

需要注意的是:在该脚本中没有指定服务类型即ServiceType,默认采用的是ClusterIP,通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问;

三、内部服务发现

1、Pod创建

基于【Deployment】组件,创建「auto-serve」应用;

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: serve-deployment
  5. labels:
  6. app: auto-serve
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: auto-serve
  12. template:
  13. metadata:
  14. labels:
  15. app: auto-serve
  16. spec:
  17. containers:
  18. - name: auto-serve
  19. image: auto-serve:latest
  20. imagePullPolicy: Never
  21. ports:
  22. - containerPort: 8082
  23. name: auto-serve-port

执行创建命令

  1. kubectl apply -f serve-deployment.yaml

2、Service创建

简单的脚本文件:app-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: app-service
  5. spec:
  6. selector:
  7. app: auto-serve
  8. ports:
  9. - name: app-service-port
  10. protocol: TCP
  11. port: 8082
  12. targetPort: auto-serve-port

创建【Service】

  1. kubectl apply -f app-service.yaml

查看【Service】,可以使用命令行或者界面;

  1. kubectl describe svc app-service

删除【Service】

  1. kubectl delete -f app-service.yaml

3、内部访问

在上面已经说明,当Type不指定时采用的是ClusterIP,只能在集群内部访问,集群外部的网络是无法访问的;

在【auto-client】服务中提供一段访问【auto-serve】接口的代码,并制作镜像【auto-client:3.3.3】,完成部署后查看日志打印;

  1. @Component
  2. public class HttpServiceJob {
  3. private static final Logger LOG = LoggerFactory.getLogger(HttpServiceJob.class.getName()) ;
  4. private static final String SERVER_NAME = "http://app-service:8082/serve";
  5. private static final String SERVER_IP = "http://10.103.252.94:8082/serve";
  6. /**
  7. * 每30秒执行一次
  8. */
  9. @Scheduled(fixedDelay = 30000)
  10. public void systemDate () {
  11. SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
  12. factory.setReadTimeout(3000);
  13. factory.setConnectTimeout(6000);
  14. RestTemplate restTemplate = new RestTemplate(factory);
  15. try {
  16. Map<String, String> paramMap = new HashMap<>();
  17. String result = restTemplate.getForObject(SERVER_NAME, String.class, paramMap);
  18. LOG.info("service-name-resp::::" + result);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. try {
  23. Map<String, String> paramMap = new HashMap<>();
  24. String result = restTemplate.getForObject(SERVER_IP, String.class, paramMap);
  25. LOG.info("service-ip-resp::::" + result);
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

在代码中通过服务名:端口IP:端口都可以正常访问,在Pod中查看两个应用的日志,请求和响应都正常;

四、外部服务发现

1、NodePort类型

指定类型为NodePort的脚本:app-np-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: app-np-service
  5. spec:
  6. type: NodePort
  7. selector:
  8. app: auto-serve
  9. ports:
  10. - protocol: TCP
  11. port: 8082
  12. targetPort: 8082
  13. nodePort: 30010

创建【Service】

  1. kubectl apply -f app-np-service.yaml

使用NodePort类型,K8S控制平面会在指定的范围内分配端口,如果需要特定的端口号可以指定nodePort字段中的值,但是该类型需要自己设置负载均衡解决方案;

2、LoadBalancer类型

指定类型为LoadBalancer的脚本:app-lb-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: app-lb-service
  5. spec:
  6. type: LoadBalancer
  7. selector:
  8. app: auto-serve
  9. ports:
  10. - protocol: TCP
  11. port: 8082
  12. targetPort: 8082

创建【Service】

  1. kubectl apply -f app-lb-service.yaml

查看【Service】

在查看「app-lb-service」时,值得注意一下Endpoints的字段属性,这里就是Pod选择器选中的Pod

  1. kubectl get svc app-lb-service -o wide
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
  3. app-lb-service LoadBalancer 10.111.65.220 localhost 8082:30636/TCP 6m49s app=auto-serve
  4. kubectl describe svc app-lb-service
  5. Name: app-lb-service
  6. Namespace: default
  7. Labels: <none>
  8. Annotations: <none>
  9. Selector: app=auto-serve
  10. Type: LoadBalancer
  11. IP Family Policy: SingleStack
  12. IP Families: IPv4
  13. IP: 10.111.65.220
  14. IPs: 10.111.65.220
  15. LoadBalancer Ingress: localhost
  16. Port: <unset> 8082/TCP
  17. TargetPort: 8082/TCP
  18. NodePort: <unset> 30636/TCP
  19. Endpoints: 10.1.0.160:8082,10.1.0.161:8082,10.1.0.162:8082
  20. Session Affinity: None
  21. External Traffic Policy: Cluster
  22. Events: <none>
  23. kubectl get pods -o wide
  24. NAME READY STATUS RESTARTS AGE IP NODE
  25. serve-deployment-f6f6c5bbd-9qvgr 1/1 Running 0 39m 10.1.0.162 docker-desktop
  26. serve-deployment-f6f6c5bbd-w7nj2 1/1 Running 0 39m 10.1.0.161 docker-desktop
  27. serve-deployment-f6f6c5bbd-x7v4d 1/1 Running 0 39m 10.1.0.160 docker-desktop

五、参考源码

  1. 文档仓库:
  2. https://gitee.com/cicadasmile/butte-java-note
  3. 脚本仓库:
  4. https://gitee.com/cicadasmile/butte-auto-parent

原文链接:https://www.cnblogs.com/cicada-smile/p/17602316.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号