Kubernetes–Servic

一、容器 / Pod 带来的核心问题

Pod 是临时性资源:Deployment 滚动更新、节点宕机、资源不足驱逐、扩容缩容都会销毁重建 Pod;重建后的 Pod IP、所在节点都会变化。

如果客户端直接写 Pod IP 访问:Pod 一重建,IP 失效,服务调用直接失败;多个 Pod 还要自己做负载均衡、健康检查,很难维护。

二、解决方案:K8s Service(核心)

Service是一组Pod的稳定四层访问入口,提供固定虚拟IP(ClusterIP) + 负载均衡,Service声明周期内ClusterIP永远不变。

底层原理:

Service靠selector标签匹配,去找后端Pod,自动生成维护Endpoints(存储真实PodIP + 端口),Kube-proxy监听Service和Endpoints,

通过iptables/ipvs规则进行负载均衡和流量转发到后端Pod。

三、Service访问类型

1.ClusterIP

默认,集群内访问,分配ClusterIP,集群外不能直接访问。

注意:ClusterIP是碎金分配的,如果想使用固定IP,可以自定义,但IP的范围必须符合CIDR。

使用场景:微服务之间内部调用。

 

查看 CIDR 范围

cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep service-cluster-ip-range

# 有如下信息输出
- --service-cluster-ip-range=10.96.0.0/12

 

2.Externalname

不代理流量,CNAME转发,把service映射到外部域名,无selector。

使用场景:集群内Pod直接访问外部数据库/第三方域名。

 

3.loadbalancer

在nodePort基础上,对接云厂商LB,对外暴露公网IP。

 

4.nodePort

在所有节点打开nodePort端口,ip + 端口,集群内外都能访问。

注意:所有节点上开放同一个静态端口(范围:30000~32767)

底层自动创建ClusterIP,nodePort流量会转发到ClusterIP,再到Pot

 

四、Ingress

Ingress:提供从集群外部到集群内服务的七层路由规则,不能转发流量。

Ingress Controller(控制器):真正干活的反向代理程序,读取Ingress规则,处理外部流量

ps:k8s默认不自带,需要手动安装,常用ingress-nginx

官网地址、可参考写yaml文件:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

获取控制器镜像及资源文件:https://github.com/kubernetes/ingress-nginx

 

思考题

Kube-proxy和Ingress Controller区别?

kube-proxy是集群内部的Service代理,处理四层:ip+端口,依赖CNI网络插件。

Ingresss Controller是集群入口网关,专门处理外部七层: url地址,域名,依赖kube-proxy。