从零开始搭建 k8s 集群环境系列笔记:
- 从零开始搭建 k8s 集群环境 (一)—— 搭建镜像存储服和镜像服
- 从零开始搭建 k8s 集群环境 (二)—— 构建 Kubernetes 安装包
- 从零开始搭建 k8s 集群环境 (三)—— 搭建 Master 节点
- 从零开始搭建 k8s 集群环境 (四)—— 添加 Node 节点
- 从零开始搭建 k8s 集群环境 (五)—— 安装 Pod 网络
- 从零开始搭建 k8s 集群环境 (六)—— 部署 Dashboard UI
- 从零开始搭建 k8s 集群环境 (七)—— 部署 Ingress 服务
- 从零开始搭建 k8s 集群环境 (番外)—— 纯手动部署全套
在上一篇博客中,我们的 k8s 集群基本就已经部署完成了。但是为了方便了解 k8s 的各项概念,我们再继续把 k8s 的 Dashboard UI图形化界面 插件搭建起来。
环境说明:
- Master:VBox虚拟机/Centos_7.5-1804/192.168.56.100
- Images:VBox虚拟机/Centos_7.5-1804/192.168.56.101
- Node01:VBox虚拟机/Centos_7.5-1804/192.168.56.102
软件环境说明:
- docker-ce-17.03.2
- kubernetes-v1.9.0
- harbor-v1.4.0
一、准备镜像和 yaml 文件
镜像
老规矩,阿里云走起:
docker pull registry.cn-shenzhen.aliyuncs.com/lx0758/kubernetes-dashboard-amd64:v1.8.3
docker tag registry.cn-shenzhen.aliyuncs.com/lx0758/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
docker rmi registry.cn-shenzhen.aliyuncs.com/lx0758/kubernetes-dashboard-amd64:v1.8.3
yaml 文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
修改 yaml 文件
实际操作发现,服务器的 yaml 有些地方并不太合理,所以还得手动修改一下。
更改镜像下载策略
yml 中默认强制走服务器下拉镜像,在国内网络环境明显是不合理的,需要改成 “如果本地没有再去拉取”。
修改镜像 pull 策略
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
template:
spec:
containers:
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
# 修改镜像 pull 策略
imagePullPolicy: IfNotPresent
更改部署节点
通过节点名称改变
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
template:
spec:
# nodeName 和 containers 同级
# 强制指定调度节点为 localhost.master
nodeName: localhost.master
通过节点标签改变
查看所有节点所有 label
[root@localhost ~]# kubectl get nodes localhost.master --show-labels
NAME STATUS ROLES AGE VERSION LABELS
localhost.master Ready master 14h v1.9.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=localhost.master,node-role.kubernetes.io/master=
这里我们使用 k8s 自带的 lable 操作:
kubernetes.io/hostname=localhost.master
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
template:
spec:
# nodeSelector 和 containers 同级
nodeSelector:
# 指定调度节点label标记为:
# kubernetes.io/hostname=localhost.master 的节点
kubernetes.io/hostname: localhost.master
修改 apiserver Host
必须指向自己的 Master 的 apiserver:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
template:
spec:
containers:
- args:
- --auto-generate-certificates
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
# 这里对应 apiserver 的访问地址,如果是 https 还需要下面那一句
- --apiserver-host=https://192.168.56.100:6443
# 因为 apiserver 是证书认证,所以需要加上证书信息(这个文件是挂载的)
- --kubeconfig=/etc/kubernetes/master-kubeconfig.yaml
由于 apiserver 使用的是 https 协议证书授权,我们还需要向 pod 配置证书挂载:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
template:
spec:
containers:
volumeMounts:
# 添加一个容器内挂载目标,和上一步 --kubeconfig 定义路径相同
- mountPath: /etc/kubernetes/master-kubeconfig.yaml
name: kubeconfig
volumes:
# 添加挂载文件所在主机的位置
- name: kubeconfig
hostPath:
path: /root/.kube/config
添加直接访问端口
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
# 添加端口类型
type: NodePort
ports:
- port: 443
# 添加直接访问端口
nodePort: 30000
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
二、正式部署
应用 yaml 文件
kubectl create -f ./kubernetes-dashboard.yaml
开始使用
没有问题的话,就可以通过浏览器访问了(可能需要在浏览器添加例外):
Token登录
这里有一个简单的命令:
kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
也可以自己手动查询:
# 输入下面命令查询kube-system命名空间下的所有secret
kubectl get secret -n kube-system
# 然后获取token。只要是type为service-account-token的secret的token都可以使用。
# 比如我们获取replicaset-controller-token-wsv4v的touken
kubectl -n kube-system describe replicaset-controller-token-wsv4v
Kubeconfig验证
只需要在 kubeadm
生成的 admin.conf
文件末尾加上刚刚获取的 token
就好了。
- name: kubernetes-admin
user:
client-certificate-data: xxxxxxxx
client-key-data: xxxxxx
token: "在这里加上token"
三、问题总结
Dashboard 自动在节点运行,导致不可用
具体表现症状是 Pod
运行出错,但镜像已经下拉成功。加改变运行节点的配置,强制在 Master
节点运行。
其他问题
其实遇到的问题还很多,虽然部署是成功了,但是有些问题我也还没弄明白原理,就先不写出来了。