@@ -77,6 +77,7 @@ func BuildEgressEndpointMap(
77
77
}
78
78
79
79
func BuildIngressEndpointMap (
80
+ ctx context.Context ,
80
81
mesh * core_mesh.MeshResource ,
81
82
localZone string ,
82
83
meshServicesByName map [model.ResourceIdentifier ]* meshservice_api.MeshServiceResource ,
@@ -86,15 +87,17 @@ func BuildIngressEndpointMap(
86
87
externalServices []* core_mesh.ExternalServiceResource ,
87
88
gateways []* core_mesh.MeshGatewayResource ,
88
89
zoneEgresses []* core_mesh.ZoneEgressResource ,
90
+ loader datasource.Loader ,
89
91
) core_xds.EndpointMap {
90
92
// Build EDS endpoint map just like for regular DPP, but without list of Ingress.
91
93
// This way we only keep local endpoints.
92
- outbound := BuildEdsEndpointMap (mesh , localZone , meshServicesByName , meshMultiZoneServices , meshExternalServices , dataplanes , nil , zoneEgresses , externalServices )
94
+ outbound := BuildEdsEndpointMap (ctx , mesh , localZone , meshServicesByName , meshMultiZoneServices , meshExternalServices , dataplanes , nil , zoneEgresses , externalServices , loader )
93
95
fillLocalCrossMeshOutbounds (outbound , mesh , dataplanes , gateways , 1 , localZone )
94
96
return outbound
95
97
}
96
98
97
99
func BuildEdsEndpointMap (
100
+ ctx context.Context ,
98
101
mesh * core_mesh.MeshResource ,
99
102
localZone string ,
100
103
meshServicesByName map [model.ResourceIdentifier ]* meshservice_api.MeshServiceResource ,
@@ -104,6 +107,7 @@ func BuildEdsEndpointMap(
104
107
zoneIngresses []* core_mesh.ZoneIngressResource ,
105
108
zoneEgresses []* core_mesh.ZoneEgressResource ,
106
109
externalServices []* core_mesh.ExternalServiceResource ,
110
+ loader datasource.Loader ,
107
111
) core_xds.EndpointMap {
108
112
outbound := core_xds.EndpointMap {}
109
113
@@ -127,7 +131,7 @@ func BuildEdsEndpointMap(
127
131
128
132
fillRemoteMeshServices (outbound , meshServices , zoneIngresses , mesh , localZone )
129
133
130
- fillExternalServicesOutboundsThroughEgress (outbound , externalServices , meshExternalServices , zoneEgresses , mesh , localZone )
134
+ fillExternalServicesOutboundsThroughEgress (ctx , outbound , externalServices , meshExternalServices , zoneEgresses , mesh , localZone , loader )
131
135
132
136
// it has to be last because it reuses endpoints for other cases
133
137
fillMeshMultiZoneServices (outbound , meshServicesByName , meshMultiZoneServices )
@@ -657,70 +661,9 @@ func createMeshExternalServiceEndpoint(
657
661
meshName := mesh .GetMeta ().GetName ()
658
662
tls := mes .Spec .Tls
659
663
if tls != nil && tls .Enabled {
660
- var caCert , clientCert , clientKey []byte
661
- es .TLSEnabled = tls .Enabled
662
- es .FallbackToSystemCa = true
663
- es .AllowRenegotiation = tls .AllowRenegotiation
664
-
665
- var err error
666
- if tls .Verification != nil {
667
- if tls .Verification .CaCert != nil {
668
- caCert , err = loadBytes (ctx , tls .Verification .CaCert .ConvertToProto (), meshName , loader )
669
- if err != nil {
670
- return errors .Wrap (err , "could not load caCert" )
671
- }
672
- es .CaCert = caCert
673
- }
674
- if tls .Verification .ClientKey != nil && tls .Verification .ClientCert != nil {
675
- clientCert , err = loadBytes (ctx , tls .Verification .ClientCert .ConvertToProto (), meshName , loader )
676
- if err != nil {
677
- return errors .Wrap (err , "could not load clientCert" )
678
- }
679
- clientKey , err = loadBytes (ctx , tls .Verification .ClientKey .ConvertToProto (), meshName , loader )
680
- if err != nil {
681
- return errors .Wrap (err , "could not load clientKey" )
682
- }
683
- es .ClientCert = clientCert
684
- es .ClientKey = clientKey
685
- }
686
- if pointer .Deref (tls .Verification .ServerName ) != "" {
687
- es .ServerName = pointer .Deref (tls .Verification .ServerName )
688
- }
689
- for _ , san := range pointer .Deref (tls .Verification .SubjectAltNames ) {
690
- es .SANs = append (es .SANs , core_xds.SAN {
691
- MatchType : core_xds .MatchType (san .Type ),
692
- Value : san .Value ,
693
- })
694
- }
695
- if tls .Version != nil {
696
- if tls .Version .Min != nil {
697
- es .MinTlsVersion = pointer .To (common_tls .ToTlsVersion (tls .Version .Min ))
698
- }
699
- if tls .Version .Max != nil {
700
- es .MaxTlsVersion = pointer .To (common_tls .ToTlsVersion (tls .Version .Max ))
701
- }
702
- }
703
- // Server name and SNI we need to add
704
- // mes.Spec.Tls.Verification.SubjectAltNames
705
- if tls .Verification .Mode != nil {
706
- switch * tls .Verification .Mode {
707
- case meshexternalservice_api .TLSVerificationSkipSAN :
708
- es .ServerName = ""
709
- es .SANs = []core_xds.SAN {}
710
- es .SkipHostnameVerification = true
711
- case meshexternalservice_api .TLSVerificationSkipCA :
712
- es .CaCert = nil
713
- es .FallbackToSystemCa = false
714
- case meshexternalservice_api .TLSVerificationSkipAll :
715
- es .FallbackToSystemCa = false
716
- es .CaCert = nil
717
- es .ClientKey = nil
718
- es .ClientCert = nil
719
- es .ServerName = ""
720
- es .SANs = []core_xds.SAN {}
721
- es .SkipHostnameVerification = true
722
- }
723
- }
664
+ err := setTlsConfiguration (ctx , tls , es , meshName , loader )
665
+ if err != nil {
666
+ return err
724
667
}
725
668
}
726
669
@@ -742,6 +685,75 @@ func createMeshExternalServiceEndpoint(
742
685
return nil
743
686
}
744
687
688
+ func setTlsConfiguration (ctx context.Context , tls * meshexternalservice_api.Tls , es * core_xds.ExternalService , meshName string , loader datasource.Loader ) error {
689
+ var caCert , clientCert , clientKey []byte
690
+ es .TLSEnabled = tls .Enabled
691
+ es .FallbackToSystemCa = true
692
+ es .AllowRenegotiation = tls .AllowRenegotiation
693
+
694
+ if tls .Version != nil {
695
+ if tls .Version .Min != nil {
696
+ es .MinTlsVersion = pointer .To (common_tls .ToTlsVersion (tls .Version .Min ))
697
+ }
698
+ if tls .Version .Max != nil {
699
+ es .MaxTlsVersion = pointer .To (common_tls .ToTlsVersion (tls .Version .Max ))
700
+ }
701
+ }
702
+ var err error
703
+ if tls .Verification != nil {
704
+ if tls .Verification .CaCert != nil {
705
+ caCert , err = loadBytes (ctx , tls .Verification .CaCert .ConvertToProto (), meshName , loader )
706
+ if err != nil {
707
+ return errors .Wrap (err , "could not load caCert" )
708
+ }
709
+ es .CaCert = caCert
710
+ }
711
+ if tls .Verification .ClientKey != nil && tls .Verification .ClientCert != nil {
712
+ clientCert , err = loadBytes (ctx , tls .Verification .ClientCert .ConvertToProto (), meshName , loader )
713
+ if err != nil {
714
+ return errors .Wrap (err , "could not load clientCert" )
715
+ }
716
+ clientKey , err = loadBytes (ctx , tls .Verification .ClientKey .ConvertToProto (), meshName , loader )
717
+ if err != nil {
718
+ return errors .Wrap (err , "could not load clientKey" )
719
+ }
720
+ es .ClientCert = clientCert
721
+ es .ClientKey = clientKey
722
+ }
723
+ if pointer .Deref (tls .Verification .ServerName ) != "" {
724
+ es .ServerName = pointer .Deref (tls .Verification .ServerName )
725
+ }
726
+ for _ , san := range pointer .Deref (tls .Verification .SubjectAltNames ) {
727
+ es .SANs = append (es .SANs , core_xds.SAN {
728
+ MatchType : core_xds .MatchType (san .Type ),
729
+ Value : san .Value ,
730
+ })
731
+ }
732
+ // Server name and SNI we need to add
733
+ // mes.Spec.Tls.Verification.SubjectAltNames
734
+ if tls .Verification .Mode != nil {
735
+ switch * tls .Verification .Mode {
736
+ case meshexternalservice_api .TLSVerificationSkipSAN :
737
+ es .ServerName = ""
738
+ es .SANs = []core_xds.SAN {}
739
+ es .SkipHostnameVerification = true
740
+ case meshexternalservice_api .TLSVerificationSkipCA :
741
+ es .CaCert = nil
742
+ es .FallbackToSystemCa = false
743
+ case meshexternalservice_api .TLSVerificationSkipAll :
744
+ es .FallbackToSystemCa = false
745
+ es .CaCert = nil
746
+ es .ClientKey = nil
747
+ es .ClientCert = nil
748
+ es .ServerName = ""
749
+ es .SANs = []core_xds.SAN {}
750
+ es .SkipHostnameVerification = true
751
+ }
752
+ }
753
+ }
754
+ return nil
755
+ }
756
+
745
757
func createExternalServiceEndpoint (
746
758
ctx context.Context ,
747
759
outbound core_xds.EndpointMap ,
@@ -760,12 +772,14 @@ func createExternalServiceEndpoint(
760
772
}
761
773
762
774
func fillExternalServicesOutboundsThroughEgress (
775
+ ctx context.Context ,
763
776
outbound core_xds.EndpointMap ,
764
777
externalServices []* core_mesh.ExternalServiceResource ,
765
778
meshExternalServices []* meshexternalservice_api.MeshExternalServiceResource ,
766
779
zoneEgresses []* core_mesh.ZoneEgressResource ,
767
780
mesh * core_mesh.MeshResource ,
768
781
localZone string ,
782
+ loader datasource.Loader ,
769
783
) {
770
784
if mesh .ZoneEgressEnabled () {
771
785
for _ , externalService := range externalServices {
@@ -799,6 +813,18 @@ func fillExternalServicesOutboundsThroughEgress(
799
813
serviceTags := maps .Clone (mes .Meta .GetLabels ())
800
814
serviceName := mes .DestinationName (uint32 (mes .Spec .Match .Port ))
801
815
locality := GetLocality (localZone , getZone (serviceTags ), mesh .LocalityAwareLbEnabled ())
816
+ tls := mes .Spec .Tls
817
+ es := & core_xds.ExternalService {
818
+ Protocol : mes .Spec .Match .Protocol ,
819
+ OwnerResource : pointer .To (core_rules .UniqueKey (mes , "" )),
820
+ }
821
+ if tls != nil && tls .Enabled {
822
+ err := setTlsConfiguration (ctx , tls , es , mes .Meta .GetMesh (), loader )
823
+ if err != nil {
824
+ outboundLog .Error (err , "unable to create MeshExternalService endpoint for egress. Endpoint won't be included in the XDS." , "name" , mes .Meta .GetName (), "mesh" , mes .Meta .GetMesh ())
825
+ continue
826
+ }
827
+ }
802
828
803
829
for _ , ze := range zoneEgresses {
804
830
zeNetworking := ze .Spec .GetNetworking ()
@@ -811,12 +837,9 @@ func fillExternalServicesOutboundsThroughEgress(
811
837
Tags : serviceTags ,
812
838
// AS it's a role of zone egress to load balance traffic between
813
839
// instances, we can safely set weight to 1
814
- Weight : 1 ,
815
- Locality : locality ,
816
- ExternalService : & core_xds.ExternalService {
817
- Protocol : mes .Spec .Match .Protocol ,
818
- OwnerResource : pointer .To (core_rules .UniqueKey (mes , "" )),
819
- },
840
+ Weight : 1 ,
841
+ Locality : locality ,
842
+ ExternalService : es ,
820
843
}
821
844
822
845
outbound [serviceName ] = append (outbound [serviceName ], endpoint )
0 commit comments