在阿里云售前工程师来公司做技术宣讲前,购买阿里云 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。