mirror of https://github.com/k3s-io/k3s
Add kube-ui cluster addon for serving k8s dashboard UI.
Changes include: - Add kube-ui binary for serving static dashboard UI - Add kube-ui docker image, replication controller, and service - Make the kube-ui a cluster-addon (enabled by default) - Split the compiled pkg/ui/datafile.go into separate dashboard and swagger packages - Update docs to reflect changespull/6/head
parent
7689391c68
commit
b6b2d6df42
|
@ -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"]
|
|
@ -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
|
|
@ -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))
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -15,6 +15,6 @@ You should now be able to access it by visiting [localhost:8001](http://localhos
|
|||
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 api server deploys the UI. To access it, visit `/ui`, which redirects to `/api/v1/proxy/namespaces/default/services/kube-ui/#/dashboard/`, on your master server.
|
||||
|
||||
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/ui.md?pixel)]()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
||||
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/pkg/ui/data/README.md?pixel)]()
|
File diff suppressed because one or more lines are too long
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,6 +20,9 @@ import (
|
|||
"mime"
|
||||
"net/http"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/ui/data/dashboard"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/ui/data/swagger"
|
||||
|
||||
assetfs "github.com/elazarl/go-bindata-assetfs"
|
||||
)
|
||||
|
||||
|
@ -38,7 +41,11 @@ func InstallSupport(mux MuxInterface, enableSwaggerSupport bool) {
|
|||
mime.AddExtensionType(".svg", "image/svg+xml")
|
||||
|
||||
// Expose files in www/ on <host>/static/
|
||||
fileServer := http.FileServer(&assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "www"})
|
||||
fileServer := http.FileServer(&assetfs.AssetFS{
|
||||
Asset: dashboard.Asset,
|
||||
AssetDir: dashboard.AssetDir,
|
||||
Prefix: "www",
|
||||
})
|
||||
prefix := "/static/"
|
||||
mux.Handle(prefix, http.StripPrefix(prefix, fileServer))
|
||||
prefix = "/ui/"
|
||||
|
@ -48,7 +55,11 @@ func InstallSupport(mux MuxInterface, enableSwaggerSupport bool) {
|
|||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue