一,前言
上一篇,通过配置一个 Deployment 对象,在内部创建副本集对象,副本集帮我们创建了 3 个 pod 副本
由于 pod 存在 IP 漂移现象,pod 的创建和重启会导致 IP 变化;
本篇,介绍 Service 服务,解决 pod 的 IP 漂移问题;
二,Service 介绍
- deployment 是无状态的
- deployment 并不会对 pod 进行网络通信和分发
- Pod 的 IP 在运行时还会经常进行漂移且不固定
- 想访问服务需要使用 Service 组织统一的 Pod 访问入口
- 可以定义Service 来进行统一组织 Pod 服务访问
- 负责自动调度和组织deployment中 Pod 的服务访问,由于自动映射 Pod 的IP,同时也解决了 Pod 的IP漂移问题
三,Pod 的 ip 漂移问题
上图有 3 个 node 节点,访问节点 3000 端口,请求会统一转发到 service,由 service 负载均衡分发到 pod 节点;
在每个 node 节点上监听一个端口(如 3000),客户端(即浏览器)访问每个节点的 3000 端口都会访问到 Service 服务(Service 有固定 IP 和端口号),通过 Service 转发给 pod
Service 负责调度和组织 deployment 中 Pod 完成服务访问,Service 会自动映射 Pod 的 IP(即 Service知道每个 pod 对应的真实 ip ),这样就解决了 Pod 的 IP 漂移问题(pod 的 ip 可能会发生变化,但有固定 IP 和端口的 Service 服务可以找到 pod)
四,创建 Service 配置文件
NodePort 将会在所有节点上开放一个特定端口,任何发送到该端口的流量都将被转发到对应的服务上;
字段 | 说明 |
---|---|
protocol | 通信类型(TCP/UDP) |
targetPort | 原本 Pod 开放的端口 |
port | Kubernetes 容器之间互相访问的端口 |
type | NodePort,Service 的一种访问方式 |
创建 Service 配置文件:user-service-v1.yaml
[root@k8s-master ~]# ls
deployment init-kubeadm.conf kube-flannel.yml mysql.yaml
[root@k8s-master ~]# cd deployment/
[root@k8s-master deployment]# ls
deployment-user-v1.yaml
[root@k8s-master deployment]# vi user-service-v1.yaml
配置信息:
apiVersion: v1
kind: Service #类型
metadata:
name: service-user-v1
spec:
selector:
app: user-v1
ports:
- protocol: TCP #协议
port: 80 #nginx端口
targetPort: 80
type: NodePort #节点端口号,不指定随机
五,启动 Service
// 根据配置文件启动 Service
[root@k8s-master deployment]# kubectl apply -f user-service-v1.yaml
service/service-user-v1 created
六,查看当前的服务
// 查看当前服务
[root@k8s-master deployment]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35h
nginx NodePort 10.107.223.32 <none> 80:32117/TCP 21h
service-user-v1 NodePort 10.104.13.40 <none> 80:31071/TCP 55s
七,访问 Service
1,可以在任何节点上访问
// master 访问
[root@k8s-master ~]# curl http://172.17.178.105:31071
user-v1
[root@k8s-master ~]# curl http://172.17.178.106:31071
user-v1
// node 访问
[root@k8s-node ~]# curl http://172.17.178.105:31071
user-v1
[root@k8s-node ~]# curl http://172.17.178.106:31071
user-v1
2,通过浏览器访问公网地址
http://47.93.9.45:31071/
问题:浏览器会转框卡住
原因:由于防火墙导致
两种解决方法:
1,到阿里云安全规则配置开放端口
2,换成一个已经开放的端口,比如:8080
开放端口号:31071
重新访问,成功:
结尾
本篇,主要介绍了 Service 相关内容,包含创建、启动、访问、以及 pod 的 id 漂移;
下一篇,继续介绍 Ingress;