Windows下访问K8S集群中的POD

Windows下访问K8S集群中的POD

概述

近期在公司搭建了一个K8s集群,有一个项目使用了spring cloud框架做开发,在部署的时候发现一个问题。所有的微服务打包后运行在集群上,互相是可以通过feign进行访问的,这点没问题。但如果需要在本地调试,发现在集群中部署的应用无法反向访问本地应用,下面是我解决的具体方法。

应用服务器

K8s的安装和配置就不在这里具体说明了,将master中的k8s代理启动好,执行下面脚本。

启动脚本:proxy-start.sh

1
2
3
# /bin/sh

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

停止脚本:

1
2
3
4
# /bin/sh

pid=$(ps -ef|grep 'kubectl proxy --address 0.0.0.0 --accept-hosts .*' | grep -v grep | awk '{print $2}')
kill -9 $pid

测试地址:http://{IP地址}:8001/api/v1/namespaces/default/services

应用部署说明

应用名称 部署位置
Eureka k8s
Api-Gateway k8s
SSO-Login k8s
Auth-Service 本地

本地环境

准备工作

在本地环境中我们先下载kubectlkubefwd工具,并在当前windows用户下创建一个.kube文件,我这里的地址是C:\Users\13966\.kube

配置kubectl

在windows的cmd中使用命令配置k8s远程环境

1
2
3
4
5
kubectl config set-cluster {cluster_name} --server=https://master_ip:8001 --insecure-skip-tls-verify=true
kubectl config set-context {cluster_name}-context --cluster={cluster_name}
kubectl config set-credentials {cluster_name}-user --token={token}
kubectl config set-context {cluster_name}-context --user={cluster_name}-user --namespace=default
kubectl config use-context {cluster_name}-context

配置好后会在C:\Users\13966\.kube下生成一个config文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: {远程K8S代理API地址}
name: neusoft-cluster
contexts:
- context:
cluster: neusoft-cluster
namespace: {访问的命名空间}
user: neusoft-cluster-user
name: neusoft-cluster-context
current-context: neusoft-cluster-context
kind: Config
preferences: {}
users:
- name: neusoft-cluster-user
user:
token: {自己的Token}

到这里我们就可以使用k8s的命令来验证是否能连上远程代理

微信截图_20191113165954

这只是将windows和k8s打通了,还不能直接访问pod。我们还需要使用kubefwd软件,执行命令。

配置kubefwd

使用官方给的命令.\kubefwd.exe services -n default,这时就会看到下图,就说明我们本地能进行访问pods了

微信截图_20191113170256 微信截图_20191113170443

使用curl -i 来验证是否本地能访问,到这里windows中访问k8s集群的pod就完成了

Eureka本地远程互相访问

有了之前的一些配置后,只是打通了本地访问pod的问题,如果通过eureka进行转发还是会存在无法访问的情况,那么我们还需要在各个工程中设置如下:

1
2
3
4
5
# 关闭IP注册方式
eureka.instance.prefer-ip-address = false

# 对每一个微服务设置hostname
eureka.instance.hostname = hype-auth-service-svc

注意:hostname的名称必须要和k8s中Service.metadata.name一致,本地需要调试的工程无需进行设置,将ip注册方式打开就可以了。

参考文献