@@ -23,8 +23,10 @@ import (
23
23
"time"
24
24
25
25
v1 "k8s.io/api/core/v1"
26
+ v1_networking "k8s.io/api/networking/v1"
26
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
28
typed_core "k8s.io/client-go/kubernetes/typed/core/v1"
29
+ typed_networking "k8s.io/client-go/kubernetes/typed/networking/v1"
28
30
29
31
"k8s.io/klog/v2"
30
32
"k8s.io/minikube/pkg/minikube/tunnel"
@@ -36,19 +38,21 @@ type SSHTunnel struct {
36
38
sshPort string
37
39
sshKey string
38
40
v1Core typed_core.CoreV1Interface
41
+ v1Networking typed_networking.NetworkingV1Interface
39
42
LoadBalancerEmulator tunnel.LoadBalancerEmulator
40
43
conns map [string ]* sshConn
41
44
connsToStop map [string ]* sshConn
42
45
}
43
46
44
47
// NewSSHTunnel ...
45
- func NewSSHTunnel (ctx context.Context , sshPort , sshKey string , v1Core typed_core.CoreV1Interface ) * SSHTunnel {
48
+ func NewSSHTunnel (ctx context.Context , sshPort , sshKey string , v1Core typed_core.CoreV1Interface , v1Networking typed_networking. NetworkingV1Interface ) * SSHTunnel {
46
49
return & SSHTunnel {
47
50
ctx : ctx ,
48
51
sshPort : sshPort ,
49
52
sshKey : sshKey ,
50
53
v1Core : v1Core ,
51
54
LoadBalancerEmulator : tunnel .NewLoadBalancerEmulator (v1Core ),
55
+ v1Networking : v1Networking ,
52
56
conns : make (map [string ]* sshConn ),
53
57
connsToStop : make (map [string ]* sshConn ),
54
58
}
@@ -73,6 +77,11 @@ func (t *SSHTunnel) Start() error {
73
77
klog .Errorf ("error listing services: %v" , err )
74
78
}
75
79
80
+ ingresses , err := t .v1Networking .Ingresses ("" ).List (context .Background (), metav1.ListOptions {})
81
+ if err != nil {
82
+ klog .Errorf ("error listing ingresses: %v" , err )
83
+ }
84
+
76
85
t .markConnectionsToBeStopped ()
77
86
78
87
for _ , svc := range services .Items {
@@ -81,6 +90,10 @@ func (t *SSHTunnel) Start() error {
81
90
}
82
91
}
83
92
93
+ for _ , ingress := range ingresses .Items {
94
+ t .startConnectionIngress (ingress )
95
+ }
96
+
84
97
t .stopMarkedConnections ()
85
98
86
99
// TODO: which time to use?
@@ -104,8 +117,14 @@ func (t *SSHTunnel) startConnection(svc v1.Service) {
104
117
return
105
118
}
106
119
120
+ resourcePorts := []int32 {}
121
+
122
+ for _ , port := range svc .Spec .Ports {
123
+ resourcePorts = append (resourcePorts , port .Port )
124
+ }
125
+
107
126
// create new ssh conn
108
- newSSHConn := createSSHConn (uniqName , t .sshPort , t .sshKey , & svc )
127
+ newSSHConn := createSSHConn (uniqName , t .sshPort , t .sshKey , resourcePorts , svc . Spec . ClusterIP , svc . Name )
109
128
t .conns [newSSHConn .name ] = newSSHConn
110
129
111
130
go func () {
@@ -121,6 +140,31 @@ func (t *SSHTunnel) startConnection(svc v1.Service) {
121
140
}
122
141
}
123
142
143
+ func (t * SSHTunnel ) startConnectionIngress (ingress v1_networking.Ingress ) {
144
+ uniqName := sshConnUniqNameIngress (ingress )
145
+ existingSSHConn , ok := t .conns [uniqName ]
146
+
147
+ if ok {
148
+ // if the svc still exist we remove the conn from the stopping list
149
+ delete (t .connsToStop , existingSSHConn .name )
150
+ return
151
+ }
152
+
153
+ resourcePorts := []int32 {80 , 443 }
154
+ resourceIP := "127.0.0.1"
155
+
156
+ // create new ssh conn
157
+ newSSHConn := createSSHConn (uniqName , t .sshPort , t .sshKey , resourcePorts , resourceIP , ingress .Name )
158
+ t .conns [newSSHConn .name ] = newSSHConn
159
+
160
+ go func () {
161
+ err := newSSHConn .startAndWait ()
162
+ if err != nil {
163
+ klog .Errorf ("error starting ssh tunnel: %v" , err )
164
+ }
165
+ }()
166
+ }
167
+
124
168
func (t * SSHTunnel ) stopActiveConnections () {
125
169
for _ , conn := range t .conns {
126
170
err := conn .stop ()
@@ -157,3 +201,13 @@ func sshConnUniqName(service v1.Service) string {
157
201
158
202
return strings .Join (n , "" )
159
203
}
204
+
205
+ func sshConnUniqNameIngress (ingress v1_networking.Ingress ) string {
206
+ n := []string {ingress .Name }
207
+
208
+ for _ , rule := range ingress .Spec .Rules {
209
+ n = append (n , rule .Host )
210
+ }
211
+
212
+ return strings .Join (n , "" )
213
+ }
0 commit comments