如何参与 Envoy Gateway 社区:贡献或提交代码指南

本指南提供了如何参与 Envoy Gateway 开源项目的详细步骤,包括设置开发环境、代码贡献、PR 流程以及与社区互动的方法。

版权声明
本文为 Jimmy Song 原创。转载请注明来源: https://jimmysong.io/blog/envoy-gateway-contributor-guide/
查看本文大纲

Envoy Gateway 是由 Envoy Proxy 社区推动的一个开源 API 网关项目,结合了 Contour、Emissary 等项目力量。这个指南将帮助你理解如何贡献代码和参与社区。

开始之前

了解项目的目标和愿景是非常重要的。Envoy Gateway 旨在作为一个独立或基于 Kubernetes 的应用程序网关,使用 Gateway API 资源来管理 Envoy 代理。

如何参与

1. 沟通协作

在开发前,建议通过GitHubSlack与社区交流。始终创建一个 GitHub Issue 来讨论你的想法。

2. 贡献准则

遵守贡献准则,它包括代码规范和社区行为准则。

3. 提交代码

  • 签署 DCO:确保你的提交信息包含 DCO 签名。
  • 创建 PR:Fork 仓库后,提交 PR。确保通过所有自动化测试。
  • 代码审查:PR 会被维护人员审查,一旦满足条件,将会被合并。

构建和测试指南

环境准备

  • 必需工具
    • Go(版本 1.22+)
    • Make(版本 4.0+)
    • Docker(可选,版本 20.10.16+,用于构建镜像)
    • Python3
  • 设置步骤:确保所有工具均已安装并配置好环境变量。

代码构建

  • 构建命令
    • 构建全部二进制文件:make build
    • 仅构建 Envoy Gateway:make build BINS="envoy-gateway"
    • 构建控制工具 egctlmake build BINS="egctl"

测试

  • 运行测试:执行 make test 来进行 Go 语言的测试。
  • 生成测试数据:执行 make testdata 来生成 YAML 格式的测试数据。

Lint 检查

  • 执行 Lint:运行 make lint 确保代码风格和标准一致性(注意修正现有的拼写错误)。

镜像操作

  • 构建镜像IMAGE=docker.io/<dockerhub-id>/gateway-dev make image
  • 推送多架构镜像IMAGE=docker.io/<dockerhub-id>/gateway-dev make push-multiarch

部署和调试

  • 本地集群创建:使用 make create-cluster 在 Kind 上创建测试/开发用的集群。
  • 部署到 Kubernetes:使用 IMAGE=docker.io/<dockerhub-id>/gateway-dev TAG=<image-tag> make kube-deploy 将 Envoy Gateway 部署至 Kubernetes。
  • 部署示例应用:执行 make kube-demo 部署 demo 后端服务及相关网络资源。
  • 删除部署:执行 make kube-demo-undeploy 删除示例应用。执行 make kube-undeploy 删除 Envoy Gateway。
Kind 中运行的 Pod 列表

当你完成 Envoy Gateway 和示例应用部署后,运行 kubectl get pod -A 命令,你将看到如下所示的 Pod 列表。

查看 Kind 中运行的 Pod

 NAMESPACE              NAME                                                  READY   STATUS    RESTARTS      AGE
 default                backend-96f75bbf-tcdf7                                1/1     Running   1 (97s ago)   13h
 envoy-gateway-system   envoy-default-eg-e41e7b31-668f754989-wb7xr            2/2     Running   2 (97s ago)   13h
 envoy-gateway-system   envoy-gateway-b457dc69b-l77cr                         1/1     Running   2 (97s ago)   13h
 kube-system            coredns-5dd5756b68-b494d                              1/1     Running   1 (97s ago)   14h
 kube-system            coredns-5dd5756b68-j46bx                              1/1     Running   1 (97s ago)   14h
 kube-system            etcd-envoy-gateway-control-plane                      1/1     Running   1 (97s ago)   14h
 kube-system            kindnet-sq4b4                                         1/1     Running   1 (97s ago)   14h
 kube-system            kube-apiserver-envoy-gateway-control-plane            1/1     Running   1 (97s ago)   14h
 kube-system            kube-controller-manager-envoy-gateway-control-plane   1/1     Running   2 (97s ago)   14h
 kube-system            kube-proxy-4x72s                                      1/1     Running   1 (97s ago)   14h
 kube-system            kube-scheduler-envoy-gateway-control-plane            1/1     Running   2 (97s ago)   14h
 local-path-storage     local-path-provisioner-6f8956fb48-shjcz               1/1     Running   2 (59s ago)   14h
 metallb-system         controller-5c6b6c8447-kjl4n                           1/1     Running   2 (59s ago)   14h
 metallb-system         speaker-6zlrb                                         1/1     Running   1 (97s ago)   14h

调试 Envoy 配置

  • 端口转发设置
    export ENVOY_DEPLOYMENT=$(kubectl get deploy -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}')
    kubectl port-forward deploy/${ENVOY_DEPLOYMENT} -n envoy-gateway-system 19000:19000
    
  • 访问:在浏览器中打开 http://localhost:19000 访问 Envoy 管理界面进行配置调试。
  • 网络环境适配:在中国大陆进行构建和推送镜像时,可能需要设置 Docker 代理以确保依赖的镜像能够下载。详细操作可参考设置 Docker 代理
注意事项

若你在中国大陆的网络环境下构建和推送镜像,需要为 Docker 设置代理,否则你将无法下载一些依赖镜像。你可以将它们下载到本地后再用 kind load 命令加载到 kind 里。需要下载和加载到 kind 里的镜像见下面的代码。

pull-and-load-images-for-kind.sh

#!/bin/bash
echo "Pull the images and load them into the kind cluster..."
docker pull envoy-gateway-control-plane quay.io/metallb/controller:v0.13.10
docker pull envoy-gateway-control-plane quay.io/metallb/speaker:v0.13.10
docker pull envoy-gateway-control-plane docker.io/jimmysong/gateway-dev:435a4dc1
docker pull envoy-gateway-control-plane envoyproxy/envoy:distroless-dev
docker pull envoy-gateway-control-plane gcr.io/k8s-staging-gateway-api/echo-basic:v20231214-v1.0.0-140-gf544a46e
 
kind load docker-image -n envoy-gateway --nodes envoy-gateway-control-plane quay.io/metallb/controller:v0.13.10
kind load docker-image -n envoy-gateway --nodes envoy-gateway-control-plane quay.io/metallb/speaker:v0.13.10
kind load docker-image -n envoy-gateway --nodes envoy-gateway-control-plane docker.io/jimmysong/gateway-dev:435a4dc1
kind load docker-image -n envoy-gateway --nodes envoy-gateway-control-plane envoyproxy/envoy:distroless-dev
kind load docker-image -n envoy-gateway --nodes envoy-gateway-control-plane gcr.io/k8s-staging-gateway-api/echo-basic:v20231214-v1.0.0-140-gf544a46e

更多资源

想深入了解如何进行高级测试和贡献,详见 Envoy Gateway 开发文档

加入我们,与全球开发者共同推进 Envoy Gateway 的成长,同时提升你的开发技能和对开源社区的理解。

加入 Envoy Gateway 中文交流群

为了便于中文和中国时区的用户交流,Envoy Gateway 社区成立的微信群,详见通知,该群成立于 2023 年 4 月,目前已有 400 多名成员。你可以联系联系我刘训灼赵化冰等入群。

参考

最后更新于 2024/09/16