Kubernetes Service基础

Kubernetes可以为一组具有相同功能的Pod提供一个统一的入口地址,并且将请求均衡的转发到各个对应的Pod上。本节主要记录Service的一些基本用法。

基本用法

创建一个Tomcat RC(tomcat-rc.yml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat-rc
spec:
replicas: 2
selector:
name: tomcat
template:
metadata:
name: tomcat
labels:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080

创建该RC:

QQ截图20191109095409.png

我们可以通过Node IP + Container Port在Kubernetes集群中访问Tomcat:

QQ截图20191109095554.png

由于Pod是Kubernetes集群范围内的虚拟概念,集群外的客户端无法通过Pod的IP和端口访问,我们可以将Pod的端口号映射到宿主机,以使客户端应用能够通过物理机访问容器应用,修改刚刚的tomcat-rc.yml,添加hostPort:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat-rc
spec:
replicas: 2
selector:
name: tomcat
template:
metadata:
name: tomcat
labels:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
hostPort: 8081 # 新增

更新该RC:

QQ截图20191109100036.png

可以看到tomcat pod被分配到了node1和node2上,所以我们可以在宿主机外使用或者访问tomcat:

QQ截图20191109100307.png

但是我们知道,Pod的IP地址是不可靠的,例如当Pod所在的Node发生故障时,Pod将被Kubernetes重新调度到另一个Node,Pod的IP地址将发生变化。所以我们可以定义一个tomcat pod的统一访问入口,这就是Service的作用。

创建Service有两种方式:

1.kubectl expose命令来创建Service

1
kubectl expose rc tomcat-rc

QQ截图20191109100642.png

现在我们就可以通过Service的clusterIP + Port来访问了:

QQ截图20191109100757.png

Service地址10.1.187.222:8080均衡的负载到了两个tomcat pod上(10.244.1.19:8080和10.244.4.13:8080)

2.通过配置文件创建

定义一个tomcat-service.yml:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 8081 # service端口
targetPort: 8080 # 目标端口
selector:
name: tomcat # 选择器,选择name=tomcat的pod

创建该Service:

QQ截图20191109101415.png

同样,Service默认是不能外部访问的,如果想让外部能够访问到tomcat service,我们也需要将Service的端口映射到物理机,修改上面的tomcat-service.yml:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
type: NodePort # 新增
ports:
- port: 8081
targetPort: 8080
nodePort: 30000 # 新增
selector:
name: tomcat

上面配置通过设置nodePort(范围30000-32767)映射到物理机,同时设置Service的类型为NodePort,创建该Service:

QQ截图20191109102138.png

现在我们就可以通过宿主机的IP+30000访问tomcat了:

QQ截图20191109102418.png

负载均衡策略

Kubernetes Service提供了两种负载分发策略:RoundRobin和SessionAffinity:

  1. RoundRobin:轮询模式(默认),即轮询将请求转发到后端的各个Pod上。
  2. SessionAffinity:基于客户端IP地址进行会话保持的模式,即第1次将某个客户端发起的请求转发到后端的某个Pod上,之后从相同的客户端发起的请求都将被转发到后端相同的Pod上。可以通过设置service.spec.sessionAffinity=ClientIP来启用SessionAffinity策略:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: Service
    metadata:
    name: tomcat-service
    spec:
    type: NodePort
    sessionAffinity: ClientIP # 采用SessionAffinity策略
    ports:
    - port: 8081
    targetPort: 8080
    nodePort: 30000
    selector:
    name: tomcat

Headless Service

Headless Service不提供ClusterIP,仅通过Label Selector将后端的Pod列表返回给调用的客户端。

创建tomcat-headless-service.yml:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Service
metadata:
name: tomcat-headless-service
spec:
ports:
- port: 8080
clusterIP: None # 设置clusterIP为None,表示headless service
selector:
name: tomcat

创建该headless service:

QQ截图20191109111632.png

QQ截图20191109111800.png

《Kubernetes权威指南(第4版)》读书笔记

请作者喝瓶肥宅水🥤

0