阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案;另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似,不同的地方在于 terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。

Service

在 Kubernetes (k8s) 中,Service 对象定义了一种访问 Pod 组的方式,它提供了负载均衡和名称解析。Service 有几种不同的类型,每种类型都适用于特定的使用场景:

1、ClusterIP:

这是默认的 Service 类型,它为 Service 分配一个内部的 IP 地址,使得 Service 只能在集群内部访问。

适用于内部通信,例如,当你需要让集群内的其他组件访问某个应用时。

2、NodePort:

它为 Service 分配一个静态端口,并在集群的所有节点上公开该端口。

适用于需要从集群外部访问服务的情况,但不需要负载均衡器的情况。

3、LoadBalancer:

这个 Service 类型通常与云提供商的负载均衡服务集成,为 Service 分配一个外部可访问的负载均衡器。

适用于需要从互联网访问服务的情况,并且需要负载均衡和自动扩展的场景。

4、ExternalName:

它允许将 Service 定义为对外部服务的引用,例如,将 Service 指向一个外部的 DNS 名称。

适用于需要将集群内的服务路由到集群外部的服务或组件的情况。

选择哪种类型的 Service 取决于你的应用程序需求和部署环境。例如,如果你的服务需要从外部网络访问,那么 NodePort 或 LoadBalancer 可能是更好的选择。如果你的服务只在集群内部使用,那么 ClusterIP 就足够了。如果你需要将服务指向集群外部的某个服务,那么 ExternalName 是合适的选择。

1
2
3
# iptables/ipvs 查询当前记录的命令
iptables-save
ipvsadm -Ln

Headless Service

上面我们讲解了service的使用方法和实现逻辑,主要就是代理一组pod容器提供负载均衡以及反向代理服务。但是有时候我们不需要这种负载均衡,比如下面的两个场景:

  1. K8S部署某个kafka集群,此时就不需要service来负载均衡,客户端需要的是一组pod所有ip的列表。
  2. 客户端自己处理负载均衡的逻辑,比如K8S部署两个mysql,客户端自己处理负载请求,或者根本不处理这种负载,就要两套mysql然后手动控制读写请求。

基于上面的两个场景,K8S提供了headless serivce功能,字面意思是无头service,其实就是该service不显式的对外提供IP。

创建该类型Service的yaml例子如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Service
metadata:
  name: svr-mysql-ha1
  namespace: mysql
spec:
  clusterIP: None # 如此配置即开启了headless serivce
  ports:
  - name: 3306-3306
    protocol: TCP
    port: 3306
    targetPort: 3306
  selector:
    app: stf-mysql-ha1
  
# 得到下面结果
[root@k8smaster1 bmc]# kubectl get service -n mysql
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
svr-mysql-ha1   ClusterIP   None         <none>        3306/TCP   176m

最后说一嘴,headless service一般结合StatefulSet来部署有状态的应用,比如大数据组件或者nosql数据库等,这种分布式的系统需要headless service来获取所有节点ip的列表供业务场景使用。

参考阅读:

https://spring4all.com/forum-post/5891.html

https://blog.51cto.com/u_16213568/11364577

https://zhuanlan.zhihu.com/p/85718161

https://blog.csdn.net/weixin_64124795/article/details/130952239

(完)