mirror of https://github.com/k3s-io/k3s
Update Dashboard add-on to version 1.8.0
parent
24042ce6e7
commit
a8bf90f85e
|
@ -1,5 +1,4 @@
|
||||||
# Kubernetes Dashboard
|
# Kubernetes Dashboard
|
||||||
==============
|
|
||||||
|
|
||||||
Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters.
|
Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters.
|
||||||
It allows users to manage applications running in the cluster, troubleshoot them,
|
It allows users to manage applications running in the cluster, troubleshoot them,
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: kubernetes-dashboard
|
||||||
|
# Allows editing resource and makes sure it is created first.
|
||||||
|
addonmanager.kubernetes.io/mode: EnsureExists
|
||||||
|
name: kubernetes-dashboard-settings
|
||||||
|
namespace: kube-system
|
|
@ -1,4 +1,13 @@
|
||||||
apiVersion: extensions/v1beta1
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: kubernetes-dashboard
|
||||||
|
addonmanager.kubernetes.io/mode: Reconcile
|
||||||
|
name: kubernetes-dashboard
|
||||||
|
namespace: kube-system
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1beta2
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: kubernetes-dashboard
|
name: kubernetes-dashboard
|
||||||
|
@ -20,9 +29,8 @@ spec:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: kubernetes-dashboard
|
- name: kubernetes-dashboard
|
||||||
image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.3
|
image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.8.0
|
||||||
resources:
|
resources:
|
||||||
# keep request = limit to keep this container in guaranteed class
|
|
||||||
limits:
|
limits:
|
||||||
cpu: 100m
|
cpu: 100m
|
||||||
memory: 300Mi
|
memory: 300Mi
|
||||||
|
@ -30,13 +38,29 @@ spec:
|
||||||
cpu: 100m
|
cpu: 100m
|
||||||
memory: 100Mi
|
memory: 100Mi
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 9090
|
- containerPort: 8443
|
||||||
|
protocol: TCP
|
||||||
|
args:
|
||||||
|
- --auto-generate-certificates
|
||||||
|
volumeMounts:
|
||||||
|
- name: kubernetes-dashboard-certs
|
||||||
|
mountPath: /certs
|
||||||
|
- name: tmp-volume
|
||||||
|
mountPath: /tmp
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
|
scheme: HTTPS
|
||||||
path: /
|
path: /
|
||||||
port: 9090
|
port: 8443
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
timeoutSeconds: 30
|
timeoutSeconds: 30
|
||||||
|
volumes:
|
||||||
|
- name: kubernetes-dashboard-certs
|
||||||
|
secret:
|
||||||
|
secretName: kubernetes-dashboard-certs
|
||||||
|
- name: tmp-volume
|
||||||
|
emptyDir: {}
|
||||||
|
serviceAccountName: kubernetes-dashboard
|
||||||
tolerations:
|
tolerations:
|
||||||
- key: "CriticalAddonsOnly"
|
- key: "CriticalAddonsOnly"
|
||||||
operator: "Exists"
|
operator: "Exists"
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
kind: Role
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: kubernetes-dashboard
|
||||||
|
addonmanager.kubernetes.io/mode: Reconcile
|
||||||
|
name: kubernetes-dashboard-minimal
|
||||||
|
namespace: kube-system
|
||||||
|
rules:
|
||||||
|
# Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["secrets"]
|
||||||
|
verbs: ["create"]
|
||||||
|
# Allow Dashboard to get, update and delete Dashboard exclusive secrets.
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["secrets"]
|
||||||
|
resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]
|
||||||
|
verbs: ["get", "update", "delete"]
|
||||||
|
# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["configmaps"]
|
||||||
|
resourceNames: ["kubernetes-dashboard-settings"]
|
||||||
|
verbs: ["get", "update"]
|
||||||
|
# Allow Dashboard to get metrics from heapster.
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["services"]
|
||||||
|
resourceNames: ["heapster"]
|
||||||
|
verbs: ["proxy"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: kubernetes-dashboard-minimal
|
||||||
|
namespace: kube-system
|
||||||
|
labels:
|
||||||
|
k8s-app: kubernetes-dashboard
|
||||||
|
addonmanager.kubernetes.io/mode: Reconcile
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: kubernetes-dashboard-minimal
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: kubernetes-dashboard
|
||||||
|
namespace: kube-system
|
|
@ -0,0 +1,10 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: kubernetes-dashboard
|
||||||
|
# Allows editing resource and makes sure it is created first.
|
||||||
|
addonmanager.kubernetes.io/mode: EnsureExists
|
||||||
|
name: kubernetes-dashboard-certs
|
||||||
|
namespace: kube-system
|
||||||
|
type: Opaque
|
|
@ -11,5 +11,5 @@ spec:
|
||||||
selector:
|
selector:
|
||||||
k8s-app: kubernetes-dashboard
|
k8s-app: kubernetes-dashboard
|
||||||
ports:
|
ports:
|
||||||
- port: 80
|
- port: 443
|
||||||
targetPort: 9090
|
targetPort: 8443
|
||||||
|
|
|
@ -45,19 +45,13 @@ function deploy_dns {
|
||||||
}
|
}
|
||||||
|
|
||||||
function deploy_dashboard {
|
function deploy_dashboard {
|
||||||
if ${KUBECTL} get rc -l k8s-app=kubernetes-dashboard --namespace=kube-system | grep kubernetes-dashboard-v &> /dev/null; then
|
echo "Deploying Kubernetes Dashboard"
|
||||||
echo "Kubernetes Dashboard replicationController already exists"
|
|
||||||
else
|
|
||||||
echo "Creating Kubernetes Dashboard replicationController"
|
|
||||||
${KUBECTL} create -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-controller.yaml
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ${KUBECTL} get service/kubernetes-dashboard --namespace=kube-system &> /dev/null; then
|
${KUBECTL} apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-secret.yaml
|
||||||
echo "Kubernetes Dashboard service already exists"
|
${KUBECTL} apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-configmap.yaml
|
||||||
else
|
${KUBECTL} apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-rbac.yaml
|
||||||
echo "Creating Kubernetes Dashboard service"
|
${KUBECTL} apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-controller.yaml
|
||||||
${KUBECTL} create -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-service.yaml
|
${KUBECTL} apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-service.yaml
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
|
@ -792,8 +792,11 @@ function start_kubedashboard {
|
||||||
if [[ "${ENABLE_CLUSTER_DASHBOARD}" = true ]]; then
|
if [[ "${ENABLE_CLUSTER_DASHBOARD}" = true ]]; then
|
||||||
echo "Creating kubernetes-dashboard"
|
echo "Creating kubernetes-dashboard"
|
||||||
# use kubectl to create the dashboard
|
# use kubectl to create the dashboard
|
||||||
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" create -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-controller.yaml
|
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-secret.yaml
|
||||||
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" create -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-service.yaml
|
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-configmap.yaml
|
||||||
|
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-rbac.yaml
|
||||||
|
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-controller.yaml
|
||||||
|
${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" apply -f ${KUBE_ROOT}/cluster/addons/dashboard/dashboard-service.yaml
|
||||||
echo "kubernetes-dashboard deployment and service successfully deployed."
|
echo "kubernetes-dashboard deployment and service successfully deployed."
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ import (
|
||||||
"k8s.io/apiserver/pkg/server/mux"
|
"k8s.io/apiserver/pkg/server/mux"
|
||||||
)
|
)
|
||||||
|
|
||||||
const dashboardPath = "/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy"
|
const dashboardPath = "/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/"
|
||||||
|
|
||||||
// UIRedirect redirects /ui to the kube-ui proxy path.
|
// UIRedirect redirects /ui to the kube-ui proxy path.
|
||||||
type UIRedirect struct{}
|
type UIRedirect struct{}
|
||||||
|
|
|
@ -15,6 +15,7 @@ go_library(
|
||||||
"//vendor/github.com/onsi/gomega:go_default_library",
|
"//vendor/github.com/onsi/gomega:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
testutils "k8s.io/kubernetes/test/utils"
|
testutils "k8s.io/kubernetes/test/utils"
|
||||||
|
@ -36,6 +37,7 @@ var _ = SIGDescribe("Kubernetes Dashboard", func() {
|
||||||
uiServiceName = "kubernetes-dashboard"
|
uiServiceName = "kubernetes-dashboard"
|
||||||
uiAppName = uiServiceName
|
uiAppName = uiServiceName
|
||||||
uiNamespace = metav1.NamespaceSystem
|
uiNamespace = metav1.NamespaceSystem
|
||||||
|
uiRedirect = "/ui"
|
||||||
|
|
||||||
serverStartTimeout = 1 * time.Minute
|
serverStartTimeout = 1 * time.Minute
|
||||||
)
|
)
|
||||||
|
@ -63,20 +65,20 @@ var _ = SIGDescribe("Kubernetes Dashboard", func() {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), framework.SingleCallTimeout)
|
ctx, cancel := context.WithTimeout(context.Background(), framework.SingleCallTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
// Query against the proxy URL for the kube-ui service.
|
// Query against the proxy URL for the kubernetes-dashboard service.
|
||||||
err := proxyRequest.Namespace(uiNamespace).
|
err := proxyRequest.Namespace(uiNamespace).
|
||||||
Context(ctx).
|
Context(ctx).
|
||||||
Name(uiServiceName).
|
Name(utilnet.JoinSchemeNamePort("https", uiServiceName, "")).
|
||||||
Timeout(framework.SingleCallTimeout).
|
Timeout(framework.SingleCallTimeout).
|
||||||
Do().
|
Do().
|
||||||
StatusCode(&status).
|
StatusCode(&status).
|
||||||
Error()
|
Error()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if ctx.Err() != nil {
|
if ctx.Err() != nil {
|
||||||
framework.Failf("Request to kube-ui failed: %v", err)
|
framework.Failf("Request to kubernetes-dashboard failed: %v", err)
|
||||||
return true, err
|
return true, err
|
||||||
}
|
}
|
||||||
framework.Logf("Request to kube-ui failed: %v", err)
|
framework.Logf("Request to kubernetes-dashboard failed: %v", err)
|
||||||
} else if status != http.StatusOK {
|
} else if status != http.StatusOK {
|
||||||
framework.Logf("Unexpected status from kubernetes-dashboard: %v", status)
|
framework.Logf("Unexpected status from kubernetes-dashboard: %v", status)
|
||||||
}
|
}
|
||||||
|
@ -88,7 +90,7 @@ var _ = SIGDescribe("Kubernetes Dashboard", func() {
|
||||||
By("Checking that the ApiServer /ui endpoint redirects to a valid server.")
|
By("Checking that the ApiServer /ui endpoint redirects to a valid server.")
|
||||||
var status int
|
var status int
|
||||||
err = f.ClientSet.CoreV1().RESTClient().Get().
|
err = f.ClientSet.CoreV1().RESTClient().Get().
|
||||||
AbsPath("/ui").
|
AbsPath(uiRedirect).
|
||||||
Timeout(framework.SingleCallTimeout).
|
Timeout(framework.SingleCallTimeout).
|
||||||
Do().
|
Do().
|
||||||
StatusCode(&status).
|
StatusCode(&status).
|
||||||
|
|
Loading…
Reference in New Issue