本文主要介绍如何基于http代理用minikube部署k8s,并简要说明下涉及到的一些关键实现原理,方便后续问题定位和排查。最终实现通过ingress在浏览器上访问部署在k8s上的dashboard服务。
使用minikube部署k8s非常简单,执行minikube start
就可以完成k8s部署,执行minikube delete
就可以卸载掉k8s。当然要实现如此快速的部署/卸载k8s操作,是有一些前提工作需要准备的,如果部署机器存在代理,则还需要踩一些坑。
本文主要介绍如何基于http代理使用minikube部署k8s,并最终通过ingress实现在浏览器上访问部署在k8s上的dashboard服务。
minikube部署k8s前会先创建一个虚拟机节点,然后在该节点上部署k8s相关组件。如果机器有配置代理,会影响到宿主机和虚拟机间的通信。
1、minikube不能直接用root账号部署,需要创建一个属于docker组的账号,这里创建一个developer账号
#创建developer账号
adduser developer
passwd developer #修改密码
usermod -aG wheel developer
#创建docker组,并将developer账号添加到docker组中
su - developer
sudo groupadd docker
sudo usermod -aG docker $USER
2、下载并安装minikube。详细见:https://minikube.sigs.k8s.io/docs/start/
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
3、安装k8s,如果机子没有配置代理,则不需要--docker-env
参数
minikube start --docker-env http_proxy=http://$YOURPROXY:PORT --docker-env https_proxy=http://$YOURPROXY:PORT --driver=docker --preload=false
如果要查看安装过程中详细的错误日志,可加--alsologtostderr
如果安装失败,想要重新安装,可执行minikube delete
清理安装痕迹。
4、下载并安装kubectl,详细见:https://kubernetes.io/docs/tasks/tools/install-kubectl/
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
5、配置环境变量
export no_proxy=$no_proxy,$(minikube ip)
export NO_PROXY=$NO_PROXY,$(minikube ip)
6、查看k8s集群各个组件状态
minikube status
7、使用kubectl查看minikube创建的虚拟机节点
kubectl get node -o wide
可登录到该节点上查看,密码为root
ssh root@$(minikube ip)
到这里,已经完成了k8s的安装。
需要特别说明的是,minikube创建的k8s环境使用的docker-daemon与宿主机上的docker-daemon不同,所以你会发现在宿主机上执行docker ps
看不到k8s集群中的容器实例。
要想在宿主机上查看k8s集群中的容器实例,可在宿主机上执行eval $(minikube -p minikube docker-env)
将docker-daemon切换到minikube创建的docker-daemon。
minikube提供了dashboard插件,可直接安装使用
minikube dashboard
查看dashboard相关pod是否有运行正常
kubectl get pods -n kubernetes-dashboard
dashboard创建的service 采用了 ClusterIP
的暴露策略,集群外部没法直接访问,需要设置代理才能访问。
k8s提供了快速创建代理的工具:
kubectl proxy --port=[需要暴露的端口号] --address='[服务器外网IP]' --accept-hosts='^[外部访问服务器的IP]$'
如:kubectl proxy --port=8001 --address='10.1.1.2' --accept-hosts='^.*'
这时可在浏览器上直接访问10.1.1.2:8001地址
如:http://10.1.1.2:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
k8s提供了ingress作为提供外部访问的统一入口。要使用ingress,需要先安装ingress controller。通常采用nginx作为ingress controller。
minikube提供了一些插件可直接安装使用
查看插件列表
minikube addons list
安装ingress controller,minikube提供的ingress是以nginx作为ingress controller
minikube addons enable ingress
创建ingress配置,通过dashboard.yingww.cn访问dashboard服务,ingress yaml配置如下
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: kubernetes-dashboard
namespace: kubernetes-dashboard
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: dashboard.yingww.cn
http:
paths:
- path: /
pathType: Prefix
backend:
serviceName: kubernetes-dashboard
servicePort: 80
创建的ingress会被k8s监听到,并加载到ingress controller的配置中。这里的ingress controller是nginx服务,所以上面的ingrss配置内容会转换为nginx的相关路由配置。如果感兴趣的话,可以进入到ingress controller的实例中查看nginx.conf,可以发现里面包含了上面配置的路由规则。了解ingress这块的工作原理,可以很方便后续路由问题的定位和排查。
查看创建的ingress
$ kubectl get ingress kubernetes-dashboard -n kubernetes-dashboard
NAME CLASS HOSTS ADDRESS PORTS AGE
kubernetes-dashboard <none> dashboard.yingww.cn 192.168.10.2 80 86s
从上面可知,访问dashboard的host为dashboard.yingww.cn,对应ip:port为192.168.10.2:80。
因为minikube创建的节点是在linux宿主机上,浏览器没法直接访问ingress。所以需要在宿主机上安装代理,将请求转发到ingress上。
这里以安装nginx为例
yum install nginx
修改nginx配置文件nginx.conf,采用四层转发,将宿主机的80端口请求转发到ingress服务,配置如下
stream {
upstream minikube {
server 192.168.10.2:80 weight=1 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
proxy_pass minikube;
proxy_timeout 600s;
proxy_connect_timeout 30s;
}
}
需要注意的是,nginx将80端口作为http的默认访问端口,为避免冲突,需要将http中监听的80端口改为其他端口。
修改后重新载入配置文件
nginx -s reload
最后在电脑本地配置hosts,将dashboard.yingww.cn解析到linux宿主机的外网ip后,就可以直接在浏览器上访问k8s dashboard服务
https://minikube.sigs.k8s.io/docs/start/
https://kubernetes.io/docs/tasks/tools/install-kubectl/
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
https://kubernetes.github.io/ingress-nginx/deploy/
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。