❝本文转自 mbox.dev,原文:https://mbox.dev/dev/alicloud/terway/,版权归原作者所有。
在阿里云售前工程师来公司做技术宣讲前,购买阿里云 K8s 集群都是用的是传统网络插件 Flannel。宣讲后,被安利了 terway 插件的优势,就是 ip 范围可以无限扩容。这点非常具有诱惑力,所以,这次公司切换新集群就选择了 terway 插件。可是也真是这个 terway 网络插件,搞得 3 天没睡好觉。
问题主要发生的原因是:
❝使用terway 网络插件, 在集群中创建 service 资源,不支持命名目的端口映射,只能使用数字端口。
现实情况是:
创建了一个 Loadbalancer 类型的 service 服务,共享一个相同的 VIP, 通过不同的对外端口映射集群内网服务。
因为 terway 网络插件不支持命名目的端口映射,而内部服务虽然名称不同但是都会监听在相同的端口上进行服务。这点在 flannel 插件上运行完好的服务,到了 terway 网络插件就完全不可用了。
在 flannel 网络插件上,如下部署 LB 服务:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app.kubernetes.io/name: proxy
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
name: http-web-001
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app.kubernetes.io/name: proxy
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
name: http-web-002
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app.kubernetes.io/name: proxy
type: LoadBalancer
ports:
- name: name-of-service-port-001
protocol: TCP
port: 8001
targetPort: http-web-001 ## 目的端口使用名称映射
- name: name-of-service-port-002
protocol: TCP
port: 8002
targetPort: http-web-002 ## 目的端口使用名称映射
到了 terway 网络插件上,就只能分开部署:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-001
spec:
selector:
app.kubernetes.io/name: proxy
type: LoadBalancer
ports:
- name: name-of-service-port-001
protocol: TCP
port: 8001
targetPort: 80 ## 目的端口只能使用数字
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service-002
type: LoadBalancer
spec:
selector:
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port-002
protocol: TCP
port: 8002
targetPort: 80 ## 目的端口只能使用数字
很明显这样的操作方式非常别扭,为了增加端口,必须增加 service 资源,否则相同的目的端口 80 就无法映射。
而且分开部署的同时又会动态创建新的 LB 资源 IP, 为了实现多个 service 资源共享同一个 IP 资源。又必须加上阿里云集群特有的 annotations. 虽然非常不愿意在项目的部署配置上加上定制化的配置,但是为了完成工作还是必须这么干。
结果阿里云给的共享 IP 的文档真的很难找,经过发起工单,各种交互终完成了需要的效果。
这里简单记录一下,阿里集群上如何共享 LB 资源 IP。
手动创建一个 LB 资源,获得 LB 资源的 id 号,以及固定 IP。 在 service 资源的 annotations 上增加以下配置:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-001
annotations: # aliyun 固定 LB 资源配置
service.beta.kubernetes.io/alicloud-loadbalancer-id: [$SLB_ID]
service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
spec:
selector:
app.kubernetes.io/name: proxy
type: LoadBalancer
ports:
- name: name-of-service-port-001
protocol: TCP
port: 8001
targetPort: 80 ## 目的端口只能使用数字
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service-002
annotations: # aliyun 固定 LB 资源配置
service.beta.kubernetes.io/alicloud-loadbalancer-id: [$SLB_ID]
service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
type: LoadBalancer
spec:
selector:
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port-002
protocol: TCP
port: 8002
targetPort: 80 ## 目的端口只能使用数字
总结下来文字不多,但字字带泪,不记录一下实在对不起处理过程中出现的各种 emo。