mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #10077 from timstclair/ui-server
Move dashboard UI out of the apiserver to a separate pod
This commit is contained in:
		
							
								
								
									
										19
									
								
								cluster/addons/kube-ui/image/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								cluster/addons/kube-ui/image/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
# Copyright 2015 The Kubernetes Authors. All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
# you may not use this file except in compliance with the License.
 | 
			
		||||
# You may obtain a copy of the License at
 | 
			
		||||
#
 | 
			
		||||
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
#
 | 
			
		||||
# Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
# See the License for the specific language governing permissions and
 | 
			
		||||
# limitations under the License.
 | 
			
		||||
 | 
			
		||||
FROM scratch
 | 
			
		||||
MAINTAINER Tim St. Clair <stclair@google.com>
 | 
			
		||||
ADD kube-ui kube-ui
 | 
			
		||||
EXPOSE 8080
 | 
			
		||||
ENTRYPOINT ["/kube-ui"]
 | 
			
		||||
							
								
								
									
										23
									
								
								cluster/addons/kube-ui/image/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								cluster/addons/kube-ui/image/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# Makefile for the Docker image gcr.io/google_containers/kube-ui
 | 
			
		||||
# MAINTAINER: Tim St. Clair <stclair@google.com>
 | 
			
		||||
# If you update this image please check the tag value before pushing.
 | 
			
		||||
 | 
			
		||||
.PHONY: all container push clean
 | 
			
		||||
 | 
			
		||||
# Keep this at dev, so no one accidentally blows away the latest published version.
 | 
			
		||||
TAG = dev # current version: v1
 | 
			
		||||
PREFIX = gcr.io/google_containers
 | 
			
		||||
 | 
			
		||||
all: push
 | 
			
		||||
 | 
			
		||||
kube-ui: kube-ui.go
 | 
			
		||||
	CGO_ENABLED=0 GOOS=linux godep go build -a -installsuffix cgo -ldflags '-w' ./kube-ui.go
 | 
			
		||||
 | 
			
		||||
container: kube-ui
 | 
			
		||||
	docker build -t $(PREFIX)/kube-ui:$(TAG) .
 | 
			
		||||
 | 
			
		||||
push: container
 | 
			
		||||
	gcloud docker push $(PREFIX)/kube-ui:$(TAG)
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -f kube-ui
 | 
			
		||||
							
								
								
									
										54
									
								
								cluster/addons/kube-ui/image/kube-ui.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								cluster/addons/kube-ui/image/kube-ui.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2014 The Kubernetes Authors All rights reserved.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// A simple static web server for hosting the Kubernetes cluster UI.
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"mime"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"github.com/GoogleCloudPlatform/kubernetes/pkg/ui/data/dashboard"
 | 
			
		||||
	"github.com/golang/glog"
 | 
			
		||||
 | 
			
		||||
	assetfs "github.com/elazarl/go-bindata-assetfs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	port = flag.Int("port", 8080, "Port number to serve at.")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	// Send correct mime type for .svg files.  TODO: remove when
 | 
			
		||||
	// https://github.com/golang/go/commit/21e47d831bafb59f22b1ea8098f709677ec8ce33
 | 
			
		||||
	// makes it into all of our supported go versions.
 | 
			
		||||
	mime.AddExtensionType(".svg", "image/svg+xml")
 | 
			
		||||
 | 
			
		||||
	// Expose files in www/ on <host>
 | 
			
		||||
	fileServer := http.FileServer(&assetfs.AssetFS{
 | 
			
		||||
		Asset:    dashboard.Asset,
 | 
			
		||||
		AssetDir: dashboard.AssetDir,
 | 
			
		||||
		Prefix:   "www/app",
 | 
			
		||||
	})
 | 
			
		||||
	http.Handle("/", fileServer)
 | 
			
		||||
 | 
			
		||||
	// TODO: Add support for serving over TLS.
 | 
			
		||||
	glog.Fatal(http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", *port), nil))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								cluster/addons/kube-ui/kube-ui-rc.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								cluster/addons/kube-ui/kube-ui-rc.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: ReplicationController
 | 
			
		||||
metadata:
 | 
			
		||||
  name: kube-ui-v1
 | 
			
		||||
  namespace: default
 | 
			
		||||
  labels:
 | 
			
		||||
    k8s-app: kube-ui
 | 
			
		||||
    version: v1
 | 
			
		||||
    kubernetes.io/cluster-service: "true"
 | 
			
		||||
spec:
 | 
			
		||||
  replicas: 1
 | 
			
		||||
  selector:
 | 
			
		||||
    k8s-app: kube-ui
 | 
			
		||||
    version: v1
 | 
			
		||||
  template:
 | 
			
		||||
    metadata:
 | 
			
		||||
      labels:
 | 
			
		||||
        k8s-app: kube-ui
 | 
			
		||||
        version: v1
 | 
			
		||||
        kubernetes.io/cluster-service: "true"
 | 
			
		||||
    spec:
 | 
			
		||||
      containers:
 | 
			
		||||
      - name: kube-ui
 | 
			
		||||
        image: gcr.io/google_containers/kube-ui:v1
 | 
			
		||||
        ports:
 | 
			
		||||
        - containerPort: 8080
 | 
			
		||||
							
								
								
									
										15
									
								
								cluster/addons/kube-ui/kube-ui-svc.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								cluster/addons/kube-ui/kube-ui-svc.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: kube-ui
 | 
			
		||||
  namespace: default
 | 
			
		||||
  labels:
 | 
			
		||||
    k8s-app: kube-ui
 | 
			
		||||
    kubernetes.io/cluster-service: "true"
 | 
			
		||||
    kubernetes.io/name: "KubeUI"
 | 
			
		||||
spec:
 | 
			
		||||
  selector:
 | 
			
		||||
    k8s-app: kube-ui
 | 
			
		||||
  ports:
 | 
			
		||||
  - port: 80
 | 
			
		||||
    targetPort: 8080
 | 
			
		||||
@@ -87,6 +87,17 @@ addon-dir-create:
 | 
			
		||||
    - file_mode: 644
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if pillar.get('enable_cluster_ui', 'true').lower() == 'true' %}
 | 
			
		||||
/etc/kubernetes/addons/kube-ui:
 | 
			
		||||
  file.recurse:
 | 
			
		||||
    - source: salt://kube-addons/kube-ui
 | 
			
		||||
    - include_pat: E@^.+\.yaml$
 | 
			
		||||
    - user: root
 | 
			
		||||
    - group: root
 | 
			
		||||
    - dir_mode: 755
 | 
			
		||||
    - file_mode: 644
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
/etc/kubernetes/kube-addons.sh:
 | 
			
		||||
  file.managed:
 | 
			
		||||
    - source: salt://kube-addons/kube-addons.sh
 | 
			
		||||
 
 | 
			
		||||
@@ -12,9 +12,9 @@ kubectl proxy --www=www/app --www-prefix=/
 | 
			
		||||
 | 
			
		||||
You should now be able to access it by visiting [localhost:8001](http://localhost:8001/).
 | 
			
		||||
 | 
			
		||||
You can also use other web servers to serve the contents of the www/app directory, as described [here](../www/README.md#serving-the-app-during-development). 
 | 
			
		||||
You can also use other web servers to serve the contents of the www/app directory, as described [here](../www/README.md#serving-the-app-during-development).
 | 
			
		||||
 | 
			
		||||
### Running remotely
 | 
			
		||||
When Kubernetes is deployed remotely, the api server deploys the UI. To access it, visit `/static/app/` or `/ui`, which redirects to `/static/app/`, on your master server.
 | 
			
		||||
When Kubernetes is deployed remotely, the UI is deployed as a cluster addon. To access it, visit `/ui`, which redirects to `/api/v1/proxy/namespaces/default/services/kube-ui/#/dashboard/`, on your master server.
 | 
			
		||||
 | 
			
		||||
[]()
 | 
			
		||||
 
 | 
			
		||||
@@ -30,16 +30,39 @@ if ! which go-bindata > /dev/null 2>&1 ; then
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
DATAFILE=pkg/ui/datafile.go
 | 
			
		||||
TMP_DATAFILE=/tmp/datafile.go
 | 
			
		||||
readonly TMP_DATAFILE="/tmp/datafile.go"
 | 
			
		||||
readonly DASHBOARD_SRC="www/app/..."
 | 
			
		||||
readonly DASHBOARD_PKG="dashboard"
 | 
			
		||||
readonly SWAGGER_SRC="third_party/swagger-ui/..."
 | 
			
		||||
readonly SWAGGER_PKG="swagger"
 | 
			
		||||
 | 
			
		||||
go-bindata -nocompress -o $DATAFILE -prefix ${PWD} -pkg ui www/app/... third_party/swagger-ui/...
 | 
			
		||||
function kube::hack::build_ui() {
 | 
			
		||||
  local pkg="$1"
 | 
			
		||||
  local src="$2"
 | 
			
		||||
  local output_file="pkg/ui/data/${pkg}/datafile.go"
 | 
			
		||||
 | 
			
		||||
cat hooks/boilerplate.go.txt > $TMP_DATAFILE
 | 
			
		||||
echo "// generated by hack/build-ui.sh; DO NOT EDIT
 | 
			
		||||
" >> $TMP_DATAFILE
 | 
			
		||||
cat $DATAFILE >> $TMP_DATAFILE
 | 
			
		||||
  go-bindata -nocompress -o "${output_file}" -prefix ${PWD} -pkg "${pkg}" "${src}"
 | 
			
		||||
 | 
			
		||||
gofmt -s -w $TMP_DATAFILE
 | 
			
		||||
  local year=$(date +%Y)
 | 
			
		||||
  cat hooks/boilerplate.go.txt | sed "s/YEAR/${year}/" > "${TMP_DATAFILE}"
 | 
			
		||||
  echo -e "// generated by hack/build-ui.sh; DO NOT EDIT\n" >> "${TMP_DATAFILE}"
 | 
			
		||||
  cat "${output_file}" >> "${TMP_DATAFILE}"
 | 
			
		||||
 | 
			
		||||
mv $TMP_DATAFILE $DATAFILE
 | 
			
		||||
  gofmt -s -w "${TMP_DATAFILE}"
 | 
			
		||||
 | 
			
		||||
  mv "${TMP_DATAFILE}" "${output_file}"
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case "${1:-}" in
 | 
			
		||||
  dashboard)
 | 
			
		||||
    kube::hack::build_ui "${DASHBOARD_PKG}" "${DASHBOARD_SRC}"
 | 
			
		||||
    ;;
 | 
			
		||||
  swagger)
 | 
			
		||||
    kube::hack::build_ui "${SWAGGER_PKG}" "${SWAGGER_SRC}"
 | 
			
		||||
    ;;
 | 
			
		||||
  *)
 | 
			
		||||
    kube::hack::build_ui "${DASHBOARD_PKG}" "${DASHBOARD_SRC}"
 | 
			
		||||
    kube::hack::build_ui "${SWAGGER_PKG}" "${SWAGGER_SRC}"
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								pkg/ui/data/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								pkg/ui/data/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
The datafiles contained in these directories were generated by the script
 | 
			
		||||
```sh
 | 
			
		||||
hack/build-ui.sh
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Do not edit by hand.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[]()
 | 
			
		||||
							
								
								
									
										5004
									
								
								pkg/ui/data/dashboard/datafile.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5004
									
								
								pkg/ui/data/dashboard/datafile.go
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										17091
									
								
								pkg/ui/data/swagger/datafile.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17091
									
								
								pkg/ui/data/swagger/datafile.go
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										21793
									
								
								pkg/ui/datafile.go
									
									
									
									
									
								
							
							
						
						
									
										21793
									
								
								pkg/ui/datafile.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -14,5 +14,6 @@ See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// package ui contains static data files compiled to go, and utilities for accessing them.
 | 
			
		||||
// package ui contains utilities for accessing the static data files compiled in
 | 
			
		||||
// the data/* subdirectories.
 | 
			
		||||
package ui
 | 
			
		||||
 
 | 
			
		||||
@@ -20,10 +20,12 @@ import (
 | 
			
		||||
	"mime"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"github.com/GoogleCloudPlatform/kubernetes/pkg/ui/data/swagger"
 | 
			
		||||
 | 
			
		||||
	assetfs "github.com/elazarl/go-bindata-assetfs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const dashboardPath = "/static/app/#/dashboard/"
 | 
			
		||||
const dashboardPath = "/api/v1/proxy/namespaces/default/services/kube-ui/#/dashboard/"
 | 
			
		||||
 | 
			
		||||
type MuxInterface interface {
 | 
			
		||||
	Handle(pattern string, handler http.Handler)
 | 
			
		||||
@@ -37,18 +39,19 @@ func InstallSupport(mux MuxInterface, enableSwaggerSupport bool) {
 | 
			
		||||
	// makes it into all of our supported go versions.
 | 
			
		||||
	mime.AddExtensionType(".svg", "image/svg+xml")
 | 
			
		||||
 | 
			
		||||
	// Expose files in www/ on <host>/static/
 | 
			
		||||
	fileServer := http.FileServer(&assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "www"})
 | 
			
		||||
	prefix := "/static/"
 | 
			
		||||
	mux.Handle(prefix, http.StripPrefix(prefix, fileServer))
 | 
			
		||||
	prefix = "/ui/"
 | 
			
		||||
	// Redirect /ui to the kube-ui proxy path
 | 
			
		||||
	prefix := "/ui/"
 | 
			
		||||
	mux.HandleFunc(prefix, func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		http.Redirect(w, r, dashboardPath, http.StatusTemporaryRedirect)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if enableSwaggerSupport {
 | 
			
		||||
		// Expose files in third_party/swagger-ui/ on <host>/swagger-ui
 | 
			
		||||
		fileServer = http.FileServer(&assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "third_party/swagger-ui"})
 | 
			
		||||
		fileServer := http.FileServer(&assetfs.AssetFS{
 | 
			
		||||
			Asset:    swagger.Asset,
 | 
			
		||||
			AssetDir: swagger.AssetDir,
 | 
			
		||||
			Prefix:   "third_party/swagger-ui",
 | 
			
		||||
		})
 | 
			
		||||
		prefix = "/swagger-ui/"
 | 
			
		||||
		mux.Handle(prefix, http.StripPrefix(prefix, fileServer))
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,15 +71,15 @@ Like `npm start`, it runs `bower install` to install and/or update the framework
 | 
			
		||||
To make the production code available to the Kubernetes api server, run this command from the top level directory:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
hack/build-ui.sh
 | 
			
		||||
hack/build-ui.sh dashboard
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
It runs the `go-bindata` tool to package the generated `app` directory and other user interface content, such as the Swagger documentation, into `pkg/ui/datafile.go`. Note: go-bindata can be installed with `go get github.com/jteeuwen/go-bindata/...`.
 | 
			
		||||
It runs the `go-bindata` tool to package the generated `app` directory into `pkg/ui/data/dashboard/datafile.go`. It can also be used to package other user interface content, such as the Swagger documentation. Note: go-bindata can be installed with `go get github.com/jteeuwen/go-bindata/...`.
 | 
			
		||||
 | 
			
		||||
Then, run one of the go build scripts, such as `hack/build-go.sh`, to build a new `kube-apiserver` binary that includes the updated `pkg/ui/datafile.go`.
 | 
			
		||||
Then, run `make kube-ui` in the `cluster/addons/kube-ui/image` directory to build a new `kube-ui` binary that includes the updated `datafile.go`. When the updated UI is ready for release, increment the version tag in `cluster/addons/kube-ui/image/Makefile` and run `make push` in the same directory to build & push the new kube-ui docker image.
 | 
			
		||||
 | 
			
		||||
### Serving the app in production
 | 
			
		||||
The app is served in production by `kube-apiserver` at:
 | 
			
		||||
The app is served in production by the `kube-ui` binary at:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
https://<kubernetes-master>/ui/
 | 
			
		||||
@@ -88,7 +88,7 @@ https://<kubernetes-master>/ui/
 | 
			
		||||
which redirects to:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
https://<kubernetes-master>/static/app/
 | 
			
		||||
https://<kubernetes-master>/api/v1/proxy/namespaces/default/services/kube-ui/
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Configuration
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user