下载Kubernetes Dashboard镜像
docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.0 docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0 docker rmi mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.0 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
Dashboard有多种方式可以访问:
- kubectl proxy方式:只支持127.0.0.1和localhost为来源地址的方式访问,需要配置SSH隧道,比较麻烦,不建议使用
- Node Port方式:该方式只建议在开发环境的环境中使用
- Ingress方式:通过Ingress Controller来暴露应用,比较灵活,是最推荐的方式,但较复杂,以下将做详细说明
- API Server方式:由于API服务器是公开的,可以从外部访问,是比较推荐的方式,以下将做详细说明
方法一:通过Ingress访问Dashboard
先按照该教程部署Ingress Controller:NGINX Ingress Controller部署
本示例中NGINX Ingress Controller使用DaemonSet方式部署,好处是不用去找NodePort的端口号。示例的Ingress主机域名为dashboard.test.local,在DNS中配置该A记录对应任意worker节点地址即可访问。
创建dashboard的TLS证书,若有CA颁发的证书可跳过这步
通过openssl生成了域名为dashboard.test.local的10年(3650天)自签名证书
openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=dashboard.test.local/O=dashboard.test.local"
基于以上创建的证书生成secret
kubectl create secret tls kubernetes-dashboard-certs --key tls.key --cert tls.crt -n kube-system
创建Ingress
cat <<EOF | kubectl create -f - apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-dashboard namespace: kube-system annotations: nginx.org/ssl-services: "kubernetes-dashboard" spec: rules: - host: dashboard.test.local http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 443 tls: - hosts: - dashboard.test.local secretName: kubernetes-dashboard-certs EOF
然后使用浏览器访问https://dashboard.test.local即可访问Kubernetes Dashboard了
方法二:通过API Server访问Dashboard
通过API Server访问Dashboard的地址为:
https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
若k8s为集群高可用部署,则使用master vip地址和相应的端口
根据之前k8s部署教程,示例的访问地址为https://k8s.test.local:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/。但是直接访问该网址会返回Anonymous Forbidden的错误,是由于RBAC给未认证用户分配的默认身份没有访问权限的关系。可以通过k8s的admin.conf来生成证书,方法如下:
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
将生成的证书导入浏览器,并重启浏览器再次访问Dashboard地址,登录时会显示选择证书,点击相应的证书便可进行登录
选择证书后,便出现了登录界面,在此选择Token,Token的生成方法见下面的步骤
用户登录
Kubernetes使用token进行用户认证,为了正确访问Dashboard,需要创建相应的信息
创建admin-user用户
cat <<EOF | kubectl create -f - apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system EOF
再获取admin-user的token,token为图红框中那串base64字符串(为了方便大家,以下命令直接输出token,没有多余信息)
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') | awk '$1=="token:"{print $2}'