Create two svc if loadbalancer and use udp/tcp the same time

This commit is contained in:
Hang Yan 2020-11-03 13:09:25 +08:00 committed by GitHub
parent 2dc6037cce
commit c0f485b4e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 167 additions and 19 deletions

13
d.yaml Normal file
View File

@ -0,0 +1,13 @@
version: "2"
services:
nginx:
image: nginx
build: ./foobar
ports:
- "6060:6060/udp"
- "5000:5000"
cap_add:
- ALL
container_name: foobar
labels:
kompose.service.type: loadbalancer

View File

@ -365,6 +365,33 @@ func (k *Kubernetes) PortsExist(service kobject.ServiceConfig) bool {
return len(service.Port) != 0 return len(service.Port) != 0
} }
func (k *Kubernetes) CreateLBService(name string, service kobject.ServiceConfig, objects []runtime.Object) []*api.Service {
var svcs []*api.Service
tcpPorts, udpPorts := k.ConfigLBServicePorts(name, service)
if tcpPorts != nil {
svc := k.initSvcObject(name+"-tcp", service, tcpPorts)
svcs = append(svcs, svc)
}
if udpPorts != nil {
svc := k.initSvcObject(name+"-udp", service, udpPorts)
svcs = append(svcs, svc)
}
return svcs
}
func (k *Kubernetes) initSvcObject(name string, service kobject.ServiceConfig, ports []api.ServicePort) *api.Service {
svc := k.InitSvc(name, service)
svc.Spec.Ports = ports
svc.Spec.Type = api.ServiceType(service.ServiceType)
// Configure annotations
annotations := transformer.ConfigAnnotations(service)
svc.ObjectMeta.Annotations = annotations
return svc
}
// CreateService creates a k8s service // CreateService creates a k8s service
func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, objects []runtime.Object) *api.Service { func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, objects []runtime.Object) *api.Service {
svc := k.InitSvc(name, service) svc := k.InitSvc(name, service)

View File

@ -560,12 +560,45 @@ func (k *Kubernetes) ConfigPorts(name string, service kobject.ServiceConfig) []a
return ports return ports
} }
func (k *Kubernetes) ConfigLBServicePorts(name string, service kobject.ServiceConfig) ([]api.ServicePort, []api.ServicePort) {
var tcpPorts []api.ServicePort
var udpPorts []api.ServicePort
for _, port := range service.Port {
if port.HostPort == 0 {
port.HostPort = port.ContainerPort
}
var targetPort intstr.IntOrString
targetPort.IntVal = port.ContainerPort
targetPort.StrVal = strconv.Itoa(int(port.ContainerPort))
servicePort := api.ServicePort{
Name: strconv.Itoa(int(port.HostPort)),
Port: port.HostPort,
TargetPort: targetPort,
}
// If the default is already TCP, no need to include it.
if port.Protocol != api.ProtocolTCP {
servicePort.Protocol = port.Protocol
}
if port.Protocol == api.ProtocolTCP {
tcpPorts = append(tcpPorts, servicePort)
} else {
udpPorts = append(udpPorts, servicePort)
}
}
return tcpPorts, udpPorts
}
// ConfigServicePorts configure the container service ports. // ConfigServicePorts configure the container service ports.
func (k *Kubernetes) ConfigServicePorts(name string, service kobject.ServiceConfig) []api.ServicePort { func (k *Kubernetes) ConfigServicePorts(name string, service kobject.ServiceConfig) []api.ServicePort {
servicePorts := []api.ServicePort{} servicePorts := []api.ServicePort{}
seenPorts := make(map[int]struct{}, len(service.Port)) seenPorts := make(map[int]struct{}, len(service.Port))
var servicePort api.ServicePort var servicePort api.ServicePort
log.Debugf("fuck ports: %+v", service.Port)
for _, port := range service.Port { for _, port := range service.Port {
if port.HostPort == 0 { if port.HostPort == 0 {
port.HostPort = port.ContainerPort port.HostPort = port.ContainerPort
@ -1163,12 +1196,19 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
} }
if k.PortsExist(service) { if k.PortsExist(service) {
svc := k.CreateService(name, service, objects) if service.ServiceType == "LoadBalancer" {
objects = append(objects, svc) svcs := k.CreateLBService(name, service, objects)
for _, svc := range svcs {
if service.ExposeService != "" { objects = append(objects, svc)
objects = append(objects, k.initIngress(name, service, svc.Spec.Ports[0].Port)) }
} else {
svc := k.CreateService(name, service, objects)
objects = append(objects, svc)
if service.ExposeService != "" {
objects = append(objects, k.initIngress(name, service, svc.Spec.Ports[0].Port))
}
} }
} else { } else {
if service.ServiceType == "Headless" { if service.ServiceType == "Headless" {
svc := k.CreateHeadlessService(name, service, objects) svc := k.CreateHeadlessService(name, service, objects)

View File

@ -400,12 +400,20 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
} }
if o.PortsExist(service) { if o.PortsExist(service) {
svc := o.CreateService(name, service, objects) if service.ServiceType == "LoadBalancer" {
objects = append(objects, svc) svcs := o.CreateLBService(name, service, objects)
for _, svc := range svcs {
objects = append(objects, svc)
}
} else {
svc := o.CreateService(name, service, objects)
objects = append(objects, svc)
if service.ExposeService != "" { if service.ExposeService != "" {
objects = append(objects, o.initRoute(name, service, svc.Spec.Ports[0].Port)) objects = append(objects, o.initRoute(name, service, svc.Spec.Ports[0].Port))
}
} }
} else if service.ServiceType == "Headless" { } else if service.ServiceType == "Headless" {
svc := o.CreateHeadlessService(name, service, objects) svc := o.CreateHeadlessService(name, service, objects)
objects = append(objects, svc) objects = append(objects, svc)

View File

@ -18,6 +18,8 @@ services:
redis: redis:
image: redis:3.0 image: redis:3.0
labels:
kompose.service.type: loadbalancer
ports: ports:
- "6379/tcp" - "6379/tcp"
- "1234:1235/udp" - "1234:1235/udp"

View File

@ -44,10 +44,13 @@
"kind": "Service", "kind": "Service",
"apiVersion": "v1", "apiVersion": "v1",
"metadata": { "metadata": {
"name": "redis", "name": "redis-tcp",
"creationTimestamp": null, "creationTimestamp": null,
"labels": { "labels": {
"io.kompose.service": "redis" "io.kompose.service": "redis-tcp"
},
"annotations": {
"kompose.service.type": "loadbalancer"
} }
}, },
"spec": { "spec": {
@ -56,7 +59,32 @@
"name": "6379", "name": "6379",
"port": 6379, "port": 6379,
"targetPort": 6379 "targetPort": 6379
}, }
],
"selector": {
"io.kompose.service": "redis-tcp"
},
"type": "LoadBalancer"
},
"status": {
"loadBalancer": {}
}
},
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "redis-udp",
"creationTimestamp": null,
"labels": {
"io.kompose.service": "redis-udp"
},
"annotations": {
"kompose.service.type": "loadbalancer"
}
},
"spec": {
"ports": [
{ {
"name": "1234", "name": "1234",
"protocol": "UDP", "protocol": "UDP",
@ -65,8 +93,9 @@
} }
], ],
"selector": { "selector": {
"io.kompose.service": "redis" "io.kompose.service": "redis-udp"
} },
"type": "LoadBalancer"
}, },
"status": { "status": {
"loadBalancer": {} "loadBalancer": {}

View File

@ -44,10 +44,13 @@
"kind": "Service", "kind": "Service",
"apiVersion": "v1", "apiVersion": "v1",
"metadata": { "metadata": {
"name": "redis", "name": "redis-tcp",
"creationTimestamp": null, "creationTimestamp": null,
"labels": { "labels": {
"io.kompose.service": "redis" "io.kompose.service": "redis-tcp"
},
"annotations": {
"kompose.service.type": "loadbalancer"
} }
}, },
"spec": { "spec": {
@ -56,7 +59,32 @@
"name": "6379", "name": "6379",
"port": 6379, "port": 6379,
"targetPort": 6379 "targetPort": 6379
}, }
],
"selector": {
"io.kompose.service": "redis-tcp"
},
"type": "LoadBalancer"
},
"status": {
"loadBalancer": {}
}
},
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "redis-udp",
"creationTimestamp": null,
"labels": {
"io.kompose.service": "redis-udp"
},
"annotations": {
"kompose.service.type": "loadbalancer"
}
},
"spec": {
"ports": [
{ {
"name": "1234", "name": "1234",
"protocol": "UDP", "protocol": "UDP",
@ -65,8 +93,9 @@
} }
], ],
"selector": { "selector": {
"io.kompose.service": "redis" "io.kompose.service": "redis-udp"
} },
"type": "LoadBalancer"
}, },
"status": { "status": {
"loadBalancer": {} "loadBalancer": {}