欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kubernetes service

程序员文章站 2024-03-11 10:27:25
...

1、service 定义

service 可以为一组相同功能的pod应用提供统一的入口地址,并将请求负载均衡分发到各个容器应用上。service的负载均衡功能由node节点上的kube-proxy提供。创建service模板如下:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: peony
  name: peony
spec:
  ports:
    - name: peony
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: peony
  sessionAffinity: None
  type: ClusterIP

2、service 基本用法

  1. 创建:
    kubectl命令创建:kubectl expose rc rcname
    yaml文件创建: kubectl create -f name.yaml
  2. yaml关键字段:
    port:service暴露的端口
    targetport:当pod暴露的端口和service端口不一致时,可以通过targetport指定pod暴露的端口。
    selector:后端pod所拥有的label
  3. service负载分发策略
    RoundRobin:轮寻模式,轮寻将请求转发到后端pod上面。
    SessionAffinity:基于客户端ip地址进行会话保存,相同的客户端请求会转发到相同的pod上面。
  4. 多端口service:
spec:
  ports:
    - name: p-udp
      port: 8080
      protocol: TCP
      targetPort: 8080
    - name: p-tcp
      port: 8081
      protocol: UDP
      targetPort: 8081
  1. 外部service
    背景:应用需要一个外部数据库作为后端服务进行连接,或者将另一个集群或者namespace中的服务作为后端。
    方法:通过创建一个无label selector的service,并手动创建一个与该service**同名的endpoint**,指向实际的后端访问地址。

3、无头服务 headless service (返回后端pod列表)

背景:开发人员不使用默认的负载均衡策略,自定义负载均衡;或者希望知道同组服务的其他实例。
方法:创建无头服务,不为service设置clusterIP,如下:

spec:
  ports:
    - name: peony
      port: 8080
  clusterIP: None #设置无头服务
  selector:
    app: peony

4、集群外部访问service

  1. 将容器应用端口映射到物理机
    通过设置pod的spec.containers.ports:hostPort:8080

  2. 将pod端口映射到物理机
    通过设置pod的spec:hostNetwork:true

  3. 将service端口映射到物理机
    通过设置nodePort映射到物理机,同时设置service的类型为NodePort

  4. 设置loadBalancer
    设置loadBalancer 映射到云服务供应商的loadBalancer 地址,对service的访问通过loadBalancer 转发到后端pod上,负载均衡的分发方式依赖于云供应商loadBalancer的实现机制。
    status.loadBalancer.ingress.ip设置外部loadBalancer的IP

5、service DNS服务搭建

DNS是kubernetes集群中服务发现的核心组件。kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成:

  1. etcd:DNS存储
  2. kube2sky:将k8s master 中的服务注册到etcd
  3. skyDNS:提供DNS域名解析服务。
  4. healthz:提供skyDNS服务的健康检查。

DNS服务工作原理:
1.kube2sky容器通过调用kubernetes master api获得集群中所有service的信息,并持续监控新service的生成,写入到etcd中。
2.kubelet启动参数中设置,在每个新建的pod中设置DNS域名解析配置文件/etc/resolv.conf,在其中增加一条nameserver和search。
kubernetes service
3. 最后,应用程序可以像访问网站一样,通过服务名称访问服务了。后续版本skydns不再使用etcd数据库。

6、自定义DNS

目前k8s的pod定义中支持两种类型的DNS策略(dnsPolicy):Default和ClusterFirst。

  1. dnsPolicy:deafult,解析配置从pod中的/etc/resolv.conf继承而来。
  2. dnsPolicy:ClusterFirst,dns查询会发到kube-dns服务进行解析。

7、Ingress

相关标签: kubernetes