diff --git a/artifacts/flagger/crd.yaml b/artifacts/flagger/crd.yaml index 19b24319..9f93d4ea 100644 --- a/artifacts/flagger/crd.yaml +++ b/artifacts/flagger/crd.yaml @@ -158,6 +158,9 @@ spec: portName: description: Container port name type: string + appProtocol: + description: Application protocol of the port + type: string targetPort: description: Container target port name x-kubernetes-int-or-string: true diff --git a/docs/gitbook/usage/how-it-works.md b/docs/gitbook/usage/how-it-works.md index 58a5802f..45fb5d9e 100644 --- a/docs/gitbook/usage/how-it-works.md +++ b/docs/gitbook/usage/how-it-works.md @@ -134,6 +134,7 @@ spec: name: podinfo port: 9898 portName: http + appProtocol: http targetPort: 9898 portDiscovery: true ``` @@ -142,6 +143,7 @@ The container port from the target workload should match the `service.port` or ` The `service.name` is optional, defaults to `spec.targetRef.name`. The `service.targetPort` can be a container port number or name. The `service.portName` is optional (defaults to `http`), if your workload uses gRPC then set the port name to `grpc`. +The `service.appProtocol` is optional, more details can be found [here](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol). If port discovery is enabled, Flagger scans the target workload and extracts the containers ports excluding the port specified in the canary service and service mesh sidecar ports. diff --git a/pkg/apis/flagger/v1beta1/canary.go b/pkg/apis/flagger/v1beta1/canary.go index 13a45a10..f56916fb 100644 --- a/pkg/apis/flagger/v1beta1/canary.go +++ b/pkg/apis/flagger/v1beta1/canary.go @@ -128,6 +128,11 @@ type CanaryService struct { // +optional TargetPort intstr.IntOrString `json:"targetPort,omitempty"` + // AppProtocol of the service + // https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol + // +optional + AppProtocol string `json:"appProtocol,omitempty"` + // PortDiscovery adds all container ports to the generated Kubernetes service PortDiscovery bool `json:"portDiscovery"` diff --git a/pkg/router/kubernetes_default.go b/pkg/router/kubernetes_default.go index 118d5ab0..61ffd7fd 100644 --- a/pkg/router/kubernetes_default.go +++ b/pkg/router/kubernetes_default.go @@ -114,6 +114,10 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam }, } + if v := canary.Spec.Service.AppProtocol; v != "" { + svcSpec.Ports[0].AppProtocol = &v + } + // set additional ports for n, p := range c.ports { cp := corev1.ServicePort{ diff --git a/pkg/router/kubernetes_default_test.go b/pkg/router/kubernetes_default_test.go index a1888341..9d4648f6 100644 --- a/pkg/router/kubernetes_default_test.go +++ b/pkg/router/kubernetes_default_test.go @@ -39,6 +39,7 @@ func TestServiceRouter_Create(t *testing.T) { flaggerClient: mocks.flaggerClient, logger: mocks.logger, } + appProtocol := "http" err := router.Initialize(mocks.canary) require.NoError(t, err) @@ -49,6 +50,7 @@ func TestServiceRouter_Create(t *testing.T) { canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) + assert.Equal(t, &appProtocol, canarySvc.Spec.Ports[0].AppProtocol) assert.Equal(t, "http", canarySvc.Spec.Ports[0].Name) assert.Equal(t, int32(9898), canarySvc.Spec.Ports[0].Port) diff --git a/pkg/router/router_test.go b/pkg/router/router_test.go index 9f52cbc1..fdf33530 100644 --- a/pkg/router/router_test.go +++ b/pkg/router/router_test.go @@ -100,6 +100,7 @@ func newTestCanary() *flaggerv1.Canary { Service: flaggerv1.CanaryService{ Port: 9898, PortDiscovery: true, + AppProtocol: "http", Headers: &istiov1alpha3.Headers{ Request: &istiov1alpha3.HeaderOperations{ Add: map[string]string{