前提
基于ubuntu 18.4 已经搭建了一套简单的k8s 集群
kubectl,docker 服务能正常停启
基本环境
lcf@vm1:~/k8s$ kubectl get nodes NAME STATUS ROLES AGE VERSION vm1 Ready master 5d v1.12.5 vm2 Ready <none> 5d v1.12.5
master:vm1
node1:vm2
查看本集群中的node
tips : 查看各种对象列表: kubectl get nodes/svc/pods, 默认-n 是 namespace=default , 如果查找不到,可-n 更详细的namespace
部署一个最简单的测试应用nginx
创建一个部署和服务
kubectl create deployment nginx --image=nginx kubectl create service nodeport nginx --tcp 80:80
创建成功后可查看执行中的pod
lcf@vm1:~/Tekton$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-55bd7c9fd-94tj5 1/1 Running 0 4h33m
注: 使用--image=nginx 默认是从docker mirror 中pull 镜像,会默认从国外镜像pull , 如果pull 失败时,看到的pod 的状态为:ImagePullBackOff , 当status 不是running 时,需要进一步查看该pod 的执行情况,可以在describe 中看到实际failed 的原因
kubectl describe pod nginx-55bd7c9fd-94tj5
扩展: 如果是连接超时pull失败,可改docker 镜像为阿里镜像,在/etc/docker/daemon.json中加入,注意如果原来已有内容,新增记录时,需以逗号隔开上下文。否则daemon reload后 会因配置文件语法错误无法restart docker
/etc/docker/daemon.json ....... , "registry-mirrors": ["http://ef017c13.m.daocloud.io"]
获取阿里mirror 的方法,登录进官网https://cr.console.aliyun.com/#/accelerator,在加速镜像中copy 自己的链接http://xxxxxxxx.m.daocloud.io
修改完registry-mirrors之后,重启docker
systemctl daemon-reload systemctl restart docker
然后重新启动部署
# 在master 即vm1 上重新部署服务 kubectl delete deployments/nginx services/nginx kubectl create deployment nginx --image=nginx kubectl create service nodeport nginx --tcp 80:80 kubectl get pods,svc 当pod status是running 时,使用nodeIP:nodeport进行访问
比如,查看服务nginx 是 可用32746访问
lcf@vm1:~/Tekton$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d1h nginx NodePort 10.110.190.22 <none> 80:32746/TCP 4h44m
在node 端验证curl localhost:32746 , 本例中是vm2
root@vm2:~# curl localhost:32746 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
同理,使用vm2的http://vm2ip:32746 浏览器访问也能显示。
同理,master在k8s里实际是一特殊的node,所以换成vm1ip时也应能正常访问服务,**即当一个服务以节点端口暴露时,应该是可以使用任意结点ip+节点端口访问**
部署k8s 的 WEB UI 应用
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
参考官网的方法,但是官网的方法直接使用的话,只能通过kubectl proxy在本机上访问ui 的面板。即如果我的集群master 是 vm1 ,我部署完web-ui后,只能在vm1上打开vm1本身浏览器访问本地链接http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ ,网上有些方法可以在执行proxy的时候指定address ,就可以用指定的ip 去访问这个地址,但是后续填token 的时候响应有些问题,所以我没有用这个方法。
这种情况有一个便捷一点的方法就是把这个部署为nodeport 类型的服务,就可以在集群内的任一节点,使用节点ip 加 节点端口去访问。而不是使用上面的地址。
需要在kubectl apply recommended.yaml之前,先修改yaml里的内容,给服务增加一个类型。
1. 官网的标准做法,全部在master 上执行和打开链接
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml kubectl proxy
see in http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.
2. 为了适应实际远程操作服务器的需要做出的调整
2.1先下载上文所说的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml vi recommended.yaml #修改文件,找到一个名字为kubernetes-dashboard 的 Service,在spec里面加入type: NodePort
2.2 应用这个文件,创建里面的资源
kubectl apply -f recommended.yaml
2.3 不需要执行kubectl proxy进行代码,直接查看服务,获取节点端口
lcf@vm1:~/k8s$ kubectl get svc -n kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-metrics-scraper ClusterIP 10.109.133.255 <none> 8000/TCP 24h kubernetes-dashboard NodePort 10.96.168.219 <none> 443:30524/TCP 24h
2.4 从2.3可知能使用 ip:节点端口30524访问,比如vm1_ip:30524 或vm2_ip:30524
可以从本机的windows PC 使用 刚才部署的控制面板 https://ip:30524
进入控制面板:
使用token 的形式:
创建一个service account ,名称为myuisa或自定义 ,namespace 为kubernetes-dashboard,这个根据上面的yaml创建资源的时候用的namespace
kubectl create serviceaccount myuisa -n kubernetes-dashboard
将帐户myuisa 与集群角色权限绑定起来
kubectl create clusterrolebinding dashboard-admin --clusterrole=admin --serviceaccount=kubernetes-dashboard:myuisa
查看此帐号的secret name
kubectl get secret -n kubernetes-dashboard | grep myuisa
查看此secret的token
kubectl describe secret myuisa-1-token-xpwhl -n kubernetes-dashboard
将上方命令结果里的token 拷贝出来,sign in 进入以下界面
No Leanote account? Sign up now.