service介绍

k8s的service是一种为一组功能相同的pod提供单一不变的接入点的资源。service的IP地址和端口不改变。
创建方式:
①kubectl expose
②通过yaml文件方式

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia

pod的服务发现

发现内部的服务
①通过环境变量env发现服务
②通过DNS发现服务
发现集群外部的服务
两种方式:
①手动配置endpoint资源
endpoint资源:暴露一个service的IP和端口的列表,
该资源在创建pod选择器Selector时创建
②为外部服务创建别名
通过完全限定域名FQDN访问外部服务

集群服务暴露给外部客户端

三种方式:
①将服务类型设置为NodePort
每个节点都会打开一个端口,将外部请求转发给服务对应的pod

apiVersion: v1
kind: Service
metadata:
  name: kubia-nodeport
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30123  #通过集群节点的30123端口可以访问该服务
  selector:
    app: kubia

该方式可能需要更改防火墙配置
在这里插入图片描述
②通过负载均衡器LoadBalancer暴露服务

apiVersion: v1
kind: Service
metadata:
  name: kubia-LoadBalancer
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia

创建后,LoadBalancer将配置服务的外部IP地址
在这里插入图片描述
注意问题
①网络跳数
随机选择的pod并不一定在同一个节点上,可能需要额外的网络跳转才能到达pod
②客户端的IP地址无法获取
通过节点端口获取的请求,由于对数据包进行了源网络地址转换(SNAT),因此数据包的IP地址将发生改变。

通过Ingress暴露服务

与LoadBalancer的差别:每个LoadBalancer都需要自己的负载均衡器,以及独有的公有IP地址,而Ingress只需要一个公网IP就能为许多服务提供访问。
在这里插入图片描述
Ingress是网络栈(HTTP)的应用层操作,并可以提供一些服务不能实现的功能,如基于cookie的会话功能

apiVersion: externsions/v1beta1
kind: Ingress
metadata:
  name: kubia
spec:
  rules:
  - host: kubia.example.com #Ingress将该域名映射到服务
  http:
    paths:
    - path: /
      backend:
        serviceName: kubia-nodeport #所有的请求都转发到80端口
        servicePort: 80

在这里插入图片描述
Ingress支持:
①将不同的服务映射到同一台主机的不同路径
②将不同的服务映射到不同职级上

apiVersion: externsions/v1beta1
kind: Ingress
metadata:
  name: kubia
spec:
  rules:
  - host: kubia.example.com #Ingress将该域名映射到服务
  http:
    paths:
    - path: /
      backend:
        serviceName: kubia-nodeport #所有的请求都转发到80端口
        servicePort: 80
  - host: bar.example.com #Ingress将该域名映射到服务
  http:
    paths:
    - path: /
      backend:
        serviceName: bar #所有的请求都转发到80端口
        servicePort: 80

Ingress转发HTTPS(处理TLS传输)
例子:pod中运行的web服务器只接受http,Ingress控制器负责处理TLS相关的所有内容,此时需要将证书和私钥附加到Ingress,该资源存储在k8s的Secret中。
步骤:
①创建私钥和证书
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.cert -days 360 -subj /CN=kubia.example.com
②创建Secret
kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key
③创建Ingress

apiVersion: externsions/v1beta1
kind: Ingress
metadata:
  name: kubia
spec:
  tls:
  - hosts:
    - kubia.example.com
    secretNmae: tls-secret #添加前面创建的私钥和证书
  rules:
  - host: kubia.example.com #Ingress将该域名映射到服务
  http:
    paths:
    - path: /
      backend:
        serviceName: kubia-nodeport #所有的请求都转发到80端口
        servicePort: 80

使用headless服务来发现独立的pod

k8s允许客户端通过DNS查找来发现pod的IP
将clusterIP设置为None会使得service成为headless服务,k8s不为其分配集群IP地址,客户端可以通过该IP连接到它所属的pod上

apiVersion: v1
kind: Service
metadata:
  name: kubia-headless
spec:
  clusterIP: None
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐