将k8s集群部署到独立的电脑上

网络问题

k8s集群部署在虚拟机上,而虚拟机使用的是内网IP,其他机器无法访问。

解决方法:

  • VMware Workstation 具备端口转发功能,能够将宿主机上的端口映射到虚拟机的IP地址上,具体操作流程为:

    1. 编辑

    2. 虚拟网络编辑器

    3. 更改设置

    4. NAT设置

    在弹出的窗口中,配置端口转发即可,配置成功后的效果如下图:

    注意,ssh服务的端口是22。

  • 关闭宿主机上的防火墙,打开Windows的防火墙设置界面,把域网络、专用网络、公用网络的防火墙全部关闭即可。

代理问题

管理kubernetes集群需要与apiserver服务进行通信,该服务是一个http协议的服务,因此可以采用nginx代理apiserver。通过宿主机上的nginx反向代理虚拟机中的apiserver请求,与常用的http反向代理不同,在此处只能使用4层代理,而不能是7层代理,即不能使用http指令,而应该使用stream指令,具体内容如下:

访问apiserver时必须使用https协议,而k8s集群的ssl签名的CN是有限制的,所以需要配置域名映射(DNS),可以将kubernetes作为域名映射到宿主机IP地址,即将hosts文件中增加以下映射(10.12.53.27是宿主机的IP地址):

10.12.53.27 kubernetes

并对admin.conf进行如下修改(该文件从k8s集群上下载下来/etc/kubernetes/admin.conf):

server: https://kubernetes:16443

提示:

  • 在搭建高可用集群时,选用了haproxy作为代理服务器,而另一种选择就是nginx。

    在高可用配置下,操作集群的命令都是先发送给了负载均衡器,然后由负载均衡器进行请求转发,与上述代理的要求是类似的,一样都是反向代理。

  • 在上述配置中,还配置对dashboard的反向代理

  • 如果不进行域名映射,错误信息如下所示:

    • 使用不恰当的域名作为映射:

      E1202 17:53:09.951455    9160 memcache.go:265] couldn't get current server API group list: Get "https://kubernetes2:16443/api?timeout=32s": tls: failed to verify certificate: x509: certificate is valid for kubernetes, kubernetes.default, kubernetes.default.svc, 
      kubernetes.default.svc.cluster.local, master, not kubernetes2
    • 直接使用宿主机IP:

      E1202 17:51:04.026743   13176 memcache.go:265] couldn't get current server API group list: Get "https://10.12.53.27:16443/api?timeout=32s": tls: failed to verify certificate: x509: certificate is valid for 10.96.0.1, 192.168.10.121, not 10.12.53.27

代理其他service

类似于Dashboard,在kubernetes上部署一个对外网开放的service,即设置type=NodePort的service,但是因为虚拟机的限制,除了宿主机其他机器一样是访问不到的,有三种解决办法:

  • 配置VMware,预先配置一些端口转发之后在配置service的时候再使用这些预先定义的设置好的端口

  • 配置nginx,预先定义一些端口代理

  • 在客户机(非k8s集群的宿主机)上使用kubectl proxy命令,这会在本地上启动一个代理,然后就可以在客户机访问service了。

    $ kubectl proxy
    Starting to serve on 127.0.0.1:8001

    以dashboard为例,此时可以使用下述链接访问dashboard服务:

    http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

    URL的规则如下(猜测):

    • http://localhost:8001/api/v1/namespaces

    • /<命名空间名称>

    • /services

    • /<协议>:<服务名>:

    • /proxy

    • /URI # service提供的URL

    例如,存在一个默认空间中的自定义service,其信息如下所示:

    $ kubectl get svc hello
    NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    hello   NodePort   10.101.112.164   <none>        8890:30080/TCP   105m

    可以通过如下链接进行访问:

    http://localhost:8001/api/v1/namespaces/default/services/http:hello:/proxy/v1/hello

    /v1/hello是service提供的URI地址。

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

最后更新于