ingress-nginx-helm/developer-guide/code-overview/index.html
2024-09-15 15:04:08 +00:00

1 line
No EOL
40 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 href=../getting-started/ rel=prev><link href=../../faq/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.5.3, mkdocs-material-9.4.5"><title>Code Overview - Ingress-Nginx Controller</title><link rel=stylesheet href=../../assets/stylesheets/main.6a10b989.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.356b1318.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../extra.css><script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default 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 md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../.. title="Ingress-Nginx Controller" class="md-header__button md-logo" aria-label="Ingress-Nginx Controller" data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 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__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__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> Ingress-Nginx Controller </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Code Overview </span> </div> </div> </div> <label class="md-header__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 0 1 16 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 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.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 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 0 1 16 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 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.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> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.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> </nav> </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 role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/kubernetes/ingress-nginx title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-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 0 1-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 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class=md-source__repository> kubernetes/ingress-nginx </div> </a> </div> </nav> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class=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 md-tabs__item--active"> <a href=../getting-started/ class=md-tabs__link> Developer Guide </a> </li> <li class=md-tabs__item> <a href=../../faq/ class=md-tabs__link> FAQ </a> </li> </ul> </div> </nav> </header> <div class=md-container data-md-component=container> <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=sidebar data-md-type=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=../.. title="Ingress-Nginx Controller" class="md-nav__button md-logo" aria-label="Ingress-Nginx Controller" data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 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 data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-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 0 1-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 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-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--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_1> <label class=md-nav__link for=__nav_1 id=__nav_1_label tabindex> <span class=md-ellipsis> Welcome </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_1_label aria-expanded=false> <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> <span class=md-ellipsis> Welcome </span> </a> </li> <li class=md-nav__item> <a href=../../how-it-works/ class=md-nav__link> <span class=md-ellipsis> How it works </span> </a> </li> <li class=md-nav__item> <a href=../../troubleshooting/ class=md-nav__link> <span class=md-ellipsis> Troubleshooting </span> </a> </li> <li class=md-nav__item> <a href=../../kubectl-plugin/ class=md-nav__link> <span class=md-ellipsis> kubectl plugin </span> </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 " type=checkbox id=__nav_2> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex> <span class=md-ellipsis> Deployment </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=false> <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> <span class=md-ellipsis> Installation Guide </span> </a> </li> <li class=md-nav__item> <a href=../../deploy/baremetal/ class=md-nav__link> <span class=md-ellipsis> Bare-metal considerations </span> </a> </li> <li class=md-nav__item> <a href=../../deploy/rbac/ class=md-nav__link> <span class=md-ellipsis> Role Based Access Control (RBAC) </span> </a> </li> <li class=md-nav__item> <a href=../../deploy/upgrade/ class=md-nav__link> <span class=md-ellipsis> Upgrade </span> </a> </li> <li class=md-nav__item> <a href=../../deploy/hardening-guide/ class=md-nav__link> <span class=md-ellipsis> Hardening guide </span> </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 " type=checkbox id=__nav_3> <label class=md-nav__link for=__nav_3 id=__nav_3_label tabindex> <span class=md-ellipsis> User Guide </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_3_label aria-expanded=false> <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 " type=checkbox id=__nav_3_1> <label class=md-nav__link for=__nav_3_1 id=__nav_3_1_label tabindex> <span class=md-ellipsis> NGINX Configuration </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_3_1_label aria-expanded=false> <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> <span class=md-ellipsis> Introduction </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/basic-usage/ class=md-nav__link> <span class=md-ellipsis> Basic usage </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/annotations/ class=md-nav__link> <span class=md-ellipsis> Annotations </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/annotations-risk/ class=md-nav__link> <span class=md-ellipsis> Annotations Risks </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/configmap/ class=md-nav__link> <span class=md-ellipsis> ConfigMap </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/custom-template/ class=md-nav__link> <span class=md-ellipsis> Custom NGINX template </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/nginx-configuration/log-format/ class=md-nav__link> <span class=md-ellipsis> Log format </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../user-guide/cli-arguments/ class=md-nav__link> <span class=md-ellipsis> Command line arguments </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/custom-errors/ class=md-nav__link> <span class=md-ellipsis> Custom errors </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/default-backend/ class=md-nav__link> <span class=md-ellipsis> Default backend </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/exposing-tcp-udp-services/ class=md-nav__link> <span class=md-ellipsis> Exposing TCP and UDP services </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/fcgi-services/ class=md-nav__link> <span class=md-ellipsis> Exposing FCGI services </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/ingress-path-matching/ class=md-nav__link> <span class=md-ellipsis> Regular expressions in paths </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/external-articles/ class=md-nav__link> <span class=md-ellipsis> External Articles </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/miscellaneous/ class=md-nav__link> <span class=md-ellipsis> Miscellaneous </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/monitoring/ class=md-nav__link> <span class=md-ellipsis> Prometheus and Grafana installation </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/multiple-ingress/ class=md-nav__link> <span class=md-ellipsis> Multiple Ingress controllers </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/tls/ class=md-nav__link> <span class=md-ellipsis> TLS/HTTPS </span> </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3_13> <label class=md-nav__link for=__nav_3_13 id=__nav_3_13_label tabindex> <span class=md-ellipsis> Third party addons </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_3_13_label aria-expanded=false> <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> <span class=md-ellipsis> ModSecurity Web Application Firewall </span> </a> </li> <li class=md-nav__item> <a href=../../user-guide/third-party-addons/opentelemetry/ class=md-nav__link> <span class=md-ellipsis> OpenTelemetry </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_4> <label class=md-nav__link for=__nav_4 id=__nav_4_label tabindex> <span class=md-ellipsis> Examples </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_4_label aria-expanded=false> <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> <span class=md-ellipsis> Introduction </span> </a> </li> <li class=md-nav__item> <a href=../../examples/PREREQUISITES/ class=md-nav__link> <span class=md-ellipsis> Prerequisites </span> </a> </li> <li class=md-nav__item> <a href=../../examples/affinity/cookie/ class=md-nav__link> <span class=md-ellipsis> Sticky Sessions </span> </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_4_4> <label class=md-nav__link for=__nav_4_4 id=__nav_4_4_label tabindex> <span class=md-ellipsis> Auth </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_4_4_label aria-expanded=false> <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> <span class=md-ellipsis> Basic Authentication </span> </a> </li> <li class=md-nav__item> <a href=../../examples/auth/client-certs/ class=md-nav__link> <span class=md-ellipsis> Client Certificate Authentication </span> </a> </li> <li class=md-nav__item> <a href=../../examples/auth/external-auth/ class=md-nav__link> <span class=md-ellipsis> External Basic Authentication </span> </a> </li> <li class=md-nav__item> <a href=../../examples/auth/oauth-external-auth/ class=md-nav__link> <span class=md-ellipsis> External OAUTH Authentication </span> </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 " type=checkbox id=__nav_4_5> <label class=md-nav__link for=__nav_4_5 id=__nav_4_5_label tabindex> <span class=md-ellipsis> Customization </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_4_5_label aria-expanded=false> <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> <span class=md-ellipsis> Configuration Snippets </span> </a> </li> <li class=md-nav__item> <a href=../../examples/customization/custom-configuration/ class=md-nav__link> <span class=md-ellipsis> Custom Configuration </span> </a> </li> <li class=md-nav__item> <a href=../../examples/customization/custom-errors/ class=md-nav__link> <span class=md-ellipsis> Custom Errors </span> </a> </li> <li class=md-nav__item> <a href=../../examples/customization/custom-headers/ class=md-nav__link> <span class=md-ellipsis> Custom Headers </span> </a> </li> <li class=md-nav__item> <a href=../../examples/customization/external-auth-headers/ class=md-nav__link> <span class=md-ellipsis> External authentication </span> </a> </li> <li class=md-nav__item> <a href=../../examples/customization/ssl-dh-param/ class=md-nav__link> <span class=md-ellipsis> Custom DH parameters for perfect forward secrecy </span> </a> </li> <li class=md-nav__item> <a href=../../examples/customization/sysctl/ class=md-nav__link> <span class=md-ellipsis> Sysctl tuning </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../examples/docker-registry/ class=md-nav__link> <span class=md-ellipsis> Docker registry </span> </a> </li> <li class=md-nav__item> <a href=../../examples/grpc/ class=md-nav__link> <span class=md-ellipsis> gRPC </span> </a> </li> <li class=md-nav__item> <a href=../../examples/multi-tls/ class=md-nav__link> <span class=md-ellipsis> Multi TLS certificate termination </span> </a> </li> <li class=md-nav__item> <a href=../../examples/rewrite/ class=md-nav__link> <span class=md-ellipsis> Rewrite </span> </a> </li> <li class=md-nav__item> <a href=../../examples/static-ip/ class=md-nav__link> <span class=md-ellipsis> Static IPs </span> </a> </li> <li class=md-nav__item> <a href=../../examples/tls-termination/ class=md-nav__link> <span class=md-ellipsis> TLS termination </span> </a> </li> <li class=md-nav__item> <a href=../../examples/openpolicyagent/ class=md-nav__link> <span class=md-ellipsis> Open Policy Agent rules </span> </a> </li> <li class=md-nav__item> <a href=../../examples/canary/ class=md-nav__link> <span class=md-ellipsis> Canary Deployments </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_5 checked> <label class=md-nav__link for=__nav_5 id=__nav_5_label tabindex> <span class=md-ellipsis> Developer Guide </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_5_label aria-expanded=true> <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> <span class=md-ellipsis> Getting Started </span> </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> Code Overview </span> <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> Code Overview </span> </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-component=toc 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> <span class=md-ellipsis> FAQ </span> </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=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-component=toc 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 data-md-component=content> <article class="md-content__inner md-typeset"> <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-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../..", "features": ["navigation.tabs", "navigation.tabs.sticky", "navigation.instant", "navigation.sections"], "search": "../../assets/javascripts/workers/search.f886a092.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=../../assets/javascripts/bundle.aecac24b.min.js></script> </body> </html>