目录
一、部署dashboard
1.10.1版本 不支持1.15以上k8s,ui页面出现404跳转
2.0.0-rc5 部署后无法发现pod,尝试本地镜像无作用,后发现是配置新增runasroot等
2.0.0-beat4版本 暂时正常,兼容性日后确认
今天发现ui页面打不开了,重装了一遍还是不行,最后确认时因为开个全局代理--#
#github地址
https://github.com/kubernetes/dashboard/releases
1、部署
[root@manage01 dashboard]# cd /opt/kubernetes/dashboard
[root@manage01 dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
[root@manage01 dashboard]# mv recommended.yaml k8s-dashboard.yaml
[root@manage01 dashboard]# vim ..../dashboard/kubernetes-dashboard.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
noePort: 30000
selector:
k8s-app: kubernetes-dashboard
2、执行,查看pod情况
[root@manage01 dashboard]# kubectl apply -f k8s-dashboard.yaml
[root@manage01 dashboard]# kubectl get pod --all-namespaces
kubernetes-dashboard dashboard-metrics-scraper-566cddb686-zlfrk 1/1 Running 0 2m38s
kubernetes-dashboard kubernetes-dashboard-7b5bf5d559-bbsdj 1/1 Running 0 2m44s
[root@manage01 dashboard]# kubectl get all --all-namespaces
3、创建dashboard管理员
[root@manage01 dashboard]# cat dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
[root@manage01 dashboard]# kubectl create -f dashboard-admin.yaml
[root@manage01 dashboard]# kubectl describe sa dashboard-admin -n kubernetes-dashboard
4、给管理员授权
[root@manage01 dashboard]# cat dashboard-admin-bind-cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-bind-cluster-role
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
[root@manage01 dashboard]# kubectl create -f dashboard-admin-bind-cluster-role.yaml
kubectl describe clusterrolebinding dashboard-admin
5、获取token页面登陆
[root@manage01 dashboard]# kubectl describe secret -n kubernetes-dashboard $(kubectl get secrets -n kubernetes-dashboard | awk '/dashboard-admin/{print $1}' )
#此时firefox浏览器访问正常,至于Google浏览器证书过期问题懒得搞了
https://<NodeIP>:30000
二、部署Metrics Server
目前访问页面左侧菜单栏Overview-pods列表
上面Dashboard的CPU Usage (cores)和Memory Usage (bytes)列是空的,这是因为Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的方式提供标准化接口,并且从1.10版本开始将Heapster替换为Metrics Server。说白了,想要页面完善还需要部署metrics server服务。
1、部署heapster
heapster
此模块,在1.8版本以后由metricserver替代,如果想部署试试可参考
wget https://github.com/kubernetes/heapster/archive/v1.5.4.tar.gz
tar -zxf v1.5.4.tar.gz
cd heapster-1.5.4/
kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml ##授权
kubectl create -f deploy/kube-config/standalone/heapster-controller.yaml
2、配置metrics service
因为默认metrics service的镜像地址需要科学上网才能拉取,所以在创建之前,我们在node1和node2节点先准备好镜像,或者直接使用国内源也行。##docker pull bluersw/metrics-server-amd64:v0.3.6##
克隆Metrics Server GitHub仓库:
[root@manage01 dashboard]# yum install git -y
[root@manage01 dashboard]# git clone https://github.com/kubernetes-sigs/metrics-server.git
[root@manage01 dashboard]# vim metrics-server/deploy/kubernetes/metrics-server-deployment.yaml
[root@manage01 kubernetes]# cat metrics-server-deployment.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
##########换成国内镜像可下载,或者node节点提前pull##########
image: htcfive/metrics-server-amd64:v0.3.6
args:
- --cert-dir=/tmp
- --secure-port=4443
ports:
- name: main-port
containerPort: 4443
protocol: TCP
securityContext:
readOnlyRootFilesystem: true
##########修改为false,注释掉runasuser,否则启动pod报错##########
runAsNonRoot: false
# runAsUser: 1000
##########镜像下载方式如下,command参数添加##########
imagePullPolicy: IfNotPresent
command:
- /metrics-server
- --metric-resolution=30s
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
volumeMounts:
- name: tmp-dir
mountPath: /tmp
nodeSelector:
beta.kubernetes.io/os: linux
kubernetes.io/arch: "amd64"
3、添加metrics-server证书
此时部署完metrics-server后,执行kubectl top node,出现报错:
Error from server (Forbidden): nodes.metrics.k8s.io is forbidden:
User "system:anonymous" cannot list nodes.metrics.k8s.io at the cluster scope.
报错原因: apiserver权限的问题
解决方法: 在master节点创建metrics-server证书,并在kube-apiserver配置
3.1、metrics-server生成证书
生成证书:
cat > metrics-server-csr.json <<EOF
{
"CN": "aggregator",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes metrics-server-csr.json | cfssljson -bare metrics-server
3.2、kube-apiserver增加配置
[root@manage01 ssl]# cat /opt/kubernetes/cfg/kube-apiserver
--requestheader-allowed-names=aggregator \
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--proxy-client-cert-file=/opt/kubernetes/ssl/metrics-server.pem \
--proxy-client-key-file=/opt/kubernetes/ssl/metrics-server-key.pem \
--enable-aggregator-routing=true \
--advertise-address:apiserver 对外通告的 IP(kubernetes 服务后端节点 IP);
--default--toleration-seconds:设置节点异常相关的阈值;
--max--requests-inflight:请求相关的最大阈值;
--etcd-:访问 etcd 的证书和 etcd 服务器地址;
--experimental-encryption-provider-config:指定用于加密 etcd 中 secret 的配置;
--bind-address: https 监听的 IP,不能为 127.0.0.1,否则外界不能访问它的安全端口 6443;
--secret-port:https 监听端口;
--insecure-port=0:关闭监听 http 非安全端口(8080);
--tls--file:指定 apiserver 使用的证书、私钥和 CA 文件;
--audit-:配置审计策略和审计日志文件相关的参数;
--client-ca-file:验证 client (kue-controller-manager、kube-scheduler、kubelet、kube-proxy 等)请求所带的证书;
--enable-bootstrap-token-auth:启用 kubelet bootstrap 的 token 认证;
--requestheader-:kube-apiserver 的 aggregator layer 相关的配置参数,proxy-client & HPA 需要使用;
--requestheader-client-ca-file:用于签名 --proxy-client-cert-file 和 --proxy-client-key-file 指定的证书;在启用了 metric aggregator 时使用;
--requestheader-allowed-names:不能为空,值为逗号分割的 --proxy-client-cert-file 证书的 CN 名称,这里设置为 "aggregator";
--service-account-key-file:签名 ServiceAccount Token 的公钥文件,kube-controller-manager 的 --service-account-private-key-file 指定私钥文件,两者配对使用;
--runtime-config=api/all=true: 启用所有版本的 APIs,如 autoscaling/v2alpha1;
--authorization-mode=Node,RBAC、--anonymous-auth=false: 开启 Node 和 RBAC 授权模式,拒绝未授权的请求;
--enable-admission-plugins:启用一些默认关闭的 plugins;
--allow-privileged:运行执行 privileged 权限的容器;
--apiserver-count=3:指定 apiserver 实例的数量;
--event-ttl:指定 events 的保存时间;
--kubelet-:如果指定,则使用 https 访问 kubelet APIs;需要为证书对应的用户(上面 kubernetes.pem 证书的用户为 kubernetes) 用户定义 RBAC 规则,否则访问 kubelet API 时提示未授权;
--proxy-client-*:apiserver 访问 metrics-server 使用的证书;
--service-cluster-ip-range: 指定 Service Cluster IP 地址段;
--service-node-port-range: 指定 NodePort 的端口范围;
kube-apiserver 的 --requestheader-allowed-names 参数需要与metric证书CN字段一致,否则后续访问 metrics 时会提示权限不足。
如果 kube-apiserver 机器没有运行 kube-proxy,则还需要添加 --enable-aggregator-routing=true 参数
3.3、kube-controller-manager配置
kube-controller-manager增加如下参数
--horizontal-pod-autoscaler-use-rest-clients=true
3.4、安装部署验证
稍等片刻,然后执行kubectl top nodes便可以看到每个节点的CPU和内存使用率了:
kubectl create -f metrics-server/deploy/kubernetes/
[root@manage01 ssl]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
192.168.192.129 77m 3% 531Mi 30%
192.168.192.130 56m 2% 287Mi 16%