【K8s】专题七(1):Kubernetes 服务发现之 Service

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!

公众号二维码


目录

一、基本介绍

二、工作原理

三、对象类型

四、资源清单(示例)

五、创建对象

附录

1、Kubernetes 的三种 IP 类型

2、Kubernetes 各种 “Port” 的含义


一、基本介绍

Service 是 Kubernetes 提供的一种服务发现机制,主要作用是通过 nodeSelector(标签选择器)关联 Pod 对象,以单一入口方式提供内部服务,解决了 Pod 重建后 IP 地址发生变化的问题。

Service 具有以下特点:

  • Service 只支持四层负载均衡,即通过 IP + 端口的方式转发请求
  • Service 对象创建后,kube-dns 或 coredns 可以为其生成唯一的 DNS NAME
  • Service 可以将服务请求均衡分发到关联的 Pod 中,实现负载均衡


二、工作原理
  • 关联 Pod:定义 Service 对象,通过标签指定要关联的 Pod,匹配标签的 Pod IP 和端口列表组成 Endpoints(负载均衡列表)
  • 虚拟 IP:集群为 Service 分配一个虚拟的 IP 地址(ClusterIP),因此无法 ping 通
  • 内部解析:集群 DNS 服务会为 Service 对象创建 DNS 条目
  • 服务发现:集群内可以通过 Service 名称来发现并访问服务,而不需要知道 Pod 的 IP 地址
  • 负载均衡:集群通过 kube-proxy 组件将访问请求负载均衡到 Endpoints 上
  • 扩展性:如果 Pod 的数量发生变化,集群会自动更新 Service 和 kube-proxy 的配置


三、对象类型
  • ClusterIP:默认类型,通过集群内部 IP 暴露服务,实现服务间调用,服务只能在集群内部访问
  • NodePort:通过 Node 节点的 IP 和 静态端口暴露服务,路由到 ClusterIP 服务,通过 iptables 赋予了调用 Node 节点特定 Port 就能访问集群内部 Service 的能力
  • LoadBalancer:一般为云厂商的负载均衡器(收费),可以向外部暴露服务。路由到 ClusterIP 服务和 NodePort 服务
  • ExternalName:直接引用集群外部服务


四、资源清单(示例)
# demo-servcie.yaml
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  selector:                                   # 没有match,否则会报错
    app: web
  type: ClusterIP / NodePort / LoadBalancer
  #clusterIP: xx.xx.xx.xx / None              # 无头 Service 配置为 Node
  #externalIPs:
  #- xx.xx.xx.xx
  ports:
  - name: http                # 注意:暴露多个端口时,需要指定每个端口的 name
    protocol: TCP / UDP
    port: 80
    targetPort: 8080          # 建议使用 containerPort 的名称,如 http,https
    nodePort: 30000-32767
  - name: https
    protocol: TCP / UDP
    port: 443
    targetPort: 8443          # 好处:containerPort 改变后,不需要修改
    #nodePort: 30001          # 端口范围:30000-32767


五、创建对象
# 方法一:基于已有 Deployment 对象创建
kubectl expose deployment <对象名称> --type=<类型> --port=<port> --targetPort=<targetPort>
# 示例:
kubectl expose deployment demo-deployment --type=ClusterIP --port=80 --targetPort=80

# 方法二:命令行创建
kubectl create servcie <Servcie 类型> <对象名称> --tcp=<port>:<targetPort>
# 示例:
kubectl create servcie clusterip demo-servcie --tcp=80:80

# 方法三:基于资源清单创建
kubectl create -f demo-servcie.yaml
或
kubectl apply -f demo-servcie.yaml


附录
1、Kubernetes 的三种 IP 类型
  • Node IP:Node 节点的 IP 地址,即物理网卡的 IP 地址 
  • Cluster IP:Service对象的 IP 地址,无法 ping 通
  • Pod IP:根据 docker0 网桥的网段分配,由 CNI 插件保证不会冲突

2、Kubernetes 各种 “Port” 的含义
  • port:指定 Service 在集群内部暴露的端口
  • nodePort:指定 Service 在集群外部暴露的端口(30000-32767)
  • targetPort:指定 Pod 的监听端口(不指定的情况下与 Port 的值保持一致)
  • containertPort:指定 container 中服务的监听端口(应与 targetPort 一致)
  • hostPort:指定 containerPort 映射到主机的端口

相关推荐

  1. k8s服务发现

    2024-07-11 18:14:03       54 阅读
  2. k8s 服务发现

    2024-07-11 18:14:03       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 18:14:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 18:14:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 18:14:03       58 阅读
  4. Python语言-面向对象

    2024-07-11 18:14:03       69 阅读

热门阅读

  1. 搭建discuz论坛(lvs+nginx+http+mysql+nfs)8台服务器

    2024-07-11 18:14:03       18 阅读
  2. 【AI大模型】如何在企业环境中部署GPT-3/GPT-4模型

    2024-07-11 18:14:03       22 阅读
  3. 图论学习 c++Ford-Fulkerson 方法

    2024-07-11 18:14:03       19 阅读
  4. 主线程结束子线程不再执行

    2024-07-11 18:14:03       23 阅读
  5. 手写函数柯里化示例

    2024-07-11 18:14:03       18 阅读
  6. 常微分方程的离散化

    2024-07-11 18:14:03       23 阅读
  7. Linux下解压.tar.gz文件

    2024-07-11 18:14:03       17 阅读
  8. 利用nodejs实现简单的静态文件托管

    2024-07-11 18:14:03       15 阅读
  9. 力扣题解( 最长递增子序列)

    2024-07-11 18:14:03       24 阅读
  10. less和sass有啥区别哪个更加好

    2024-07-11 18:14:03       21 阅读