“mysql-service”的端口(PORT(S))有两个,“3306”是k8s内部端口,“30306”是外部端口。由于“NodePort”已经打开了对外端口,这时就可以在虚拟机上通过“30306”端口访问MySQL。
vagrant@ubuntu-xenial:~$ mysql -h localhost -P 30306 --protocol=tcp -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.7.27 MySQL Community Server (GPL) ... mysql>这时本地虚机已经与k8s联通了,下一步就可以在宿主机( 笔记本)上用图形客户端来访问MySQL了。我是在Vagrant里设定了私有网络,设定的虚机IP地址是 "192.168.50.4”,就用这个地址和30306端口来访问MySQL。
网络:这里的网络有两层含义,一层是k8s网络,就是让k8s内部服务之间可以互相访问,并且从k8s集群外部可以访问它内部的服务。另一层是宿主机(笔记本)和虚机之间的网路,就是在宿主机上可以访问虚机。这两层都通了之后,就可以在宿主机直接访问k8s集群里面的MySQL。
k8s网络:k8s的网络也有两层含义,一个是集群内部的,k8s有内部DNS,可以通过服务名进行寻址。另一个是从集群外部访问集群内部服务,一共有四种方式,详情请见“Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?”
LoadBalancer:Load Balancer不是由K8s来管理的。k8s通过Load Balancer把外部请求转发给内部服务。这种方法要求有Load Balancer,一般云环境里会提供,但自己的本地环境就没有了。不过Minikube提供了一个程序可以模拟Load Balancer。你只要键入“minikube tunnel ”,它就会模拟Load Balancer,对请求进行转发。只不过当你在使用“Load Balancer”时(在Minikube环境里),每次运行服务时产生的IP和端口是随机的,不能控制,使用起来不太方便,但在正式环境里就没有这个问题。
下面是服务信息,“EXTERNAL-IP”是"pending",说明外部网络不通。
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 31d nginx-service LoadBalancer 10.104.228.212 <pending> 80:31999/TCP 45h下面是在运行“minikube tunnel ”(在另一个窗口运行)之后的服务信息,“EXTERNAL-IP”是 “10.104.228.212”。这时Minikube的LoadBalancer已经起作用了,现在就可以通过IP地址从外部访问k8s内部的服务了,“80”是k8s内部端口,“31999”是k8s对外端口。
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 31d nginx-service LoadBalancer 10.104.228.212 10.104.228.212 80:31999/TCP 45h这是一种比较好的方式,但不能控制它的IP地址和端口,因此我暂时没有采用它。
NodePort:这种方法可以在每个Node上开放一个对外端口,每一个指向这个端口的请求都被转发给一个服务。它的好处是你可以指定一个固定的端口(端口的取值范围只能是30000–32767),这样我在笔记本上访问MySQL时就不用更换端口了。 如果你不指定,系统会随机分配一个。它的缺点是每个端口只能有一个服务,而且端口取值受限制,因此不适合生产环境。但在Windows环境,由于我用Vagrant固定了虚机的IP地址,这个问题就不存在了。因此它是最好的选择。
ClusterIP: 这个只能在k8s集群内部寻址。
Ingress: 这是推荐的方法,一般在生产环境中使用。Load balancer的问题是每一个服务都要有一个Load balancer,服务多了之后会很麻烦,这时就会用Ingress,它的缺点是配置起来比较复杂。Minikube自带了一个基于Nginx的Ingress控制器,只需运行“minikube addons enable ingress”,就行了。但Ingress的设置较复杂,因此这里没有用它。
虚拟机网络:这里讲的是宿主机(笔记本)和虚机之间的互相访问,主要是从宿主机访问虚机。我用的是Vagrant, 因此要在Vagran的配置文件(Vagrantfile)里进行配置。它有两种方法:
端口转发:它可以把笔记本上特定端口的请求转发到虚机的指定端口,还是比较方便的。只是如果事先不知道是哪个端口,或端口是变化的,就比较麻烦。Vagrant的配置命令:“config.vm.network "forwarded_port", guest: 3306, host: 3306, auto_correct: true”