温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

kubernetes实践之四十三: Service详解

发布时间:2020-08-08 00:57:52 来源:ITPUB博客 阅读:172 作者:百联达 栏目:云计算
一:简介

通过Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端各个应用容器上,实现Pod的负载均衡

二:Service定义模版重要属性说明

1.spec.type Service的类型,指定Service的访问方式,默认值为ClusterIP.
a.ClusterIP: 虚拟的服务IP地址,该地址用于Kubernetes集群内部的Pod访问,在Node 上kube-proxy通过设置的Iptables规则进行转发。
b.NodePort: 使用宿主机的端口,使能够访问各Node的客户端通过Node的IP地址和端口号就能访问服务。
c.LoadBalancer: 使用外接负载均衡器完成到服务的负载分发

2.spec.sessionAffinity: 是否支持Session,可选值为ClientIP,默认值为空,ClientIP表示将同一个客户端的访问请求都转发到同一个后端Pod。

三:Service的基本用法

1.通常用法,服务作为Pod的负载均衡器。目前的负载分发策略有:
a. RoundRobin: 轮询模式,即轮询将请求转发到后端各个Pod上。
b.SessionAffinity: 基于客户端IP地址进行回话保持的模式。

2.多端口Service,有时候一个容器应用也可能提供多个端口的服务,那么在Service定义中也可以相应地设置为将多个端口对应到多个应用服务。

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: webapp
  5. spec:
  6.  ports:
  7.  - port: 8080
  8.    targetPort: 8080
  9.    name: web
  10.  - port: 8005
  11.    targetPort: 8005
  12.    name: management
3.外部服务Service
在某些环境中,应用系统需要将一个外部数据库作为后端服务进行连接,或将另一个集群或Namespace中的服务作为服务的后端,这时可以通过创建一个无Label Selector的Service来实现(此时需要创建一个和该Service同名的Endpoint)。

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: mysql-test
  5. spec:
  6.   ports:
  7.     - port: 3306

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Endpoints
  3. metadata:
  4.   name: mysql-test
  5.   namespace: default
  6. subsets:
  7.   - addresses:
  8.     - ip: 120.25.154.90
  9.     ports:
  10.       - port: 3306
4.Headless Service, 在某些应用场景中,开放人员希望自己控制负载均衡的策略,不使用Service提供的默认负载均衡的功能,或者应用程序希望知道属于同组的其他实例。 此种服务不为Service设置ClusterIP,仅通过Label Selector 找后端的Pod列表返回给调用的客户端。

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     app: nginx
  7. spec:
  8.  ports:
  9.  - port: 80
  10.  clusterIP: None
  11.  selector:
  12.   app: nginx

四:集群外部访问Pod或Service的方法

1.将容器应用的端口号映射到物理机

a. 通过设置容器级别的hostPort,将容器应用的端口映射到物理机上

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: webapp
  5.   labels:
  6.    app: webapp
  7. spec:
  8.  containers:
  9.  - name: webapp
  10.    image: tomcat
  11.    ports:
  12.    - containerPort: 8080
  13.      hostPort: 8081
b.通过设置Pod级别的hostNetwork=true,该Pod中所以容器的端口号都被直接映射到物理机上。

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: webapp
  5.   labels:
  6.    app: webapp
  7. spec:
  8.  hostNetwork: true
  9.  containers:
  10.  - name: webapp
  11.    image: tomcat
  12.    ports:
  13.    - containerPort: 8080
2.将Service的端口号映射到物理机

a.通过配置nodePort映射到物理机,同时设置Service的类型为NodePort

点击(此处)折叠或打开

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     app: nginx
  7. spec:
  8.  type: NodePort
  9.  ports:
  10.  - port: 80
  11.  targetPort: 8080
  12.  nodePort: 8081
  13.  selector:
  14.   app: nginx
b.通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI