Dashboard:https://github.com/kubernetes/dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
安装存在几个问题:
- 镜像国内无法直接访问
- dashboard的默认webui证书是自动生成的,由于时间和名称存在问题,导致谷歌和ie浏览器无法打开登录界面,经过测试Firefox可以正常打开
- 应用的权限太小,默认登录进去界面显示权限问题
一:解决镜像问题
#拉取镜像
docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
#重新打标签
docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
#删除无用镜像
docker rmi mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
[root@k8s-master ~]# kubectl get pods -n kube-system |egrep dashboard
kubernetes-dashboard-767dc7d4d-n4clq 1/1 Running 0 3s
二:解决证书问题
如果用火狐浏览可以用默认生成的
kubectl get secret -n kube-system |egrep certs
kubernetes-dashboard-certs Opaque 2 4m35s
我们用openssl自定义一个证书
cd /etc/kubernetes/pki/
[root@k8s-master pki]# (umask 077;openssl genrsa -out dashboard.key 2048)
[root@k8s-master pki]# openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=magedu/CN=dashboard"
[root@k8s-master pki]# openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 365
kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
或者是直接删除 kubectl delete secret kubernetes-dashboard-certs -n kube-system
kubectl create secret generic kubernetes-dashboard-certs -n kube-system --from-file=./dashboard.crt --from-file=dashboard.key=./dashboard.key
可以看到自己定义的数据在DATA里面
kubectl get secret kubernetes-dashboard-certs -n kube-system -o yaml
需要发布成节点访问,或者kubectl proxy
这里修改service 为nodeport类型
kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system
[root@wan129 pki]# kubectl get svc -n kube-system |egrep dashboard
kubernetes-dashboard NodePort 10.96.47.28 <none> 443:30410/TCP 11m
通过浏览器访问就可以登录界面了,可以在客户端浏览器增加信任
三:解决权限问题
接下来我们通过token (令牌来验证)来登录界面
默认定义的sa ,绑定的权限比较小
# ------------------- Dashboard Service Account ------------------- # apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system ---
[root@k8s-master ~]# kubectl get sa -n kube-system
修改SA 为集群管理权限,权限相关的问题关注上一篇
在修改之前需要删除之前的sa
kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
两种方式:
第一种方式:
源文件
修改后的文件
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
kubectl apply -f kubernetes-dashboard.yaml
第二种方式
kubectl delete clusterrolebinding dashboard-cluster-admin
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
当然也可以用yaml 定义
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
[root@k8s-master ~]# kubectl get clusterrolebinding |egrep dashboard
这样可以通过SA 来获取token
[root@k8s-master ~]# kubectl get secret -n kube-system |egrep dashboard-token
kubernetes-dashboard-token-sfvzz kubernetes.io/service-account-token 3 4m5s
[root@k8s-master ~]# kubectl describe secret/kubernetes-dashboard-token-sfvzz -n kube-system|egrep token
然后复制拷贝到令牌认证里面,成功后的界面
最简单的是创建一个SA,给绑定集群管理的权限,然后获取这个token当令牌,然后登陆即可
kubectl create serviceaccount def-cls-admin -n kube-system
kubectl create clusterrolebinding def-cls-admin --clusterrole=cluster-admin --serviceaccount=kube-system:def-cls-admin
kubectl get secret -n kube-system|egrep def-cls-admin
kubectl describe secret/def-cls-admin-token-xgb4x -n kube-system|egrep token:
限制只能在默认名称空间里面
定义一个只能访问默认名称空间的sa, 绑定到集群角色admin
kubectl create serviceaccount def-ns-admin
kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin
kubectl describe secret def-ns-admin-token-lqvv8
kubectl get secret|egrep def-ns-admin
def-ns-admin-token-lqvv8 kubernetes.io/service-account-token 3 2m
kubectl describe secret def-ns-admin-token-lqvv8 |egrep token:
拷贝进去令牌认证,只能对default名称空间有作用,因为是rolebinding
Kubeconfig 登陆:
下面通过kubconfig conf命令,补全所需要的信息:
参考kubeconfig config view
1.集群信息补全:
#kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://10.211.55.11:6443" \
--embed-certs=true --kubeconfig=/root/def-ns-admin.conf
可以简单一点
kubectl config set-cluster kubernetes --server="https://10.211.55.11:6443" --kubeconfig=/root/def-ns-admin.conf
Cluster "kubernetes" set.
kubectl config view --kubeconfig=/root/def-ns-admin.conf
2.集群认证信息补全:
kubectl config set-credentials NAME [--client-certificate=path/to/certfile] [--client-key=path/to/keyfile]
[--token=bearer_token] [--username=basic_user] [--password=basic_password] [--auth-provider=provider_name]
[--auth-provider-arg=key=value] [options]
认证方式可以通过证书文件,也可以通过token,这里通过tonken方式来认证
kubectl describe secret def-ns-admin-token-lqvv8 |egrep token: #这个直接base64 会有问题,需要转成json
DEFAULT_TOKEN=$(kubectl get secret def-ns-admin-token-lqvv8 -o jsonpath={.data.token} |base64 -d)
kubectl config set-credentials def-ns-admin --token=$DEFAULT_TOKEN --kubeconfig=/root/def-ns-admin.conf
3.配置上下文
kubectl config set-context def-ns-admin@kubernetes --cluster=kubernetes --user=def-ns-admin --kubeconfig=/root/def-ns-admin.conf
4.当前上下文
kubectl config use-context def-ns-admin@kubernetes --kubeconfig=/root/def-ns-admin.conf
kubectl get pods 验证一下
kubectl config view --kubeconfig=/root/def-ns-admin.conf
下载这个文件到客户端就可以实现登录页面了
总结:
认证时的账号必须为serviceaccount:被dashboard POD 拿来由K8S 进行认证
token:
1.创建sa,根据其管理目标,使用rolebinding 或者clusterrolebinding绑定到合同的role 或者clusterrole
2.获取sa的secret,查看secret的详细信息,其中就有token;
kubeconfig: 把sa的token 封装为kubeconfig文件
1.创建sa,根据其管理目标,使用rolebinding 或者clusterrolebinding绑定到合同的role 或者clusterrole
2.kubectl get secret |awk '/^ServiceAccount/{print $1}'
KUBE_TOKEN=$(kubectl get secret SERVICEACCOUNT_SERRET_NAME -o jsonpath={.data.token})|bash64 -d)
3.生成kubeconfig文件
kubectl config set-cluster --kubeconfig=/PATH/TO/SOMEFILE
kubect config set-credentials NAME --token= $DEFAULT_TOKEN --kubeconfig=/PATH/TO/SOMEFILE
kubect config set -context
kubect config use -context
参考文章:
https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
https://blog.csdn.net/java_zyq/article/details/82178152
生产环境中的配置
server {
server_name k8s.doudou.net;
rewrite ^(.*)$ https://k8s.doudou.net$1 permanent;
}
server {
listen 443 ssl;
server_name k8s.doudou.net;
ssl_certificate server.crt;
ssl_certificate_key server.key;
location / {
proxy_ssl_trusted_certificate /etc/ssl/kubernetes/ca.pem;
proxy_ssl_certificate /etc/ssl/kubernetes/admin.pem;
proxy_ssl_certificate_key /etc/ssl/kubernetes/admin-key.pem;
proxy_ssl_session_reuse on;
proxy_pass https://192.168.8.99/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/;
}
}
kubectl cluster info
~
~