@@ -17,16 +17,22 @@ limitations under the License.
17
17
package kubeadm
18
18
19
19
import (
20
+ "bytes"
20
21
"encoding/json"
22
+ "html/template"
21
23
22
24
"github.com/pkg/errors"
23
25
apierrs "k8s.io/apimachinery/pkg/api/errors"
24
26
"k8s.io/apimachinery/pkg/apis/meta/v1"
27
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
+ "k8s.io/apimachinery/pkg/labels"
25
29
"k8s.io/apimachinery/pkg/types"
26
30
"k8s.io/apimachinery/pkg/util/strategicpatch"
27
31
clientv1 "k8s.io/client-go/pkg/api/v1"
28
32
rbacv1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1"
33
+ "k8s.io/minikube/pkg/minikube/bootstrapper"
29
34
"k8s.io/minikube/pkg/minikube/service"
35
+ "k8s.io/minikube/pkg/util"
30
36
)
31
37
32
38
const masterTaint = "node-role.kubernetes.io/master"
@@ -107,3 +113,80 @@ func elevateKubeSystemPrivileges() error {
107
113
}
108
114
return nil
109
115
}
116
+
117
+ const (
118
+ kubeconfigConf = "kubeconfig.conf"
119
+ kubeProxyConfigmapTmpl = `apiVersion: v1
120
+ kind: Config
121
+ clusters:
122
+ - cluster:
123
+ certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
124
+ server: https://{{.AdvertiseAddress}}:{{.APIServerPort}}
125
+ name: default
126
+ contexts:
127
+ - context:
128
+ cluster: default
129
+ namespace: default
130
+ user: default
131
+ name: default
132
+ current-context: default
133
+ users:
134
+ - name: default
135
+ user:
136
+ tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
137
+ `
138
+ )
139
+
140
+ func restartKubeProxy (k8s bootstrapper.KubernetesConfig ) error {
141
+ client , err := util .GetClient ()
142
+ if err != nil {
143
+ return errors .Wrap (err , "getting k8s client" )
144
+ }
145
+
146
+ selector := labels .SelectorFromSet (labels .Set (map [string ]string {"k8s-app" : "kube-proxy" }))
147
+ if err := util .WaitForPodsWithLabelRunning (client , "kube-system" , selector ); err != nil {
148
+ return errors .Wrap (err , "waiting for kube-proxy to be up for configmap update" )
149
+ }
150
+
151
+ cfgMap , err := client .CoreV1 ().ConfigMaps ("kube-system" ).Get ("kube-proxy" , metav1.GetOptions {})
152
+ if err != nil {
153
+ return errors .Wrap (err , "getting kube-proxy configmap" )
154
+ }
155
+
156
+ t := template .Must (template .New ("kubeProxyTmpl" ).Parse (kubeProxyConfigmapTmpl ))
157
+ opts := struct {
158
+ AdvertiseAddress string
159
+ APIServerPort int
160
+ }{
161
+ AdvertiseAddress : k8s .NodeIP ,
162
+ APIServerPort : util .APIServerPort ,
163
+ }
164
+
165
+ kubeconfig := bytes.Buffer {}
166
+ if err := t .Execute (& kubeconfig , opts ); err != nil {
167
+ return errors .Wrap (err , "executing kube proxy configmap template" )
168
+ }
169
+
170
+ data := map [string ]string {
171
+ kubeconfigConf : kubeconfig .String (),
172
+ }
173
+
174
+ cfgMap .Data = data
175
+ if _ , err := client .CoreV1 ().ConfigMaps ("kube-system" ).Update (cfgMap ); err != nil {
176
+ return errors .Wrap (err , "updating configmap" )
177
+ }
178
+
179
+ pods , err := client .CoreV1 ().Pods ("kube-system" ).List (metav1.ListOptions {
180
+ LabelSelector : "k8s-app=kube-proxy" ,
181
+ })
182
+ if err != nil {
183
+ return errors .Wrap (err , "listing kube-proxy pods" )
184
+ }
185
+ for _ , pod := range pods .Items {
186
+ if err := client .CoreV1 ().Pods (pod .Namespace ).Delete (pod .Name , & metav1.DeleteOptions {}); err != nil {
187
+ return errors .Wrapf (err , "deleting pod %+v" , pod )
188
+ }
189
+ }
190
+
191
+ return nil
192
+ }
0 commit comments