9 lines
39 KiB
HTML
9 lines
39 KiB
HTML
<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link href=https://kubernetes.github.io/ingress-nginx/developer-guide/code-overview/ rel=canonical><link rel="shortcut icon" href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.1.2, mkdocs-material-6.2.4"><title>Code Overview - Ingress-Nginx Controller</title><link rel=stylesheet href=../../assets/stylesheets/main.15aa0b43.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.75751829.min.css><meta name=theme-color content=#009485><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback"><style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style><link rel=stylesheet href=../../extra.css><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-118407822-1","kubernetes.github.io"),ga("set","anonymizeIp",!0),ga("send","pageview"),document.addEventListener("DOMContentLoaded",function(){document.forms.search&&document.forms.search.query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}),document.addEventListener("DOMContentSwitch",function(){ga("send","pageview",document.location.pathname)})</script><script async src=https://www.google-analytics.com/analytics.js></script></head> <body dir=ltr data-md-color-scheme data-md-color-primary=teal data-md-color-accent=green> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#ingress-nginx-code-overview class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header-nav md-grid" aria-label=Header> <a href=https://kubernetes.github.io/ingress-nginx title="Ingress-Nginx Controller" class="md-header-nav__button md-logo" aria-label="Ingress-Nginx Controller"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg> </a> <label class="md-header-nav__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg> </label> <div class=md-header-nav__title data-md-component=header-title> <div class=md-header-nav__ellipsis> <div class=md-header-nav__topic> <span class=md-ellipsis> Ingress-Nginx Controller </span> </div> <div class=md-header-nav__topic> <span class=md-ellipsis> Code Overview </span> </div> </div> </div> <label class="md-header-nav__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query data-md-state=active required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg> </label> <button type=reset class="md-search__icon md-icon" aria-label=Clear data-md-component=search-reset tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg> </button> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list></ol> </div> </div> </div> </div> </div> <div class=md-header-nav__source> <a href=https://github.com/kubernetes/ingress-nginx/ title="Go to repository" class=md-source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg> </div> <div class=md-source__repository> kubernetes/ingress-nginx </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class="md-tabs__inner md-grid"> <ul class=md-tabs__list> <li class=md-tabs__item> <a href=../.. class=md-tabs__link> Welcome </a> </li> <li class=md-tabs__item> <a href=../../deploy/ class=md-tabs__link> Deployment </a> </li> <li class=md-tabs__item> <a href=../../user-guide/nginx-configuration/ class=md-tabs__link> User guide </a> </li> <li class=md-tabs__item> <a href=../../examples/ class=md-tabs__link> Examples </a> </li> <li class=md-tabs__item> <a href=../getting-started/ class="md-tabs__link md-tabs__link--active"> Developer Guide </a> </li> <li class=md-tabs__item> <a href=../../faq/ class=md-tabs__link> FAQ </a> </li> </ul> </div> </nav> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=https://kubernetes.github.io/ingress-nginx title="Ingress-Nginx Controller" class="md-nav__button md-logo" aria-label="Ingress-Nginx Controller"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg> </a> Ingress-Nginx Controller </label> <div class=md-nav__source> <a href=https://github.com/kubernetes/ingress-nginx/ title="Go to repository" class=md-source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg> </div> <div class=md-source__repository> kubernetes/ingress-nginx </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-1 type=checkbox id=nav-1> <label class=md-nav__link for=nav-1> Welcome <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Welcome data-md-level=1> <label class=md-nav__title for=nav-1> <span class="md-nav__icon md-icon"></span> Welcome </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../.. class=md-nav__link> Welcome </a> </li> <li class=md-nav__item> <a href=../../how-it-works/ class=md-nav__link> How it works </a> </li> <li class=md-nav__item> <a href=../../troubleshooting/ class=md-nav__link> Troubleshooting </a> </li> <li class=md-nav__item> <a href=../../kubectl-plugin/ class=md-nav__link> kubectl plugin </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-2 type=checkbox id=nav-2> <label class=md-nav__link for=nav-2> Deployment <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Deployment data-md-level=1> <label class=md-nav__title for=nav-2> <span class="md-nav__icon md-icon"></span> Deployment </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../deploy/ class=md-nav__link> Installation Guide </a> </li> <li class=md-nav__item> <a href=../../deploy/baremetal/ class=md-nav__link> Bare-metal considerations </a> </li> <li class=md-nav__item> <a href=../../deploy/rbac/ class=md-nav__link> Role Based Access Control (RBAC) </a> </li> <li class=md-nav__item> <a href=../../deploy/upgrade/ class=md-nav__link> Upgrade </a> </li> <li class=md-nav__item> <a href=../../deploy/hardening-guide/ class=md-nav__link> Hardening guide </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-3 type=checkbox id=nav-3> <label class=md-nav__link for=nav-3> User guide <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="User guide" data-md-level=1> <label class=md-nav__title for=nav-3> <span class="md-nav__icon md-icon"></span> User guide </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-3-1 type=checkbox id=nav-3-1> <label class=md-nav__link for=nav-3-1> NGINX Configuration <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="NGINX Configuration" data-md-level=2> <label class=md-nav__title for=nav-3-1> <span class="md-nav__icon md-icon"></span> NGINX Configuration </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/ class=md-nav__link> Introduction </a> </li> <li class=md-nav__item> <a href=../../user-guide/basic-usage/ class=md-nav__link> Basic usage </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/annotations/ class=md-nav__link> Annotations </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/configmap/ class=md-nav__link> ConfigMap </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/custom-template/ class=md-nav__link> Custom NGINX template </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/log-format/ class=md-nav__link> Log format </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../user-guide/cli-arguments/ class=md-nav__link> Command line arguments </a> </li> <li class=md-nav__item> <a href=../../user-guide/custom-errors/ class=md-nav__link> Custom errors </a> </li> <li class=md-nav__item> <a href=../../user-guide/default-backend/ class=md-nav__link> Default backend </a> </li> <li class=md-nav__item> <a href=../../user-guide/exposing-tcp-udp-services/ class=md-nav__link> Exposing TCP and UDP services </a> </li> <li class=md-nav__item> <a href=../../user-guide/fcgi-services/ class=md-nav__link> Exposing FCGI services </a> </li> <li class=md-nav__item> <a href=../../user-guide/ingress-path-matching/ class=md-nav__link> Regular expressions in paths </a> </li> <li class=md-nav__item> <a href=../../user-guide/external-articles/ class=md-nav__link> External Articles </a> </li> <li class=md-nav__item> <a href=../../user-guide/miscellaneous/ class=md-nav__link> Miscellaneous </a> </li> <li class=md-nav__item> <a href=../../user-guide/monitoring/ class=md-nav__link> Prometheus and Grafana installation </a> </li> <li class=md-nav__item> <a href=../../user-guide/multiple-ingress/ class=md-nav__link> Multiple Ingress controllers </a> </li> <li class=md-nav__item> <a href=../../user-guide/tls/ class=md-nav__link> TLS/HTTPS </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-3-13 type=checkbox id=nav-3-13> <label class=md-nav__link for=nav-3-13> Third party addons <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Third party addons" data-md-level=2> <label class=md-nav__title for=nav-3-13> <span class="md-nav__icon md-icon"></span> Third party addons </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../user-guide/third-party-addons/modsecurity/ class=md-nav__link> ModSecurity Web Application Firewall </a> </li> <li class=md-nav__item> <a href=../../user-guide/third-party-addons/opentracing/ class=md-nav__link> OpenTracing </a> </li> <li class=md-nav__item> <a href=../../user-guide/third-party-addons/opentelemetry/ class=md-nav__link> OpenTelemetry </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-4 type=checkbox id=nav-4> <label class=md-nav__link for=nav-4> Examples <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Examples data-md-level=1> <label class=md-nav__title for=nav-4> <span class="md-nav__icon md-icon"></span> Examples </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../examples/ class=md-nav__link> Introduction </a> </li> <li class=md-nav__item> <a href=../../examples/PREREQUISITES/ class=md-nav__link> Prerequisites </a> </li> <li class=md-nav__item> <a href=../../examples/affinity/cookie/ class=md-nav__link> Sticky Sessions </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-4-4 type=checkbox id=nav-4-4> <label class=md-nav__link for=nav-4-4> Auth <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Auth data-md-level=2> <label class=md-nav__title for=nav-4-4> <span class="md-nav__icon md-icon"></span> Auth </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../examples/auth/basic/ class=md-nav__link> Basic Authentication </a> </li> <li class=md-nav__item> <a href=../../examples/auth/client-certs/ class=md-nav__link> Client Certificate Authentication </a> </li> <li class=md-nav__item> <a href=../../examples/auth/external-auth/ class=md-nav__link> External Basic Authentication </a> </li> <li class=md-nav__item> <a href=../../examples/auth/oauth-external-auth/ class=md-nav__link> External OAUTH Authentication </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-4-5 type=checkbox id=nav-4-5> <label class=md-nav__link for=nav-4-5> Customization <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Customization data-md-level=2> <label class=md-nav__title for=nav-4-5> <span class="md-nav__icon md-icon"></span> Customization </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../examples/customization/configuration-snippets/ class=md-nav__link> Configuration Snippets </a> </li> <li class=md-nav__item> <a href=../../examples/customization/custom-configuration/ class=md-nav__link> Custom Configuration </a> </li> <li class=md-nav__item> <a href=../../examples/customization/custom-errors/ class=md-nav__link> Custom Errors </a> </li> <li class=md-nav__item> <a href=../../examples/customization/custom-headers/ class=md-nav__link> Custom Headers </a> </li> <li class=md-nav__item> <a href=../../examples/customization/external-auth-headers/ class=md-nav__link> External authentication </a> </li> <li class=md-nav__item> <a href=../../examples/customization/ssl-dh-param/ class=md-nav__link> Custom DH parameters for perfect forward secrecy </a> </li> <li class=md-nav__item> <a href=../../examples/customization/sysctl/ class=md-nav__link> Sysctl tuning </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../examples/docker-registry/ class=md-nav__link> Docker registry </a> </li> <li class=md-nav__item> <a href=../../examples/grpc/ class=md-nav__link> gRPC </a> </li> <li class=md-nav__item> <a href=../../examples/multi-tls/ class=md-nav__link> Multi TLS certificate termination </a> </li> <li class=md-nav__item> <a href=../../examples/rewrite/ class=md-nav__link> Rewrite </a> </li> <li class=md-nav__item> <a href=../../examples/static-ip/ class=md-nav__link> Static IPs </a> </li> <li class=md-nav__item> <a href=../../examples/tls-termination/ class=md-nav__link> TLS termination </a> </li> <li class=md-nav__item> <a href=../../examples/psp/ class=md-nav__link> Pod Security Policy (PSP) </a> </li> <li class=md-nav__item> <a href=../../examples/openpolicyagent/ class=md-nav__link> Open Policy Agent rules </a> </li> <li class=md-nav__item> <a href=../../examples/canary/ class=md-nav__link> Canary Deployments </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-5 type=checkbox id=nav-5 checked> <label class=md-nav__link for=nav-5> Developer Guide <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Developer Guide" data-md-level=1> <label class=md-nav__title for=nav-5> <span class="md-nav__icon md-icon"></span> Developer Guide </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../getting-started/ class=md-nav__link> Getting Started </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" data-md-toggle=toc type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> Code Overview <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> Code Overview </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=#core-golang-code class=md-nav__link> Core Golang code </a> <nav class=md-nav aria-label="Core Golang code"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#core-sync-logics class=md-nav__link> Core Sync Logics: </a> </li> <li class=md-nav__item> <a href=#entrypoint class=md-nav__link> Entrypoint </a> </li> <li class=md-nav__item> <a href=#version class=md-nav__link> Version </a> </li> <li class=md-nav__item> <a href=#internal-code class=md-nav__link> Internal code </a> <nav class=md-nav aria-label="Internal code"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#admission-controller class=md-nav__link> Admission Controller </a> </li> <li class=md-nav__item> <a href=#file-functions class=md-nav__link> File functions </a> </li> <li class=md-nav__item> <a href=#ingress-functions class=md-nav__link> Ingress functions </a> </li> <li class=md-nav__item> <a href=#k8s-functions class=md-nav__link> K8s functions </a> </li> <li class=md-nav__item> <a href=#networking-functions class=md-nav__link> Networking functions </a> </li> <li class=md-nav__item> <a href=#nginx-functions class=md-nav__link> NGINX functions </a> </li> <li class=md-nav__item> <a href=#tasks-queue class=md-nav__link> Tasks / Queue </a> </li> <li class=md-nav__item> <a href=#other-parts-of-internal class=md-nav__link> Other parts of internal </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#e2e-test class=md-nav__link> E2E Test </a> </li> <li class=md-nav__item> <a href=#other-programs class=md-nav__link> Other programs </a> <nav class=md-nav aria-label="Other programs"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#kubectl-plugin class=md-nav__link> kubectl plugin </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#deploy-files class=md-nav__link> Deploy files </a> </li> <li class=md-nav__item> <a href=#helm-chart class=md-nav__link> Helm Chart </a> </li> <li class=md-nav__item> <a href=#documentationwebsite class=md-nav__link> Documentation/Website </a> </li> <li class=md-nav__item> <a href=#container-images class=md-nav__link> Container Images </a> <nav class=md-nav aria-label="Container Images"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#base-images class=md-nav__link> Base Images </a> </li> <li class=md-nav__item> <a href=#ingress-controller-image class=md-nav__link> Ingress Controller Image </a> <nav class=md-nav aria-label="Ingress Controller Image"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#ingress-nginx-lua-scripts class=md-nav__link> Ingress NGINX Lua Scripts </a> </li> <li class=md-nav__item> <a href=#nginx-go-template-file class=md-nav__link> Nginx Go template file </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../faq/ class=md-nav__link> FAQ </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=#core-golang-code class=md-nav__link> Core Golang code </a> <nav class=md-nav aria-label="Core Golang code"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#core-sync-logics class=md-nav__link> Core Sync Logics: </a> </li> <li class=md-nav__item> <a href=#entrypoint class=md-nav__link> Entrypoint </a> </li> <li class=md-nav__item> <a href=#version class=md-nav__link> Version </a> </li> <li class=md-nav__item> <a href=#internal-code class=md-nav__link> Internal code </a> <nav class=md-nav aria-label="Internal code"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#admission-controller class=md-nav__link> Admission Controller </a> </li> <li class=md-nav__item> <a href=#file-functions class=md-nav__link> File functions </a> </li> <li class=md-nav__item> <a href=#ingress-functions class=md-nav__link> Ingress functions </a> </li> <li class=md-nav__item> <a href=#k8s-functions class=md-nav__link> K8s functions </a> </li> <li class=md-nav__item> <a href=#networking-functions class=md-nav__link> Networking functions </a> </li> <li class=md-nav__item> <a href=#nginx-functions class=md-nav__link> NGINX functions </a> </li> <li class=md-nav__item> <a href=#tasks-queue class=md-nav__link> Tasks / Queue </a> </li> <li class=md-nav__item> <a href=#other-parts-of-internal class=md-nav__link> Other parts of internal </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#e2e-test class=md-nav__link> E2E Test </a> </li> <li class=md-nav__item> <a href=#other-programs class=md-nav__link> Other programs </a> <nav class=md-nav aria-label="Other programs"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#kubectl-plugin class=md-nav__link> kubectl plugin </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#deploy-files class=md-nav__link> Deploy files </a> </li> <li class=md-nav__item> <a href=#helm-chart class=md-nav__link> Helm Chart </a> </li> <li class=md-nav__item> <a href=#documentationwebsite class=md-nav__link> Documentation/Website </a> </li> <li class=md-nav__item> <a href=#container-images class=md-nav__link> Container Images </a> <nav class=md-nav aria-label="Container Images"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#base-images class=md-nav__link> Base Images </a> </li> <li class=md-nav__item> <a href=#ingress-controller-image class=md-nav__link> Ingress Controller Image </a> <nav class=md-nav aria-label="Ingress Controller Image"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#ingress-nginx-lua-scripts class=md-nav__link> Ingress NGINX Lua Scripts </a> </li> <li class=md-nav__item> <a href=#nginx-go-template-file class=md-nav__link> Nginx Go template file </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class=md-content> <article class="md-content__inner md-typeset"> <a href=https://github.com/kubernetes/ingress-nginx/edit/main/docs/developer-guide/code-overview.md title="Edit this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg> </a> <h1 id=ingress-nginx-code-overview>Ingress NGINX - Code Overview<a class=headerlink href=#ingress-nginx-code-overview title="Permanent link"> ¶</a></h1> <p>This document provides an overview of Ingress NGINX code.</p> <h2 id=core-golang-code>Core Golang code<a class=headerlink href=#core-golang-code title="Permanent link"> ¶</a></h2> <p>This part of the code is responsible for the main logic of Ingress NGINX. It contains all the logics that parses <a href=https://kubernetes.io/docs/concepts/services-networking/ingress/ >Ingress Objects</a>, <a href="https://kubernetes.io/docs/reference/glossary/?fundamental=true#term-annotation">annotations</a>, watches Endpoints and turn them into usable nginx.conf configuration.</p> <h3 id=core-sync-logics>Core Sync Logics:<a class=headerlink href=#core-sync-logics title="Permanent link"> ¶</a></h3> <p>Ingress-nginx has an internal model of the ingresses, secrets and endpoints in a given cluster. It maintains two copies of that:</p> <ol> <li>One copy is the currently running configuration model</li> <li>Second copy is the one generated in response to some changes in the cluster</li> </ol> <p>The sync logic diffs the two models and if there's a change it tries to converge the running configuration to the new one. </p> <p>There are static and dynamic configuration changes. </p> <p>All endpoints and certificate changes are handled dynamically by posting the payload to an internal NGINX endpoint that is handled by Lua.</p> <hr> <p>The following parts of the code can be found:</p> <h3 id=entrypoint>Entrypoint<a class=headerlink href=#entrypoint title="Permanent link"> ¶</a></h3> <p>The <code>main</code> package is responsible for starting ingress-nginx program, which can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/cmd/nginx>cmd/nginx</a> directory.</p> <h3 id=version>Version<a class=headerlink href=#version title="Permanent link"> ¶</a></h3> <p>Is the package of the code responsible for adding <code>version</code> subcommand, and can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/version>version</a> directory.</p> <h3 id=internal-code>Internal code<a class=headerlink href=#internal-code title="Permanent link"> ¶</a></h3> <p>This part of the code contains the internal logics that compose Ingress NGINX Controller, and it's split into:</p> <h4 id=admission-controller>Admission Controller<a class=headerlink href=#admission-controller title="Permanent link"> ¶</a></h4> <p>Contains the code of <a href=https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/ >Kubernetes Admission Controller</a> which validates the syntax of ingress objects before accepting it.</p> <p>This code can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/admission/controller>internal/admission/controller</a> directory.</p> <h4 id=file-functions>File functions<a class=headerlink href=#file-functions title="Permanent link"> ¶</a></h4> <p>Contains auxiliary codes that deal with files, such as generating the SHA1 checksum of a file, or creating required directories.</p> <p>This code can be found in <a href=https://github.com/kubernetes/ingress-nginx/blob/main/internal/file>internal/file</a> directory.</p> <h4 id=ingress-functions>Ingress functions<a class=headerlink href=#ingress-functions title="Permanent link"> ¶</a></h4> <p>Contains all the logics from Ingress-Nginx Controller, with some examples being:</p> <ul> <li>Expected Golang structures that will be used in templates and other parts of the code - <a href=https://github.com/kubernetes/ingress-nginx/blob/main/internal/ingress/types.go>internal/ingress/types.go</a>.</li> <li>supported annotations and its parsing logics - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/annotations>internal/ingress/annotations</a>.</li> <li>reconciliation loops and logics - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/controller>internal/ingress/controller</a></li> <li>defaults - define the default struct - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/defaults>internal/ingress/defaults</a>.</li> <li>Error interface and types implementation - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/errors>internal/ingress/errors</a></li> <li>Metrics collectors for Prometheus exporting - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/metric>internal/ingress/metric</a>.</li> <li>Resolver - Extracts information from a controller - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/resolver>internal/ingress/resolver</a>.</li> <li>Ingress Object status publisher - <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/ingress/status>internal/ingress/status</a>.</li> </ul> <p>And other parts of the code that will be written in this document in a future.</p> <h4 id=k8s-functions>K8s functions<a class=headerlink href=#k8s-functions title="Permanent link"> ¶</a></h4> <p>Contains helper functions for parsing Kubernetes objects.</p> <p>This part of the code can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/k8s>internal/k8s</a> directory.</p> <h4 id=networking-functions>Networking functions<a class=headerlink href=#networking-functions title="Permanent link"> ¶</a></h4> <p>Contains helper functions for networking, such as IPv4 and IPv6 parsing, SSL certificate parsing, etc.</p> <p>This part of the code can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/net>internal/net</a> directory.</p> <h4 id=nginx-functions>NGINX functions<a class=headerlink href=#nginx-functions title="Permanent link"> ¶</a></h4> <p>Contains helper function to deal with NGINX, such as verify if it's running and reading it's configuration file parts.</p> <p>This part of the code can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/nginx>internal/nginx</a> directory.</p> <h4 id=tasks-queue>Tasks / Queue<a class=headerlink href=#tasks-queue title="Permanent link"> ¶</a></h4> <p>Contains the functions responsible for the sync queue part of the controller.</p> <p>This part of the code can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/internal/task>internal/task</a> directory.</p> <h4 id=other-parts-of-internal>Other parts of internal<a class=headerlink href=#other-parts-of-internal title="Permanent link"> ¶</a></h4> <p>Other parts of internal code might not be covered here, like runtime and watch but they can be added in a future.</p> <h2 id=e2e-test>E2E Test<a class=headerlink href=#e2e-test title="Permanent link"> ¶</a></h2> <p>The e2e tests code is in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/test>test</a> directory.</p> <h2 id=other-programs>Other programs<a class=headerlink href=#other-programs title="Permanent link"> ¶</a></h2> <p>Describe here <code>kubectl plugin</code>, <code>dbg</code>, <code>waitshutdown</code> and cover the hack scripts.</p> <h3 id=kubectl-plugin>kubectl plugin<a class=headerlink href=#kubectl-plugin title="Permanent link"> ¶</a></h3> <p>It contains kubectl plugin for inspecting your ingress-nginx deployments. This part of code can be found in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/cmd/plugin>cmd/plugin</a> directory Detail functions flow and available flow can be found in <a href=https://github.com/kubernetes/ingress-nginx/blob/main/docs/kubectl-plugin.md>kubectl-plugin</a></p> <h2 id=deploy-files>Deploy files<a class=headerlink href=#deploy-files title="Permanent link"> ¶</a></h2> <p>This directory contains the <code>yaml</code> deploy files used as examples or references in the docs to deploy Ingress NGINX and other components.</p> <p>Those files are in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/deploy>deploy</a> directory.</p> <h2 id=helm-chart>Helm Chart<a class=headerlink href=#helm-chart title="Permanent link"> ¶</a></h2> <p>Used to generate the Helm chart published.</p> <p>Code is in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx>charts/ingress-nginx</a>.</p> <h2 id=documentationwebsite>Documentation/Website<a class=headerlink href=#documentationwebsite title="Permanent link"> ¶</a></h2> <p>The documentation used to generate the website https://kubernetes.github.io/ingress-nginx/</p> <p>This code is available in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/docs>docs</a> and it's main "language" is <code>Markdown</code>, used by <a href=https://github.com/kubernetes/ingress-nginx/blob/main/mkdocs.yml>mkdocs</a> file to generate static pages.</p> <h2 id=container-images>Container Images<a class=headerlink href=#container-images title="Permanent link"> ¶</a></h2> <p>Container images used to run ingress-nginx, or to build the final image.</p> <h3 id=base-images>Base Images<a class=headerlink href=#base-images title="Permanent link"> ¶</a></h3> <p>Contains the <code>Dockerfiles</code> and scripts used to build base images that are used in other parts of the repo. They are present in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/images>images</a> repo. Some examples: * <a href=https://github.com/kubernetes/ingress-nginx/tree/main/images/nginx>nginx</a> - The base NGINX image ingress-nginx uses is not a vanilla NGINX. It bundles many libraries together and it is a job in itself to maintain that and keep things up-to-date. * <a href=https://github.com/kubernetes/ingress-nginx/tree/main/images/custom-error-pages>custom-error-pages</a> - Used on the custom error page examples.</p> <p>There are other images inside this directory.</p> <h3 id=ingress-controller-image>Ingress Controller Image<a class=headerlink href=#ingress-controller-image title="Permanent link"> ¶</a></h3> <p>The image used to build the final ingress controller, used in deploy scripts and Helm charts. </p> <p>This is NGINX with some Lua enhancement. We do dynamic certificate, endpoints handling, canary traffic split, custom load balancing etc at this component. One can also add new functionalities using Lua plugin system.</p> <p>The files are in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/rootfs>rootfs</a> directory and contains:</p> <ul> <li>The Dockerfile</li> <li><a href=https://github.com/kubernetes/ingress-nginx/tree/main/rootfs/etc/nginx>nginx config</a></li> </ul> <h4 id=ingress-nginx-lua-scripts>Ingress NGINX Lua Scripts<a class=headerlink href=#ingress-nginx-lua-scripts title="Permanent link"> ¶</a></h4> <p>Ingress NGINX uses Lua Scripts to enable features like hot reloading, rate limiting and monitoring. Some are written using the <a href=https://openresty.org/en/ >OpenResty</a> helper.</p> <p>The directory containing Lua scripts is <a href=https://github.com/kubernetes/ingress-nginx/tree/main/rootfs/etc/nginx/lua>rootfs/etc/nginx/lua</a>.</p> <h4 id=nginx-go-template-file>Nginx Go template file<a class=headerlink href=#nginx-go-template-file title="Permanent link"> ¶</a></h4> <p>One of the functions of Ingress NGINX is to turn <a href=https://kubernetes.io/docs/concepts/services-networking/ingress/ >Ingress</a> objects into nginx.conf file. </p> <p>To do so, the final step is to apply those configurations in <a href=https://github.com/kubernetes/ingress-nginx/tree/main/rootfs/etc/nginx/template>nginx.tmpl</a> turning it into a final nginx.conf file.</p> </article> </div> </div> </main> <footer class=md-footer> <div class=md-footer-nav> <nav class="md-footer-nav__inner md-grid" aria-label=Footer> <a href=../getting-started/ class="md-footer-nav__link md-footer-nav__link--prev" rel=prev> <div class="md-footer-nav__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg> </div> <div class=md-footer-nav__title> <div class=md-ellipsis> <span class=md-footer-nav__direction> Previous </span> Getting Started </div> </div> </a> <a href=../../faq/ class="md-footer-nav__link md-footer-nav__link--next" rel=next> <div class=md-footer-nav__title> <div class=md-ellipsis> <span class=md-footer-nav__direction> Next </span> FAQ </div> </div> <div class="md-footer-nav__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg> </div> </a> </nav> </div> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-footer-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> </div> </div> </footer> </div> <script src=../../assets/javascripts/vendor.93c04032.min.js></script> <script src=../../assets/javascripts/bundle.83e5331e.min.js></script><script id=__lang type=application/json>{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}</script> <script>
|
|
app = initialize({
|
|
base: "../..",
|
|
features: ['navigation.tabs', 'navigation.tabs.sticky', 'navigation.instant', 'navigation.sections'],
|
|
search: Object.assign({
|
|
worker: "../../assets/javascripts/worker/search.8c7e0a7e.min.js"
|
|
}, typeof search !== "undefined" && search)
|
|
})
|
|
</script> </body> </html> |