#kubernetes-cluster #kubernetes #kubectl #cli #env-var #port-forward

app k8sfwd

用于管理多个目标的 Kubernetes 端口转发工具

3 个版本 (重大更改)

0.3.0 2023年7月22日
0.2.0 2023年7月17日
0.1.0 2023年7月16日

#972 in 命令行工具

EUPL-1.2

67KB
1.5K SLoC

k8s:fwd — 基于配置的 Kubernetes 多端口转发

用于处理对多个服务和跨多个集群的端口转发的工具。

当前设置基于 cargo,直到可以提供特定平台的二进制文件。要安装最新版本(或更新到它),请运行

cargo install k8sfwd

请注意,应用程序内部依赖于 kubectl,因此它必须在您的路径中。如果 kubectl 不在您的路径中,您可以通过 --kubectl 参数或 KUBECTL_PATH 环境变量指定它。

根据您的配置,您将看到类似以下内容

██╗░░██╗░█████╗░░██████╗░░░░░███████╗██╗░░░░░░░██╗██████╗
██║░██╔╝██╔══██╗██╔════╝░██╗░██╔════╝██║░░██╗░░██║██╔══██╗
█████═╝░╚█████╔╝╚█████╗░░╚═╝░█████╗░░╚██╗████╗██╔╝██║░░██║
██╔═██╗░██╔══██╗░╚═══██╗░██╗░██╔══╝░░░████╔═████║░██║░░██║
██║░╚██╗╚█████╔╝██████╔╝░╚═╝░██║░░░░░░╚██╔╝░╚██╔╝░██████╔╝
╚═╝░░╚═╝░╚════╝░╚═════╝░░░░░░╚═╝░░░░░░░╚═╝░░░╚═╝░░╚═════╝
k8s:fwd 0.2.0 - a Kubernetes multi-cluster port forwarder
Using kubectl version v1.24.12-dispatcher
Using config from 2 locations

Forwarding to the following targets:
#0 Items API (Staging)
   target:  service/foo.test-api
   context: (default)
   cluster: (default)
#1 Items API (Production)
   target:  pod/foo-59b58f5d68-6t6bh.test-api
   context: (default)
   cluster: production

Spawning child processes:
#0: Error from server (NotFound): pods "foo-59b58f5d68-6t6bh" not found
#0: Process exited with exit status: 1 - will retry in 5 sec
#1: Forwarding from 127.0.0.1:5012 -> 80
#1: Forwarding from 127.0.0.1:46737 -> 8080
#1: Forwarding from [::1]:5012 -> 80
#1: Forwarding from [::1]:46737 -> 8080
#0: Error from server (NotFound): pods "foo-59b58f5d68-6t6bh" not found
#0: Process exited with exit status: 1 - will retry in 5 sec

命令行选项

过滤器

可以通过在命令行上指定的前缀过滤器选择目标。只有以指定前缀开始的目标(和目标名称)将被转发。在以下示例中,以 foobar 开始的服务将被选择

k8sfwd foo bar

过滤器还可以与标签一起使用

k8sfwd -t test foo bar

标签

可以将标签分配给目标。当 k8sfwd 与一个或多个用空格分隔的 --tags 参数启动时,目标将被过滤以匹配选择。如果指定了多个值(例如 --tags foo bar),则任何匹配的标签都将导致选择目标。如果使用加号将两个标签组合(例如 --tags foo+bar),则只选择同时匹配两个标签的目标。

目标标签 --tags 参数 已选择
(无) (无) ✅ 是
(无) --tags some ❌ 否
["foo", "bar", "baz"] (无) ✅ 是
["foo", "bar", "baz"] --tags fubar ❌ 否
["foo", "bar", "baz"] --tags foo bar ✅ 是
["foo", "bar", "baz"] --tags bar ✅ 是
["foo", "bar", "baz"] --tags foo+baz ✅ 是
["foo", "bar", "baz"] --tags foo+fubar ❌ 否
["foo", "bar", "baz"] --tags foo+baz fubar ✅ 是
["fubar"] --tags foo+baz fubar ✅ 是

配置

配置以 YAML 文件的形式提供。

  • 如果在程序启动时通过 --file 参数指定了一个或多个文件,将加载它们的配置。
  • 如果没有指定配置文件,k8sfwd 将递归地在以下位置查找 .k8sfwd 文件:
    • 当前目录层次结构
    • 您的家目录
    • 您的配置目录,按此顺序。

非目标配置(例如,重试延迟)始终从上面的层次结构加载,无论是否存在 --file 参数。但是,所有未通过 --file 参数指向的文件直接指定的目标配置都将被忽略。

请参阅k8sfwd-example.yaml 以获取示例。

---
version: 0.1.0
config:
  # Optional: Number of seconds to wait before attempting to re-establish
  # a broken connection.
  retry_delay_sec: 5.0
targets:
  - name: Test API (Staging)    # Optional, for display purposes.
    target: foo                 # The name of the resource to forward to.
    tags:                       # Optional, for use with `--tags <tag1> <tag2>+<tag3>`
      - integration
    type: service               # Can be service, deployment or pod.
    namespace: bar              # The namespace of the resource.
    context: null               # Optional; will default to current context.
    cluster: null               # Optional; will default to current cluster.
    ports:
      - "5012:80"               # Forward resource port 80 to local port 5012.
      - "8080"                  # Forward resource port 8080 to random local port. 
  - name: Test API (Production)
    target: foo-59b58f5d68-6t6bh
    type: pod
    namespace: bar
    cluster: production
    listen_addrs:               # Select the listen addresses; defaults to `localhost`.
      - "127.1.0.1"
    ports:
      - "5012:80"

依赖项

~3–12MB
~132K SLoC