
ingress-nginx kubectl 插件完全指南安装、10 大子命令与源码级原理解析【免费下载链接】ingress-nginxIngress NGINX Controller for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginxingress-nginx 官方 kubectl 插件plugin是一套用于检查、诊断和调试 ingress-nginx 部署的命令行工具通过kubectl ingress-nginx直接调用无需进入容器即可查看动态后端、TLS 证书、生成的 nginx.conf、Ingress 资源汇总并支持在升级前对存量资源做 lint 检查。读完本文你将掌握插件的安装方式、全部子命令的用法与输出含义并理解其kubectl 配置复用 Pod 内 dbg 工具 Lua 状态端点的三层工作机理从而在日常排障中高效定位问题。插件是什么一条从 kubectl 到控制器内部的调试捷径该插件以kubectl ingress-nginx的形式扩展 kubectl定位是 A kubectl plugin for inspecting your ingress-nginx deployments检查 ingress-nginx 部署的 kubectl 插件。从源码结构看它的整体设计分为三层CLI 层使用 Cobra 构建根命令与全部子命令根命令定义在 cmd/plugin/main.go它通过genericclioptions.NewConfigFlags(true)直接复用了 kubectl 的标准配置参数--namespace、--context、--kubeconfig等并注册了ingresses、conf、general、backends、info、certs、logs、exec、ssh、lint共十个子命令调度层需要进入控制器的命令backends/certs/conf/exec/general/logs/ssh由 cmd/plugin/request/request.go 负责通过 Kubernetes API 选中目标 Pod再由 cmd/plugin/kubectl/kubectl.go 将插件收到的连接参数序列化回 kubectl 命令参数最终调用真实kubectlkubectl exec/kubectl logs在 Pod 内执行执行层控制器镜像内置了 cmd/dbg/main.go 编译出的/dbg二进制它负责读取 nginx 实例内部状态。插件把kubectl exec pod -- /dbg ...的结果原样打印给用户。其中/dbg的数据来源于 nginx 的 Lua 状态端点/configuration/backends、/configuration/general、/configuration/certs因此 backends、general、certs、conf 这些命令能拿到的是控制器当前内存中的动态配置而非静态文件这在下文各子命令的输出示例中会体现。安装插件基于 krew插件的官方分发方式是 krewkubectl 的插件管理器。先安装 krew然后执行kubectl krew install ingress-nginx安装完成后运行下面的命令确认插件就位同时查看可用命令清单kubectl ingress-nginx --help预期的帮助输出如下与仓库文档一致kubectl ingress-nginx --help A kubectl plugin for inspecting your ingress-nginx deployments Usage: ingress-nginx [command] Available Commands: backends Inspect the dynamic backend information of an ingress-nginx instance certs Output the certificate data stored in an ingress-nginx pod conf Inspect the generated nginx.conf exec Execute a command inside an ingress-nginx pod general Inspect the other dynamic ingress-nginx information help Help about any command info Show information about the ingress-nginx service ingresses Provide a short summary of all of the ingress definitions lint Inspect kubernetes resources for possible issues logs Get the kubernetes logs for an ingress-nginx pod ssh ssh into a running ingress-nginx pod Flags: --as string Username to impersonate for the operation --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. --cache-dir string Default HTTP cache directory (default /Users/alexkursell/.kube/http-cache) --certificate-authority string Path to a cert file for the certificate authority --client-certificate string Path to a client certificate file for TLS --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use -h, --help help for ingress-nginx --insecure-skip-tls-verify If true, the servers certificate will not be checked for validity. This will make your HTTPS connections insecure --kubeconfig string Path to the kubeconfig file to use for CLI requests. -n, --namespace string If present, the namespace scope for this CLI request --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means dont timeout requests. (default 0) -s, --server string The address and port of the Kubernetes API server --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use Use ingress-nginx [command] --help for more information about a command.各命令的详细用法可用kubectl ingress-nginx [command] --help查看。从 cmd/plugin/krew.yaml 可以看到插件随每个 release 发布覆盖 macOSdarwin、Linux、Windows 三种操作系统并同时提供 amd64 与 arm64 架构的二进制Windows 平台的二进制名为kubectl-ingress-nginx.exe其余平台为kubectl-ingress-nginx即安装后命令名统一为kubectl ingress-nginx。常用 Flags三类全局参数1. 标准 kubectl 连接参数所有子命令都支持基础 kubectl 连接类 flags如--namespace、--context、--kubeconfig、--cluster、--user、--server、--token、--as、--as-group、--request-timeout、--insecure-skip-tls-verify、--certificate-authority、--client-certificate、--client-key等。这是因为根命令把 kubectl 的ConfigFlags整体挂到了 Persistent Flags 上见 cmd/plugin/main.go。2. 目标 Pod 选择参数凡是作用于某个 ingress-nginx Pod 的子命令backends、certs、conf、exec、general、logs、ssh都支持以下三个 flags 来选择目标 PodFlag默认值含义--deployment nameingress-nginx-controller从指定名称的 Deployment 中挑选一个 Pod--pod name空直接指定 Pod 名称优先级高于--deployment--container namecontroller指定 Pod 内的容器名默认常量定义在 cmd/plugin/util/util.goDeployment 默认ingress-nginx-controller容器默认controller。此外各命令还支持源码中补充的-l, --selector labellabel 选择器用于按标签筛选 Pod见 cmd/plugin/util/util.go。3. 跨命名空间参数检查类子命令ingresses、lint支持--all-namespaces用于跨全部命名空间检查资源ingresses还额外支持--host hostname只查看某个主机名的 Ingress。子命令详解版本要求backends、general、certs、conf需要 ingress-nginx 版本0.23.0 及以上因为这些命令依赖控制器中动态配置端点与/dbg能力。backends查看控制器当前认知的动态后端kubectl ingress-nginx backends以 JSON 数组形式输出控制器当前掌握的全部后端backend信息包括后端名称、关联 Service 定义、端点Endpoints地址与端口、session affinity 配置、upstream hash 配置、流量整形策略traffic shaping等$ kubectl ingress-nginx backends -n ingress-nginx [ { name: default-apple-service-5678, service: { metadata: { creationTimestamp: null }, spec: { ports: [ { protocol: TCP, port: 5678, targetPort: 5678 } ], selector: { app: apple }, clusterIP: 10.97.230.121, type: ClusterIP, sessionAffinity: None }, status: { loadBalancer: {} } }, port: 0, sslPassthrough: false, endpoints: [ { address: 10.1.3.86, port: 5678 } ], sessionAffinityConfig: { name: , cookieSessionAffinity: { name: } }, upstreamHashByConfig: { upstream-hash-by-subset-size: 3 }, noServer: false, trafficShapingPolicy: { weight: 0, header: , headerValue: , cookie: } }, { name: default-echo-service-8080, ... }, { name: upstream-default-backend, ... } ]可用参数--list只输出后端名称列表每行一个适合快速浏览有哪些后端--backend name只输出指定名称后端的详细信息注意--list与--backend不能同时指定源码中会直接报错见 cmd/plugin/commands/backends/backends.go。从实现看--list/--backend/ 默认分别映射为 Pod 内/dbg backends list、/dbg backends get name、/dbg backends all三条命令见 cmd/plugin/commands/backends/backends.go后者的端点定义在 cmd/dbg/main.go 的/configuration/backends。general查看其他动态状态kubectl ingress-nginx general输出控制器中其他动态 Lua 状态信息对应/dbg general与/configuration/general端点。它接收与 backends 相同的 Pod 选择参数适合在排查时查看后端之外的整体运行状态。certs导出指定主机的证书与私钥kubectl ingress-nginx certs --host hostname输出某个主机名对应的 SSL 证书链及私钥信息$ kubectl ingress-nginx certs -n ingress-nginx --host testaddr.local -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- REDACTED! DO NOT SHARE THIS! -----END RSA PRIVATE KEY-----WARNING该命令会输出敏感私钥信息不要随意传播输出内容更不要将其写入任何日志。注意--host是必填参数——源码中通过cobra.MarkFlagRequired强制要求未指定会直接报错退出见 cmd/plugin/commands/certs/certs.go。实现上它执行 Pod 内的/dbg certs get host对应/configuration/certs端点适合快速验证某主机名证书是否已正确加载、证书链是否完整。conf导出生成的 nginx.confkubectl ingress-nginx conf直接输出控制器当前生成的完整nginx.conf。配合--host hostname可以只查看对应主机的 server 块这在定位某域名的 server 配置、rewrite 规则、location 匹配问题时非常高效kubectl ingress-nginx conf -n ingress-nginx --host testaddr.local server { server_name testaddr.local ; listen 80; set $proxy_upstream_name -; set $pass_access_scheme $scheme; set $pass_server_port $server_port; set $best_http_host $http_host; set $pass_port $pass_server_port; location / { set $namespace ; set $ingress_name ; set $service_name ; set $service_port 0; set $location_path /; ...实现上命令先取回完整 nginx.conf/dbg conf即读取 Pod 内/etc/nginx/nginx.conf见 cmd/dbg/main.go当指定--host时通过nginx.GetServerBlock在本地解析并只打印该 host 的 server 块见 cmd/plugin/commands/conf/conf.go因此不依赖 Pod 内工具也能完成裁剪。exec在控制器内执行任意命令kubectl ingress-nginx exec与kubectl exec行为一致只是会自动帮你挑选一个 ingress-nginx Pod。它支持-i, --stdin传入标准输入和-t, --tty分配 TTY之后的所有参数原样作为要在容器内执行的命令$ kubectl ingress-nginx exec -i -n ingress-nginx -- ls /etc/nginx fastcgi_params lua mime.types modsecurity modules nginx.conf opentracing.json owasp-modsecurity-crs template从源码看exec 最终由 cmd/plugin/kubectl/kubectl.go 的Exec通过syscall.Exec替换当前进程为真实的kubectl exec调用见 cmd/plugin/commands/exec/exec.go因此交互式行为与原生 kubectl 完全一致。logs读取控制器日志kubectl ingress-nginx logs与kubectl logs基本一致flags 较少自动挑选一个 ingress-nginx Pod 读取日志适合快速查看启动信息与错误$ kubectl ingress-nginx logs -n ingress-nginx ------------------------------------------------------------------------------- NGINX Ingress controller Release: dev Build: git-48dc3a867 Repository: gitgithub.com:kubernetes/ingress-nginx.git ------------------------------------------------------------------------------- W0405 16:53:46.061589 7 flags.go:214] SSL certificate chain completion is disabled (--enable-ssl-chain-completionfalse) nginx version: nginx/1.15.9 W0405 16:53:46.070093 7 client_config.go:549] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work. I0405 16:53:46.070499 7 main.go:205] Creating API client for https://10.96.0.1:443 I0405 16:53:46.077784 7 main.go:249] Running in Kubernetes cluster version v1.10 (v1.10.11) - git (clean) commit 637c7e288581ee40ab4ca210618a89a555b6e7e9 - platform linux/amd64 I0405 16:53:46.183359 7 nginx.go:265] Starting NGINX Ingress controller I0405 16:53:46.193913 7 event.go:209] Event(v1.ObjectReference{Kind:ConfigMap, Namespace:ingress-nginx, Name:udp-services, UID:82258915-563e-11e9-9c52-025000000001, APIVersion:v1, ResourceVersion:494, FieldPath:}): type: Normal reason: CREATE ConfigMap ingress-nginx/udp-services ...ssh一键进入控制器容器kubectl ingress-nginx ssh等价于kubectl ingress-nginx exec -it -- /bin/bash适合需要交互式 shell 深入排查的场景$ kubectl ingress-nginx ssh -n ingress-nginx www-dataingress-nginx-controller-7cbf77c976-wx5pn:/etc/nginx$info查看 Service 的地址信息kubectl ingress-nginx info显示 ingress-nginx Service 的 ClusterIP 与外部地址LoadBalancer IP 或 CNAME$ kubectl ingress-nginx info -n ingress-nginx Service cluster IP address: 10.187.253.31 LoadBalancer IP|CNAME: 35.123.123.123如果你的 LoadBalancer Service 名称不是默认值用--service name指定。源码中默认 Service 名为ingress-nginx-controller见 cmd/plugin/commands/info/info.go输出直接取自 Service 资源的spec.clusterIP与spec.loadBalancerIP。ingresses比kubectl get ingress更详细的汇总kubectl ingress-nginx ingresses别名ingress、ing把命名空间内的 Ingress 展开成每个 hostpath 一行的详细视图并实时统计每个后端 Service 的端点数量方便评估流量覆盖与可用性。对比一下普通 kubectl 与插件的输出差异$ kubectl get ingresses --all-namespaces NAMESPACE NAME HOSTS ADDRESS PORTS AGE default example-ingress1 testaddr.local,testaddr2.local localhost 80 5d default test-ingress-2 * localhost 80 5dvs.$ kubectl ingress-nginx ingresses --all-namespaces NAMESPACE INGRESS NAME HOSTPATH ADDRESSES TLS SERVICE SERVICE PORT ENDPOINTS default example-ingress1 testaddr.local/etameta localhost NO pear-service 5678 5 default example-ingress1 testaddr2.local/otherpath localhost NO apple-service 5678 1 default example-ingress1 testaddr2.local/otherotherpath localhost NO pear-service 5678 5 default test-ingress-2 * localhost NO echo-service 8080 2要点一个 Ingress 若包含多个 rule/path会展开为多行输出TLS列根据 Ingress 的spec.tls中是否包含该 host 判定 YES/NOENDPOINTS列通过 EndpointSlice 统计后端就绪地址数量若 Service 无对应 EndpointSlice 则显示N/A统计逻辑见 cmd/plugin/request/request.go支持--host hostname过滤只显示某个主机的行见 cmd/plugin/commands/ingresses/ingresses.go行渲染与数据组织逻辑getIngressRows完整覆盖了 catch-all无 rules、仅有 defaultBackend、无 HTTP paths 等边界情况见 cmd/plugin/commands/ingresses/ingresses.go并有对应的单测覆盖cmd/plugin/commands/ingresses/ingresses_test.go。lint升级前的资源体检kubectl ingress-nginx lint检查一个命名空间或整个集群中 Ingress 与 Deployment 的潜在配置问题是升级 ingress-nginx 版本时特别有用的前置检查工具。它默认同时检查 Ingress 和 Deployment 两类资源也可用子命令单独执行lint ingresses别名ing、lint deployments别名dep。常用参数Flag含义--all-namespaces检查全部命名空间-v, --verbose输出每个 lint 规则的附加说明--show-all显示所有资源而不只是有问题的-f, --from-version v只显示从该版本起新增的 lint 规则默认0.0.0-t, --to-version v只显示截至该版本含的 lint 规则默认当前插件 release 版本示例检查全部命名空间带详细说明$ kubectl ingress-nginx lint --all-namespaces --verbose Checking ingresses... ✗ anamespace/this-nginx - Contains the removed session-cookie-hash annotation. Lint added for version 0.24.0 ✗ othernamespace/ingress-definition-blah - The rewrite-target annotation value does not reference a capture group Lint added for version 0.22.0 Checking deployments... ✗ namespace2/ingress-nginx-controller - Uses removed config flag --sort-backends Lint added for version 0.22.0 - Uses removed config flag --enable-dynamic-certificates Lint added for version 0.24.0按版本范围过滤——只显示某个 release 新增的 lint 规则此处以 0.24.0 为例$ kubectl ingress-nginx lint --all-namespaces --verbose --from-version 0.24.0 --to-version 0.24.0 Checking ingresses... ✗ anamespace/this-nginx - Contains the removed session-cookie-hash annotation. Lint added for version 0.24.0 Checking deployments... ✗ namespace2/ingress-nginx-controller - Uses removed config flag --enable-dynamic-certificates Lint added for version 0.24.0版本过滤的实现要点插件用正则把版本串解析为 major/minor/patch 三元组再用闭区间比较判断规则是否落在[from-version, to-version]内见 cmd/plugin/util/util.golint 规则本体分别存放在 cmd/plugin/lints/ingress.go 与 cmd/plugin/lints/deployment.go每条规则都带有生效起始版本这正是--from-version/--to-version能按版本筛选规则的原因。各规则的命令入口与参数注册见 cmd/plugin/commands/lint/main.go。源码级原理解析插件如何选中 Pod 并执行命令选择目标 Pod 的优先级对于需要进入 Pod 的命令插件按--pod--selector--deployment的顺序选择目标 Pod见 cmd/plugin/request/request.go指定--pod时按名称在命名空间内精确查找指定--selector时按 label 选择器列出 Pod 并取第一个默认情况下按--deployment查找先列出命名空间全部 Pod再通过 OwnerReference 判断 Pod 是否属于名为{deployment}-xxxxx的 ReplicaSet从而确定它属于该 Deployment判定逻辑PodInDeployment见 cmd/plugin/util/util.go然后取第一个 Pod。如何复用 kubectl 的连接配置插件没有自己实现一套 kubeconfig 解析。它把用户通过 flags 传入的连接参数--kubeconfig、--context、--server、--token、--as等逐一序列化回 kubectl 命令行参数然后调用本机kubectl完成实际请求getKubectlConfigFlags见 cmd/plugin/kubectl/kubectl.go。换句话说插件是 kubectl 之上的编排层它负责挑 Pod、拼参数真正执行的是用户环境中已有的 kubectl。这也解释了为什么所有子命令都天然继承 kubectl 的认证与配置行为。为什么 backends/certs/general/conf 要求 0.23.0这些命令最终都归结为在 Pod 内执行/dbg二进制而/dbg读取的是控制器内 Lua 暴露的动态配置 HTTP 端点cmd/dbg/main.go 定义了backendsPath /configuration/backends、generalPath /configuration/general、certsPath /configuration/certs。动态配置端点能力是从 ingress-nginx 0.23.0 起提供的因此低于该版本的控制者无法支撑这些命令。ingresses、lint、info、logs、exec、ssh等命令走的是 Kubernetes API 或常规 kubectl 能力不受此限制。小结ingress-nginx kubectl 插件把查后端、查证书、查配置、进容器、看日志、看 Ingress、升级体检这些高频排障动作统一收敛到一条kubectl ingress-nginx命令下省去了手动拼接kubectl get podkubectl exec的繁琐流程。其设计上复用 kubectl 配置、借道 /dbg 读取控制器动态状态、按版本管理 lint 规则的思路使它既是日常运维的实用工具也是一个理解 ingress-nginx 内部状态模型backend 结构、TLS 证书管理、配置生成链路的绝佳入口。若需深度定制可继续阅读插件源码 cmd/plugin 与调试工具源码 cmd/dbg/main.go 了解实现细节。【免费下载链接】ingress-nginxIngress NGINX Controller for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考