{"id":10062,"date":"2026-04-29T19:08:49","date_gmt":"2026-04-29T13:38:49","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=10062"},"modified":"2026-04-29T19:09:47","modified_gmt":"2026-04-29T13:39:47","slug":"how-to-configure-kubernetes-ingress-with-automatic-ssl-certificates-without-helm","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/how-to-configure-kubernetes-ingress-with-automatic-ssl-certificates-without-helm\/","title":{"rendered":"How to Configure Kubernetes Ingress with Automatic SSL Certificates (Without Helm)"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Introduction<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Managing external access to applications in Kubernetes can feel complex\u2014especially when you want secure HTTPS connections. Fortunately, Kubernetes provides a powerful combination of <strong>Ingress<\/strong> and <strong>automatic SSL certificate management<\/strong> using tools like NGINX Ingress Controller and Cert-Manager.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, you\u2019ll learn how to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set up an Ingress controller manually (no Helm)<\/li>\n\n\n\n<li>Configure automatic SSL using Let\u2019s Encrypt<\/li>\n\n\n\n<li>Secure your application with HTTPS<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Architecture Overview<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before we begin, here\u2019s how everything connects:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ingress Controller (NGINX)<\/strong> \u2192 Handles incoming traffic<\/li>\n\n\n\n<li><strong>Cert-Manager<\/strong> \u2192 Requests &amp; renews SSL certificates<\/li>\n\n\n\n<li><strong>Let\u2019s Encrypt<\/strong> \u2192 Issues free SSL certificates<\/li>\n\n\n\n<li><strong>Ingress Resource<\/strong> \u2192 Defines routing rules<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16.png\"><img fetchpriority=\"high\" decoding=\"async\" width=\"926\" height=\"620\" src=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16.png\" alt=\"\" class=\"wp-image-10063\" srcset=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16.png 926w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16-300x201.png 300w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16-768x514.png 768w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16-448x300.png 448w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-16-272x182.png 272w\" sizes=\"(max-width: 926px) 100vw, 926px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Install NGINX Ingress Controller<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apply the official manifest directly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/ingress-nginx\/main\/deploy\/static\/provider\/cloud\/deploy.yaml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verify installation:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n ingress-nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wait until all pods are in <strong>Running<\/strong> state.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Install Cert-Manager<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apply Cert-Manager CRDs and components:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/github.com\/cert-manager\/cert-manager\/releases\/latest\/download\/cert-manager.yaml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check pods:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n cert-manager<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Create a ClusterIssuer for Let\u2019s Encrypt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This defines how certificates are issued.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: cert-manager.io\/v1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-demo\nspec:\n  acme:\n    email: your-email@example.com\n    server: https:\/\/acme-v02.api.letsencrypt.org\/directory\n    privateKeySecretRef:\n      name: letsencrypt-demo-key\n    solvers:\n    - http01:\n        ingress:\n          class: nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Apply it:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f cluster-issuer.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Deploy Your Application<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Example deployment and service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: demo-app\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: demo-app\n  template:\n    metadata:\n      labels:\n        app: demo-app\n    spec:\n      containers:\n      - name: demo-app\n        image: nginx\n        ports:\n        - containerPort: 80\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: demo-service\nspec:\n  selector:\n    app: demo-app\n  ports:\n    - port: 80\n      targetPort: 80<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Create Ingress with Auto SSL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: demo-ingress\n  annotations:\n    cert-manager.io\/cluster-issuer: \"letsencrypt-demo\"\nspec:\n  ingressClassName: nginx\n  tls:\n  - hosts:\n    - yourdomain.com\n    secretName: demo-tls\n  rules:\n  - host: yourdomain.com\n    http:\n      paths:\n      - path: \/\n        pathType: Prefix\n        backend:\n          service:\n            name: demo-service\n            port:\n              number: 80<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Apply it:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f ingress.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: Point Your Domain<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Update your DNS:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add an <strong>A record<\/strong> pointing <code>yourdomain.com<\/code> \u2192 Ingress external IP<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check IP:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get svc -n ingress-nginx<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7: Verify SSL Certificate<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check certificate status:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl describe certificate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Once issued, access:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;yourdomain.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see a secure HTTPS connection<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Setting up Kubernetes Ingress with automatic SSL certificates <strong>without Helm<\/strong> gives you full control and a deeper understanding of your cluster. By combining NGINX Ingress Controller and Cert-Manager, you can securely expose applications with minimal manual effort.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once configured, certificates renew automatically\u2014so you can focus on building your application instead of managing infrastructure.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-17.png\"><img decoding=\"async\" width=\"737\" height=\"503\" src=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-17.png\" alt=\"\" class=\"wp-image-10064\" srcset=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-17.png 737w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-17-300x205.png 300w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2026\/04\/image-17-440x300.png 440w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Managing external access to applications in Kubernetes can feel complex\u2014especially when you want secure HTTPS connections. Fortunately, Kubernetes provides [&hellip;]<\/p>\n","protected":false},"author":532,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1024],"tags":[],"class_list":["post-10062","post","type-post","status-publish","format-standard","hentry","category-security","psol-cat-security"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-2Ci","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/10062","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/532"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=10062"}],"version-history":[{"count":2,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/10062\/revisions"}],"predecessor-version":[{"id":10066,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/10062\/revisions\/10066"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=10062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=10062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=10062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}