网络插件 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。

None None

评论