自学k8s系列~05之Service
Service作用
- Service 通过
label
将Pod
聚合起来。 - 为这一组
Pod
提供统一的访问入口(IP和域名)。 - 将访问的请求负载到
Pod
上。
Pod
是容器的载体本身是不稳定的,但是 Service
是稳定的。
Service定义
1 | apiVersion: v1 # Required |
Service的基本使用
1 | apiVersion: v1 |
kind 指定 Service
, selector 选择指定的 label
,会将 label
包含 app:web
的所有 Pod
都加到这个 Service
中来。
1 | kubectl apply -f ./service_create.yaml |
Service的访问
- IP:
Service
拥有自己的 IP 可以使用该 IP 进行访问,访问进来后会将请求负载到某一个Pod
上。 - DNS:
Service
也可以通过域名进行访问。DNS 需要部署core-dns
或其他 DNS 组件,后面专门研究。
Service负载策略
- RoundRobin: 轮询模式,即每一次请求都按次序分发到每一个
Pod
上。 - SessionAffinity: 会话亲和模式,即基于客户端 IP 进行会话保持,第一次将请求分发到哪一个
Pod
之后的请求全都分发到该Pod
上。
Service多端口
同协议:需要指定名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
selector:
app: webapp
ports:
- port: 8081 #第一个端口
targetPort: 8081
name: web
- port: 8002 #第二个端口
targetPort: 8002
name: manager不同协议
1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
selector:
app: webapp
ports:
- name: dns
port: 53
portocol: UDP #指定 UDP 协议
- name: dns-tcp
port: 53
portocol: TCP #指定 TCP 协议
外部服务Service
场景:需要将数据库或其他 namespace 中的服务做为后端服务。可以创建一个没有 label selector 的 Service。然后再手动创建一个和 Service 同名的 Endpoints
。
Service
1
2
3
4
5
6
7
8apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
ports:
- port: 8081
targetPort: 8081EndPoint
1
2
3
4
5
6
7
8
9apiVersion: v1
kind: Service
metadata:
name: webapp
subsets:
- address:
- IP: 1.2.3.4
ports:
- port: 8081
集群外访问Service
Pod
和 Service
都是 k8s 中的概念,对于外部来说都是无法感知的。为了让宿主机能够访问这些服务,可以将Pod
或 Service
的端口号映射到宿主机,使客户端能够通过物理机访问容器内的应用。
将Pod的端口号映射到宿主机
端口映射
- 创建 nginx 的 Pod
1 | apiVersion: v1 |
1 | kubectl apply -f ./pod_mapping.yaml |
- 查看 Pod 状态
1 | kubectl get pod nginx |
如果看 STATUS 状态不是 Running 的话,说明该 Pod 未启动成功
- 登录 Node 访问该端口
1 | minikube ssh |
使用 kubectl get node -o wide 可以查看 Node 的 IP 地址
- 在查看
Pod
的日志
1 | kubectl logs -f nginx |
设置hostNetwork
通过设置 hostNetwork=true 将 Pod
中的端口暴露出来,本质上也是暴露端口,只是 hostNetwork 是将所有端口都暴露。
- 创建
Pod
1 | apiVersion: v1 |
1 | kubectl apply -f ./pod_mapping.yaml |
后面操作与上面一致,登录 node 访问nginx,通过查看日志判断是否有请求到。
将Service的端口号映射到宿主机
映射Service端口
- 创建
Service
1 | apiVersion: v1 |
1 | kubectl apply -f ./service_mapping.yaml |
- 访问 nginx
1 | curl 127.0.0.1:30000 |
- 通过查看 nginx
Pod
的日志判断是否请求进来
设置 LoadBalancer
例如: 阿里云 SLB
DNS服务
Kubernetes 1.11 版本开始, DNS 服务由 CoreDNS 提供。
Ingress: HTTP 7层路由
在我们部署应用时,我们很多时候的需求是这样的:
https://xxx.xx/api 希望将请求打到 api 的 Service
上;
https://xxx.xx/web 希望将请求打到 web 的 Service
上;
同时,我们的端口是同一个端口。即是通过 uri
来区分不同的服务。这个功能就需要使用到 Ingress
来进行 HTTP 层的路由转发。