kubernetes-sigs/apiserver-network-proxy

GitHub: kubernetes-sigs/apiserver-network-proxy

Kubernetes 官方的网络代理组件,通过 Proxy Server 与 Agent 建立反向隧道,为 API Server 提供到集群节点的 TCP 级别通信能力。

Stars: 443 | Forks: 220

# apiserver-network-proxy 由于 https://github.com/kubernetes/org/issues/715 而创建。 有关架构和详细信息,请参阅 [KEP 提案](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/1281-network-proxy#proposal)。 ## 版本控制与发布 从 `0.28.0` 版本开始,apiserver-network-proxy 项目正在更改其版本控制和发布 流程。今后,该项目将遵守以下规则: * 本项目遵循语义化版本控制(例如 `x.y.z`)进行发布和打标签。 * 标签表示已准备好发布,项目维护者将创建相应的发布。 * 发布版本和标签与 Kubernetes 的次要版本号(即 `x.y.z` 中的 `y`)保持一致。例如, 如果 Kubernetes 发布了 `1.99.0` 版本,apiserver-network-proxy 对应的发布版本和标签将是 `0.99.0`。 * 当次要版本号(即 `x.y.z` 中的 `y`)增加时,将创建新的分支,并遵循 `release-x.y` 的命名模式。例如,如果已发布 `0.99.0` 版本,则相应的分支 将被命名为 `release-0.99`。 * 当补丁应用到特定的发布分支时,发布版本和标签的补丁级别版本号将会更新。 例如,如果必须将补丁应用到 `release-0.99` 分支并创建新版本, 则版本号将为 `0.99.1`。以这种方式,补丁级别的版本号(即 `x.y.z` 中的 `z`)可能 与 Kubernetes 的补丁级别不匹配。 对于 Kubernetes `1.28.0+` 版本,我们建议使用与次要版本号相对应的标签。 例如,如果您正在使用 Kubernetes `1.99` 版本,请使用最新的 `0.99` 标签,并参考 `release-0.99` 分支。需要注意的是,apiserver-network-proxy 和 Kubernetes 之间的补丁级别可能存在差异。 对于 Kubernetes `<=1.27` 版本,建议使 apiserver-network-proxy 的 server 和 client 次要发布版本号保持一致。 对于 Kubernetes,这意味着: * Kubernetes v1.26 到 v1.27 版本:`0.1.X` 标签,`release-0.1` 分支。 * Kubernetes v1.23 到 v1.25 版本:`0.0.X` 标签,`release-0.0` 分支。 * Kubernetes v1.23 及以下版本:apiserver-network-proxy 最多到 `v0.0.30` 版本。 有关具体的发布版本,请参考 kubernetes 的 go.mod 文件。 ## 构建 请确保您已设置 REGISTRY 和 PROJECT_ID 环境变量。 对于本地构建,这些可以设置为任意值。 对于镜像构建,它们决定了镜像的位置。 对于 GCE,registry 应为 gcr.io,PROJECT_ID 应为您想要使用该镜像的 项目。 请确保 go bin 目录(通常为 `~/go/bin`)在您的 `PATH` 中。 ### Mockgen 您的系统上必须安装 [```mockgen```](https://github.com/uber-go/mock) 工具。 目前,我们使用的是 go.uber.org/mock/mockgen@v0.5.2 `go install go.uber.org/mock/mockgen@v0.5.2` ### Protoc Proto 定义使用 `protoc` 编译。请确保您已安装 protoc([说明](https://grpc.io/docs/languages/go/quickstart/)),并拥有相应版本的 `protoc-gen-go` 和 `protoc-gen-go-grpc` 库。 目前,我们使用的是 protoc-gen-go@v1.27.1 `go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1` 目前,我们使用的是 protoc-gen-go-grpc@v1.2 `go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2` ### 本地构建 ``` make clean make certs make gen make build ``` ### 构建镜像 ``` make docker-build ``` ## 示例 当前的示例运行了两个实际的服务,以及在一端运行一个示例 client,在另一端运行一个请求的示例 destination。 - *Proxy service:* Proxy service 接收 API server 的请求并适当地转发它们。 - *Agent service:* Agent service 连接到 proxy,然后允许将流量转发给它。 ### 使用带有 dial back Agent 的 mTLS Proxy 的 GRPC Client ``` Frontend client =HTTP over GRPC=> (:8090) proxy (:8091) <=GRPC= agent =HTTP=> http-test-server(:8000) | ^ | Tunnel | +---------------------------------------------------------------+ ``` - 启动简单测试 HTTP Server(示例 destination) ``` ./bin/http-test-server ``` - 启动 proxy service ``` ./bin/proxy-server --server-ca-cert=certs/frontend/issued/ca.crt --server-cert=certs/frontend/issued/proxy-frontend.crt --server-key=certs/frontend/private/proxy-frontend.key --cluster-ca-cert=certs/agent/issued/ca.crt --cluster-cert=certs/agent/issued/proxy-frontend.crt --cluster-key=certs/agent/private/proxy-frontend.key ``` - 启动 agent service ``` ./bin/proxy-agent --ca-cert=certs/agent/issued/ca.crt --agent-cert=certs/agent/issued/proxy-agent.crt --agent-key=certs/agent/private/proxy-agent.key ``` - 运行 client(启用了 mTLS 的示例 client) ``` ./bin/proxy-test-client --ca-cert=certs/frontend/issued/ca.crt --client-cert=certs/frontend/issued/proxy-client.crt --client-key=certs/frontend/private/proxy-client.key ``` ### 使用带有 dial back Agent 的 Proxy 的 GRPC+UDS Client ``` Frontend client =HTTP over GRPC+UDS=> (/tmp/uds-proxy) proxy (:8091) <=GRPC= agent =HTTP=> SimpleHTTPServer(:8000) | ^ | Tunnel | +----------------------------------------------------------------------------+ ``` - 启动简单测试 HTTP Server(示例 destination) ``` ./bin/http-test-server ``` - 启动 proxy service ``` ./bin/proxy-server --server-port=0 --uds-name=/tmp/uds-proxy --cluster-ca-cert=certs/agent/issued/ca.crt --cluster-cert=certs/agent/issued/proxy-frontend.crt --cluster-key=certs/agent/private/proxy-frontend.key ``` - 启动 agent service ``` ./bin/proxy-agent --ca-cert=certs/agent/issued/ca.crt --agent-cert=certs/agent/issued/proxy-agent.crt --agent-key=certs/agent/private/proxy-agent.key ``` - 运行 client(启用了 mTLS 的示例 client) ``` ./bin/proxy-test-client --proxy-port=0 --proxy-uds=/tmp/uds-proxy --proxy-host="" ``` ### 使用带有 dial back Agent 的 mTLS Proxy 的 HTTP-Connect Client(使用 curl 或测试 client 均可) ``` Frontend client =HTTP-CONNECT=> (:8090) proxy (:8091) <=GRPC= agent =HTTP=> SimpleHTTPServer(:8000) | ^ | Tunnel | +-------------------------------------------------------------+ ``` - 启动 SimpleHTTPServer(示例 destination) ``` ./bin/http-test-server ``` - 启动 proxy service ``` ./bin/proxy-server --mode=http-connect --server-ca-cert=certs/frontend/issued/ca.crt --server-cert=certs/frontend/issued/proxy-frontend.crt --server-key=certs/frontend/private/proxy-frontend.key --cluster-ca-cert=certs/agent/issued/ca.crt --cluster-cert=certs/agent/issued/proxy-frontend.crt --cluster-key=certs/agent/private/proxy-frontend.key ``` - 启动 agent service ``` ./bin/proxy-agent --ca-cert=certs/agent/issued/ca.crt --agent-cert=certs/agent/issued/proxy-agent.crt --agent-key=certs/agent/private/proxy-agent.key ``` - 运行 client(启用了 mTLS 和 http-connect 的示例 client) ``` ./bin/proxy-test-client --mode=http-connect --proxy-host=127.0.0.1 --ca-cert=certs/frontend/issued/ca.crt --client-cert=certs/frontend/issued/proxy-client.crt --client-key=certs/frontend/private/proxy-client.key ``` - 运行 curl client(使用 mTLS http-connect proxy 的 curl) ``` curl -v -p --proxy-key certs/frontend/private/proxy-client.key --proxy-cert certs/frontend/issued/proxy-client.crt --proxy-cacert certs/frontend/issued/ca.crt --proxy-cert-type PEM -x https://127.0.0.1:8090 http://localhost:8000/success ``` ### 在 kubernetes 上运行 请参阅以下 [README.md](examples/kubernetes/README.md) ### 使用 `kind` 在本地 kubernetes 集群上运行 请参阅此 [README.md](examples/kind/README.md),其中提供了一个示例,该示例使用 `kind` 创建了一个本地 kubernetes 集群,并在 worker 节点上部署 proxy agent,在 control plane 节点上部署 proxy server。 请参阅此 [README.md](examples/kind-multinode/README.md) 获取类似示例,该示例创建了一个 `kind` 集群,支持用户自定义配置 control plane 和 worker 节点的数量,并可选地 sideload 自定义的 proxy agent 和 server 镜像。 ### 教程 请参阅此 [设置 Konnectivity 服务](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/) 教程,这是一个 Konnectivity 服务提供 TCP 级别 proxy 以实现 control plane 与集群通信的示例。 ### 客户端 `apiserver-network-proxy` 组件旨在作为独立的二进制文件运行,不应作为库导入。与网络 proxy 通信的 client 可以导入 `konnectivity-client` 模块。
标签:EVTX分析, gRPC, Python工具, 安全合规, 日志审计, 网络代理, 网络通信, 请求拦截