前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s系列(2)-Service

k8s系列(2)-Service

原创
作者头像
爽朗地狮子
修改2022-10-21 10:02:04
3900
修改2022-10-21 10:02:04
举报
文章被收录于专栏:云原生系列

完整系列

  1. k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装1
  2. k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装2
  3. k8s系列(2)-Service
  4. k8s系列(3)-StatefulSet的MongoDB实战
  5. k8s系列(4)-MongoDB数据持久化
  6. k8s系列(5)-Configmap和Secret
  7. k8s系列(6)-Helm
  8. k8s系列(7)-命名空间
  9. k8s系列(8)-Ingress
  10. k8s系列(9)-容忍、污点、亲和

特性

  • Service 通过 label 关联对应的 Pod
  • Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
  • 提供了负载均衡功能,自动转发流量到不同 Pod
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问
image.png
image.png

一. 集群内访问ClusterIP

代码语言:txt
复制
apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: ClusterIP
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口

应用配置 kubectl apply -f service.yaml

查看服务 kubectl get svc

image.png
image.png

查看服务详情 kubectl describe svc test-k8s ,可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。

image.png
image.png

服务的默认类型是 ClusterIP ,只能在集群内部访问,我们可以进入到 Pod 里面访问:

kubectl exec -it pod-name -- bash

curl http://test-k8s:8080

如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):

kubectl port-forward service/test-k8s 8888:8080

二. 集群外访问NodePort

代码语言:txt
复制
apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  # 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 节点端口,范围固定 30000 ~ 32767

应用配置 kubectl apply -f service.yaml

在节点上,我们可以 curl http://localhost:31000/hello/easydoc 访问到应用

并且是有负载均衡的,网页的信息可以看到被转发到了不同的 Pod

代码语言:txt
复制
hello easydoc 

IP lo172.17.0.8, hostname: test-k8s-68bb74d654-962lh

如果你是用 minikube,因为是模拟集群,你的电脑并不是节点,节点是 minikube 模拟出来的,所以你并不能直接在电脑上访问到服务

Loadbalancer 也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding,这个很少用了,后面我们会讲更高端的 Ingress 来代替它。

三. 总结

ClusterIP

默认的,仅在集群内可用

NodePort

暴露端口到节点,提供了集群外部访问的入口

端口范围固定 30000 ~ 32767

因为nodeport:port,这里核心就是为了去找service,否则通过clusterip是无法访问service的。找到了service,service做负载均衡

image.png
image.png

LoadBalancer

需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)

会额外生成一个 IP 对外服务

K8S 支持的负载均衡器:负载均衡器

比如我有10台机器,1-8机器100%满负荷工作,那么9,10号是10%负荷工作,此时需要LoadBanlancer去把流量调度到9号和10号机器,9号和10号机器去找相关联的service,service去做负载均衡。LoadBalancer做流量入口的负载均衡,service做调度服务的负载均衡

Headless

适合数据库

clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP

参考文档

  1. 服务(Service)
  2. Service

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完整系列
  • 特性
    • 一. 集群内访问ClusterIP
      • 二. 集群外访问NodePort
        • 三. 总结
          • ClusterIP
          • NodePort
          • LoadBalancer
          • Headless
      • 参考文档
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档