1、Kt Connect简介

  KT Connect ( Kubernetes Developer Tool ) 是轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具。其核心是通过建立本地到集群以及集群到本地的双向通道,从而提升在持续交付生命周期中开发环节的效率问题以及开发测试环境的复用问题。其官网如下

2、Kt Connect能帮我们实现什么

a、直接访问Kubernetes集群

  开发者通过KT可以直接连接Kubernetes集群内部网络,在不修改代码的情况下完成本地开发与联调测试

b、转发集群流量到本地

  开发者可以将集群中的流量转发到本地,从而使得集群中的其它服务可以联调本地

c、Service Mesh支持

  对于使用Istio的开发者,KT支持创建一个指向本地的Version版本

d、基于SSH的轻量级VPN网络

  KT使用shhuttle作为网络连接实现,实现轻量级的SSH VPN网络

e、作为kubectl插件,集成到Kubectl

  开发者也可以直接将ktctl集成到kubectl中

3、实践步骤

a、安装kubectl命令行工具,并配置本地可以访问Kubernetes集群

  以在window环境安装kubectl命令行工具为例(ps:本文的k8s是直接使用云厂商的k8s服务)

3.1下载kubectl

  请到kubernetes版本发布页面下载与集群版本对应的或者更新的kubectl。其下载链接如下

3.2、 安装kubectl后,配置一下环境变量 ,并用管理员cmd命令验证一下安装是否成功

C:\WINDOWS\system32>kubectl version --client

Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.9", GitCommit:"4fb7ed12476d57b8437ada90b4f93b17ffaeed99", GitTreeState:"clean", BuildDate:"2020-07-15T16:18:16Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"windows/amd64"}

3.3、 配置config文件

  在C:\Users\Administrator目录下新建.kube文件夹,并在该文件夹下新建config文件,并把kubeconfig内容拷贝到config文件中。

3.4、 验证是否可以访问Kubernetes集群

C:\WINDOWS\system32>kubectl cluster-info
Kubernetes master is running at https://apiserver地址 CoreDNS is running at https:/apiserver地址/api/v1/namespaces/kube-system/services/coredns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

b、安装KT Connect

  以在window安装为例,下载Windows可执行文件,并解压.exe文件到PATH路径下。其下载地址如下
  将下载的文件与上面的文件放在一起
 

c、验证KT Connect是否安装成功

C:\WINDOWS\system32>ktctl -v

使用

  kt-connect只会在指定连接的命名空间(namespace)里面新建一个自用的pod,然后部署一个kt-connect-shadow的镜像。分为四大模式:

1. Connect模式

  本地网络可以直接通过serviceid直接访问k8s集群网络中的服务,但是并没有加到集群里面其他服务里面,其他服务的流量并不会转发到本地电脑。
ktctl --debug --image=10.3.87.5:8080/kt-connect-shadow:latest --namespace=k8s-project connect
ktctl.exe connect --kubeconfig .\kubeconfig --namespace feature-N --debug(--kubeconfig,确保有足够权限和能正确连接K8S集群的API Server)
  在idea程序的VM options中添加

-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=2223

 
  在Java程序中所有网络请求完全通过KT Connect进行转发。从而可以直接在代码中访问Kubernetes集群中的服务。
注:
Failed to setup port forward local:28344 -> pod kt-connect-shadow-gseak:53 error="error upgrading connection: error sending request: Post " https://10.0.8.101:8443/api/v1/namespaces/feature-N/pods/kt-connect-shadow-gseak/portforward ": dial tcp 10.0.8.101:8443: connectex: A socket operation was attempted to an unreachable host.",
  如果出现以上报错的话,有可能是kt-connect路由BUG,可能本地电脑的路由与新加的通往API Server的路由有冲突,增加参数--excludeIps 10.0.8.101/32即可,如果网段冲突比较多,可以扩大网段范围,例如--excludeIps 10.0.8.0/24 参考 issue-302 。
ktctl.exe connect --kubeconfig .\kubeconfig --namespace feature-N --excludeIps 10.0.8.101/32 --debug

2. Exchange模式

  Connect和Exchange模式都是单向的,一个是从集群外部到集群内部,一个是从集群内部到集群外部。
 
  将集群里访问指定服务的所有请求拦截并转发到本地的指定端口。
ktctl exchange join-bpm-camunda --expose 8080 --debug --image=10.3.87.5:8080/kt-connect-shadow:latest --namespace=k8s-project
  具体原理就是将service里面的pod替换成一个serviceA-kt-exchange的pod。
  1.Exchange模式的流量方向是单向的,并不会将本地电脑主动发起的请求代理过去,如果K8S集群跟研发本地电脑不在一个网段内,需要另外开一个命令行运行Connect模式,确保本地服务可以正常连接K8S集群的其他服务,参考 issue-216 。
  2.Exchange模式是通过拦截service进行流量转发,假如集群的请求没有经过service,例如直接解析到pod之类,可能就会出现拦截失败的情况(同理Mesh模式也是如此),所以出现问题记得跟运维同学确认K8S集群内的路由情况。
  由于Nacos里面的服务最后基于ip访问,因此集群内无法通过这种方式来访问本机注册的服务。
解决:

添加 spring.cloud.nacos.discovery.ip: ${spring.application.name}

  在discovery下注册指定ip为服务名,这样pod在调ip时会走k8s的服务代理到对应的本机ip

3. Mesh模式

  mesh与exchange的最大区别在于,exchange会完全替换原有的应用实例。mesh命令创建代理容器,但是会保留原应用容器,代理容器会动态生成version标签,以便用于可以通过Istio流量规则将特定的流量转发到本地,同时保证环境正常链路始终可用。
ktctl mesh join-bpm-camunda --expose 8080 --debug --image=10.3.87.5:8080/kt-connect-shadow:latest --routerImage=10.3.87.5:8080/kt-connect-router:v0.3.6 --namespace=k8s-project
  执行命令后可以看到输出日志里面包含类似文字:
2:30PM INF Now you can access your service by header 'VERSION: xxxxx'
  这个模式本地电脑的服务和K8S集群里面相同的服务同时对外响应请求,但是只有通过指定的http请求头VERSION: xxxx的请求才会转发到本地电脑,相比Exchange模式,保证了其他人服务正常使用,同时研发又能进行本地调试。每次生成的请求头VERSION的值都是动态生成的,如果要固定这个值,可以通过参数--versionMark写死,例如固定值为test-version,命令如下:
ktctl mesh join-bpm-camunda --expose 8080 --debug --image=10.3.87.5:8080/kt-connect-shadow:latest --routerImage=10.3.87.5:8080/kt-connect-router:v0.3.6 --namespace=k8s-project --versionMark debug-version
  具体原理就是将serviceA里面的Pod替换成一个serviceA-kt-router的路由镜像,负责根据请求头进行流量代理转发,另外生成一个serviceA-kt-stuntman服务,这个就是线上正常运行的serviceA,还有一个serviceA-kt-mesh-xxxxx服务,这个就负责将代理流量到本地电脑。
 

4. Preview模式

ktctl preview join-bpm-camunda-debug --expose 8080 --image=10.3.87.5:8080/kt-connect-shadow:latest --namespace=k8s-project
  不同于Exchange和Mesh模式,要求K8S集群有一个在运行的服务,Preview模式可以将本地电脑运行的程序部署到K8S集群中作为一个全新的Service对外提供服务,非常便于新建服务的开发调试、预览等作用。

k8s本地联调工具kt-connect的更多相关文章

  1. 拍照、本地图片工具类(兼容至Android7.0)

    拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb ...

  2. k8s包管理工具helm - 介绍和安装

    目录 1.Kubernetes 应用部署的挑战 2.Helm 是什么 3.Helm 组件及相关术语 4.Helm 工作原理 5.Helm 安装 5.1 客户端安装 5.2 安装服务端 Tiller 5 ...

  3. Mac下的Docker及Kubernetes(k8s)本地环境搭建与应用部署、管理界面kubernetes-dashboard

    mac安装docker: brew cask install docker 当然也可以直接去官网下载docker的pkg文件安装 mac的docker国内镜像:网易的镜像地址:http://hub-m ...

  4. kubernetes(k8s)容器编排工具基础概念

    Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes 官网:https://ku ...

  5. kubernetes之二 使用minikube创建单节点k8s本地集群

    使用Minikube来运行kubernetes集群是最简单.快捷的途径.Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用.官方安装minikube教程请 ...

  6. Service Mesh - gRPC 本地联调远程服务

    Description Service Mesh 架构下,服务间调用会通过服务名(Service Name)互相调用,比如在 Kubernetes .Docker Swarm 集群中,服务 IP 均由 ...

  7. K8S 本地 配置 Local PV 实践

    上面我们创建了后端是 hostPath 类型的 PV 资源对象,我们也提到了,使用 hostPath 有一个局限性就是,我们的 Pod 不能随便漂移,需要固定到一个节点上,因为一旦漂移到其他节点上去了 ...

  8. Unity+NGUI打造网络图片异步加载和本地缓存工具(一)

    我们已经开发了在移动终端中,异步网络图片被装入多,在unity其中尽管AssetBundle存在,通常第一个好游戏的资源,然后加载到现场,但也有很多地方可以使用异步网络加载图像以及其缓存机制. 我也写 ...

  9. k8s本地搭建相信步骤

    搭建前的准备: 主机名配置 cat >/etc/hosts<<EOF127.0.0.1 localhost localhost.localdomain localhost4 loca ...

  10. k8s本地部署

    k8s是什么 Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署.自动扩缩容.维护等功能. Kubernetes 具有如下特点: 便携性: 无论公有云.私有云.混合 ...

随机推荐

  1. PHP全栈开发(七):PHP与MySQL存储交互(1.连接、创建数据库;创建数据表)

    在Linux服务器中可以使用命令 mysqladmin -u root password beijing2007; 来修改MySQL的root用户的密码. 但是在我们自己安装了wampserver的电 ...

  2. P4588 [TJOI2018]数学计算 (线段树)

    用线段树维护操作序列,叶子结点存要乘的数,非叶子结点存区间乘积,每次输出tr[1] 就是答案. 1 #include<bits/stdc++.h> 2 #define ll long lo ...

  3. 萌新也能看懂的KMP算法

    前言 算法是什么?算法就是数学规律.怎么去总结和发现这个规律,就是理解算法的过程. KMP算法的本质是穷举法,而并不是去创造新的匹配逻辑. 以下将搜寻的字符串称为子串(part),以P表示.被搜寻的字 ...

  4. PHP redis有序集合实现分页

    <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //设置 redis 字符 ...

  5. 22.通用视图GenericAPIView、属性和方法

    generics.ListCreateAPIView #源码 class ListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixi ...

  6. Vue报错:component has been registered but not used

    原因: ​​eslint​​代码检查到你注册了组件但没有使用,然后就报错了.比如代码: 比如​​Vue​​​中注册了​​File​​组件,而实际上却没有使用到(直接取消注册为好): ... impor ...

  7. vim常用快捷键总结一(光标移动命令)

    vim编辑器的工作模式分为3种即(命令模式,编辑模式和尾行模式),具体定义这里就不在赘述了,这里只简单介绍各工作模式下对应的操作和快捷方式. 通常来说三三种模式功能划分大致如下 命令模式:定位.翻页. ...

  8. 部署redis集群

    1.redis部署 redis单实例部署参考:https://www.cnblogs.com/silgen/p/16537299.html 版本:6.2.7 集群:6个节点(redis集群至少3个节点 ...

  9. C语言指针重点

    指针 指针与一维数组 万能公式 p[i] = *(p+i) = (i+p) = i[p] &p[i] == &((p+i))== p+i 指针与二维数组 二维数组万能公式: ((p+i ...

  10. vulnhub靶场之VIKINGS: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:DRIPPING BLUES: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhu ...