<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[CI/CD/DevOps - Medium]]></title>
        <description><![CDATA[my personal notes on CI/CD/DevOps practices - Medium]]></description>
        <link>https://medium.com/ci-cd-devops?source=rss----4697df3eedda---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>CI/CD/DevOps - Medium</title>
            <link>https://medium.com/ci-cd-devops?source=rss----4697df3eedda---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 21:57:15 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/ci-cd-devops" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (8)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-8-49ee55ff33f1?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/49ee55ff33f1</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sun, 04 Jan 2026 13:24:25 GMT</pubDate>
            <atom:updated>2026-01-04T13:24:24.259Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: can Semgrep integrate with private source code repos?</p><p>A: Yes, Semgrep Appsec platform can actually seamless integrate with private source code repos via <em>Semgrep Network Broker</em>.</p><p>The Semgrep Network Broker facilitates secure access between Semgrep and a private network.</p><p>The broker accomplishes this by establishing a <em>Wireguard </em>VPN tunnel with the Semgrep backend, and then proxying inbound (Semgrep → customer) HTTP requests through this tunnel. This approach allows Semgrep to interact with on-prem resources without having to expose them to the public internet.</p><p><a href="https://github.com/semgrep/semgrep-network-broker">https://github.com/semgrep/semgrep-network-broker</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=49ee55ff33f1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-8-49ee55ff33f1">Semgrep FAQ for end users (8)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (7)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-7-ba3bd9ca824c?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/ba3bd9ca824c</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Thu, 11 Dec 2025 02:55:17 GMT</pubDate>
            <atom:updated>2025-12-11T02:55:08.055Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: what languages does Semgrep reachability cover?</p><p>A: as of today, Semgrep SSC (Semgrep Supply Chain) support reachability analysis for 11 programming languages:</p><ul><li>C#</li><li>Go</li><li>Java</li><li>JavaScript</li><li>TypeScript</li><li>Kotlin</li><li>PHP</li><li>Python</li><li>Ruby</li><li>Scala</li><li>Swift</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ba3bd9ca824c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-7-ba3bd9ca824c">Semgrep FAQ for end users (7)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (6)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-6-3d214e1ac7b1?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/3d214e1ac7b1</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sat, 06 Dec 2025 14:16:47 GMT</pubDate>
            <atom:updated>2025-12-06T14:16:46.155Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: does Semgrep SAST provide exploit and payload illustration?</p><p>A: Yes. When applicable, Semgrep Assistant uses large language models to analyze findings in the context of your organization and codebase. It then generates enriched insights — including triage guidance, potential exploit scenarios, and recommended remediation steps. You can view any available exploit details, including payload examples, directly within the <em>Finding Description</em> section of each finding’s page.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/867/1*_uZcAJaOJXWmudEUO3B-wQ.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3d214e1ac7b1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-6-3d214e1ac7b1">Semgrep FAQ for end users (6)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (5)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-4-4228b5c3c4db?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/4228b5c3c4db</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sun, 23 Nov 2025 03:50:20 GMT</pubDate>
            <atom:updated>2025-11-23T03:50:19.251Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: how do I enforce Semgrep to check for content suppressed by <em>nosem</em>?</p><p>A: sometimes, developer might take the shortcut to suppress some Semgrep reporting by using inline pragma like <a href="https://semgrep.dev/docs/ignoring-files-folders-code#reference-summary">nosem</a> in the code comment; as a member of appsec team, you might want to scan through everything in the CI regardless ofnosem .</p><p>This is made possible by the following Semgrep CLI flag:</p><pre>--disable-nosem</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4228b5c3c4db" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-4-4228b5c3c4db">Semgrep FAQ for end users (5)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (4)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-4-416fa4821c3c?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/416fa4821c3c</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sun, 23 Nov 2025 03:33:42 GMT</pubDate>
            <atom:updated>2025-11-23T03:33:41.557Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: Do I need a LLM or cloud subscriptions to use the AI feature of Semgrep?</p><p>A: NO, the cloud runner cost and LLM subscription cost are born by Semgrep.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=416fa4821c3c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-4-416fa4821c3c">Semgrep FAQ for end users (4)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (3)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-3-511d3c510870?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/511d3c510870</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sun, 23 Nov 2025 03:25:40 GMT</pubDate>
            <atom:updated>2025-11-23T03:25:39.396Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: how does Semgrep appsec platform leverage AI to help customers?</p><p>A: TLDR</p><ul><li>auto-triage</li><li>auto-fix</li><li>memories / user provided context</li></ul><ul><li><a href="https://semgrep.dev/docs/semgrep-assistant/overview">Overview | Semgrep</a></li><li><a href="https://semgrep.dev/products/semgrep-code/assistant/">AI Assistant | AppSec Engineer Assistant to Accelerate Time to Fix</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=511d3c510870" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-3-511d3c510870">Semgrep FAQ for end users (3)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (2)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-2-38d20f135861?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/38d20f135861</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Thu, 30 Oct 2025 13:07:10 GMT</pubDate>
            <atom:updated>2025-10-30T13:07:09.676Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: how do I delete an old project from the platform?</p><p>A: click on the 3 dots to the right of your project/repo, and select Delete project .</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0SlI7PTRYIyvOORIciiNaQ.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=38d20f135861" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-2-38d20f135861">Semgrep FAQ for end users (2)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Semgrep FAQ for end users (1)]]></title>
            <link>https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-1-f45ae872a203?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/f45ae872a203</guid>
            <category><![CDATA[semgrep]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Thu, 30 Oct 2025 13:04:56 GMT</pubDate>
            <atom:updated>2025-10-30T13:04:55.262Z</atom:updated>
            <content:encoded><![CDATA[<p>Q: Am I using Semgrep CE or Semgrep commercial version?</p><p>A: simple,</p><ul><li>if you are managing Semgrep findings from the web portal (semgrep.dev), then you are already using the commercial version of Semgrep.</li><li>if you only running Semgrep from command line and without a token, then you are surely using Semgrep CE (community edition).</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f45ae872a203" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/semgrep-faq-for-end-users-1-f45ae872a203">Semgrep FAQ for end users (1)</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[trying out MongoDB vector search using OpenAI]]></title>
            <link>https://medium.com/ci-cd-devops/trying-out-mongodb-vector-search-using-openai-0e1d7fdd5601?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/0e1d7fdd5601</guid>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[mongodb]]></category>
            <category><![CDATA[vector-search]]></category>
            <category><![CDATA[langchain]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sat, 02 Nov 2024 13:18:07 GMT</pubDate>
            <atom:updated>2024-11-02T13:20:35.988Z</atom:updated>
            <content:encoded><![CDATA[<p>trying out MongoDB vector search using OpenAI</p><p>setup Python environment in Jupyter notebook,</p><pre>%pip install --upgrade --quiet  langchain langchain_community langchain_core langchain_openai pymongo lark<br><br>import os<br><br>OPENAI_API_KEY = &quot;sk-xxxxx&quot;<br>os.environ[&quot;OPENAI_API_KEY&quot;] = OPENAI_API_KEY</pre><p>add current IP address to MongoDB,</p><pre>!curl ipecho.net/plain</pre><p>then load the data to MongoDB,</p><pre>from langchain_community.vectorstores import MongoDBAtlasVectorSearch<br>from langchain_core.documents import Document<br>from langchain_openai import OpenAIEmbeddings<br>from pymongo import MongoClient<br><br>CONNECTION_STRING = &quot;mongodb+srv://rw-user-1:$pwd@clusterm0.nnnnn.mongodb.net/?tls=true&amp;retryWrites=true&amp;w=majority&amp;appName=ClusterM0&quot;<br>DB_NAME = &quot;media&quot;<br>COLLECTION_NAME = &quot;movie&quot;<br>INDEX_NAME = &quot;default&quot;<br><br>MongoClient = MongoClient(CONNECTION_STRING)<br>collection = MongoClient[DB_NAME][COLLECTION_NAME]<br><br>embeddings = OpenAIEmbeddings()<br><br>docs = [<br>    Document(<br>        page_content=&quot;A bunch of scientists bring back dinosaurs and mayhem breaks loose&quot;,<br>        metadata={&quot;year&quot;: 1993, &quot;rating&quot;: 7.7, &quot;genre&quot;: &quot;action&quot;},<br>    ),<br>    Document(<br>        page_content=&quot;Leo DiCaprio gets lost in a dream within a dream within a dream within a ...&quot;,<br>        metadata={&quot;year&quot;: 2010, &quot;genre&quot;: &quot;thriller&quot;, &quot;rating&quot;: 8.2},<br>    ),<br>    Document(<br>        page_content=&quot;A bunch of normal-sized women are supremely wholesome and some men pine after them&quot;,<br>        metadata={&quot;year&quot;: 2019, &quot;rating&quot;: 8.3, &quot;genre&quot;: &quot;drama&quot;},<br>    ),<br>    Document(<br>        page_content=&quot;Three men walk into the Zone, three men walk out of the Zone&quot;,<br>        metadata={&quot;year&quot;: 1979, &quot;rating&quot;: 9.9, &quot;genre&quot;: &quot;science fiction&quot;},<br>    ),<br>    Document(<br>        page_content=&quot;A psychologist / detective gets lost in a series of dreams within dreams within dreams and Inception reused the idea&quot;,<br>        metadata={&quot;year&quot;: 2006, &quot;genre&quot;: &quot;thriller&quot;, &quot;rating&quot;: 9.0},<br>    ),<br>    Document(<br>        page_content=&quot;Toys come alive and have a blast doing so&quot;,<br>        metadata={&quot;year&quot;: 1995, &quot;genre&quot;: &quot;animated&quot;, &quot;rating&quot;: 9.3},<br>    ),<br>]<br><br>vectorstore = MongoDBAtlasVectorSearch.from_documents(<br>    docs,<br>    embeddings,<br>    collection=collection,<br>    index_name=INDEX_NAME,<br>)</pre><p>now, we need to add in the search index to the database,</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dawu_ZnS1e7eJn1Dbe4keA.png" /></figure><pre>{<br>  &quot;mappings&quot;: {<br>    &quot;dynamic&quot;: true,<br>    &quot;fields&quot;: {<br>      &quot;embedding&quot;: {<br>        &quot;dimensions&quot;: 1536,<br>        &quot;similarity&quot;: &quot;cosine&quot;,<br>        &quot;type&quot;: &quot;knnVector&quot;<br>      },<br>      &quot;genre&quot;: {<br>        &quot;type&quot;: &quot;token&quot;<br>      },<br>      &quot;ratings&quot;: {<br>        &quot;type&quot;: &quot;number&quot;<br>      },<br>      &quot;year&quot;: {<br>        &quot;type&quot;: &quot;number&quot;<br>      }<br>    }<br>  }<br>}</pre><p>now let’s run a search</p><pre>def create_vector_search():<br>    &quot;&quot;&quot;<br>    Creates a MongoDBAtlasVectorSearch object using the connection string, database, and collection names, along with the OpenAI embeddings and index configuration.<br><br>    :return: MongoDBAtlasVectorSearch object<br>    &quot;&quot;&quot;<br>    vector_search = MongoDBAtlasVectorSearch.from_connection_string(<br>        CONNECTION_STRING,<br>        f&quot;{DB_NAME}.{COLLECTION_NAME}&quot;,<br>        embeddings,<br>        index_name=INDEX_NAME<br>    )<br>    return vector_search<br><br>def perform_similarity_search(query, top_k=1):<br>    &quot;&quot;&quot;<br>    This function performs a similarity search within a MongoDB Atlas collection. It leverages the capabilities of the MongoDB Atlas Search, which under the hood, may use the `$vectorSearch` operator, to find and return the top `k` documents that match the provided query semantically.<br><br>    :param query: The search query string.<br>    :param top_k: Number of top matches to return.<br>    :return: A list of the top `k` matching documents with their similarity scores.<br>    &quot;&quot;&quot;<br><br>   # Get the MongoDBAtlasVectorSearch object<br>    vector_search = create_vector_search()<br><br>    # Execute the similarity search with the given query<br>    results = vector_search.similarity_search_with_score(<br>        query=query,<br>        k=top_k,<br>    )<br><br>    return results<br><br># Example of calling the function directly<br>#relevant_documents = perform_similarity_search(&quot;What are some movies about dinosaurs&quot;)<br>relevant_documents = perform_similarity_search(&quot;I want to watch a movie about toys rated higher than 9&quot;)<br>print(&quot;Number of relevant documents:&quot;, len(relevant_documents))<br><br>for document in relevant_documents:<br>    print(&quot;Document content:&quot;, document)<br>    print()</pre><p>we get some similar records as following</p><pre>Number of relevant documents: 1<br></pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0e1d7fdd5601" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/trying-out-mongodb-vector-search-using-openai-0e1d7fdd5601">trying out MongoDB vector search using OpenAI</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[how to deploy ingress to multi node KIND cluster]]></title>
            <link>https://medium.com/ci-cd-devops/how-to-deploy-ingress-to-multi-node-kind-cluster-be1f5e80e5c8?source=rss----4697df3eedda---4</link>
            <guid isPermaLink="false">https://medium.com/p/be1f5e80e5c8</guid>
            <category><![CDATA[kind]]></category>
            <category><![CDATA[ingress]]></category>
            <category><![CDATA[k8s]]></category>
            <dc:creator><![CDATA[Shi]]></dc:creator>
            <pubDate>Sun, 20 Oct 2024 08:18:16 GMT</pubDate>
            <atom:updated>2024-10-20T08:48:45.368Z</atom:updated>
            <content:encoded><![CDATA[<p>to prepare a multinode cluster using KIND; the following will</p><p>— create a KIND cluster with 1 control plane and 2 worker nodes;</p><p>— and label control plane to make it ready for ingress deployment.</p><p>— open up the port 80 and 443</p><pre>kind: Cluster<br>apiVersion: kind.x-k8s.io/v1alpha4<br>nodes:<br>- role: worker<br>- role: worker<br>- role: control-plane<br>  kubeadmConfigPatches:<br>  - |<br>    kind: InitConfiguration<br>    nodeRegistration:<br>      kubeletExtraArgs:<br>        node-labels: &quot;ingress-ready=true&quot;<br>        authorization-mode: &quot;AlwaysAllow&quot;<br>  extraPortMappings:<br>  - containerPort: 80<br>    hostPort: 80<br>    protocol: TCP<br>  - containerPort: 443<br>    hostPort: 443<br>    protocol: TCP</pre><p>now we could see that docker has initiated 3 pods to simulate 3 nodes, and the control plane is listening on 80, 443, and 6443; the apiserver is actually running at 6443, and mapped to an empheral port at host (39645). KIND doesn’t use the default 6443 port directly on host because there could be multiple KIND clusers running on the same host.</p><pre># docker ps<br>CONTAINER ID   IMAGE                                                                                   COMMAND                  CREATED       STATUS          PORTS                                                                 NAMES<br>2936d7d97163   kindest/node:v1.31.0                                                                    &quot;/usr/local/bin/entr…&quot;   2 days ago    Up 38 minutes                                                                         c3-worker2<br>8d24b2353a3e   kindest/node:v1.31.0                                                                    &quot;/usr/local/bin/entr…&quot;   2 days ago    Up 38 minutes   0.0.0.0:80-&gt;80/tcp, 0.0.0.0:443-&gt;443/tcp, 127.0.0.1:39645-&gt;6443/tcp   c3-control-plane<br>4090dcace400   kindest/node:v1.31.0                                                                    &quot;/usr/local/bin/entr…&quot;   2 days ago    Up 38 minutes                                                                         c3-worker<br>c002a6fb036c   vsc-cks-crash-course-3b2d7564edfb8b003aeb11dff1e6109bc39e0cd607995c122a7e70438649c8c8   &quot;/bin/sh -c &#39;echo Co…&quot;   11 days ago   Up 38 minutes                                                                         beautiful_swartz</pre><p>then deploy the ingress-nginx and wait for it to be ready</p><pre>k apply --filename https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml<br>k wait --namespace ingress-nginx --for=condition=ready pod --selector=app.kubernetes.io/component=controller --timeout=180s</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ybf4J0K2nHwcwRuNKu61fw.png" /></figure><p>let’s deploy some sample workload</p><pre>apiVersion: v1<br>kind: Namespace<br>metadata:<br>  name: t75<br>---<br>apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br>  name: nginx-deployment<br>  namespace: t75<br>  labels:<br>    app: nginx<br>spec:<br>  replicas: 3<br>  selector:<br>    matchLabels:<br>      app: nginx<br>  template:<br>    metadata:<br>      labels:<br>        app: nginx<br>    spec:<br>      containers:<br>      - name: nginx<br>        image: nginx:1.14.2<br>        ports:<br>        - containerPort: 80<br>---<br>apiVersion: v1<br>kind: Service<br>metadata:<br>  name: accounting-service<br>  namespace: t75<br>spec:<br>  selector:<br>    app: nginx<br>  ports:<br>    - protocol: TCP<br>      port: 80<br>      targetPort: 80</pre><p>now, we can pod and service in namespace t75;</p><pre># k get all -n t75<br>NAME                                   READY   STATUS    RESTARTS   AGE<br>pod/nginx-deployment-d556bf558-bm9d5   1/1     Running   0          59m<br>pod/nginx-deployment-d556bf558-tf6mg   1/1     Running   0          59m<br>pod/nginx-deployment-d556bf558-vhmm2   1/1     Running   0          59m<br><br>NAME                         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE<br>service/accounting-service   ClusterIP   10.96.164.6   &lt;none&gt;        80/TCP    59m<br><br>NAME                               READY   UP-TO-DATE   AVAILABLE   AGE<br>deployment.apps/nginx-deployment   3/3     3            3           59m<br><br>NAME                                         DESIRED   CURRENT   READY   AGE<br>replicaset.apps/nginx-deployment-d556bf558   3         3         3       59m</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FE7U06SSykR9dDea5s1Jkw.png" /></figure><p>let’s create the ingress to expose the accounting-service</p><pre># cat ingress.yaml<br><br>apiVersion: networking.k8s.io/v1<br>kind: Ingress<br>metadata:<br>  name: accounting-ingress<br>  namespace: t75<br>spec:<br>  tls:<br>  - hosts:<br>    - accounting.internal.acme.com<br>    secretName: accounting-secret<br>  rules:<br>  - host: accounting.internal.acme.com<br>    http:<br>      paths:<br>      - path: /<br>        pathType: Prefix<br>        backend:<br>          service:<br>            name: accounting-service<br>            port:<br>              number: 80<br><br>  # k apply -f ingress.yaml</pre><p>find out the external IP address of the control plane,</p><pre>codespaces-6d5b0e# k get nodes -o wide<br>NAME               STATUS   ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME<br>c3-control-plane   Ready    control-plane   55m   v1.31.0   172.18.0.2    &lt;none&gt;        Debian GNU/Linux 12 (bookworm)   6.5.0-1025-azure   containerd://1.7.18<br>c3-worker          Ready    &lt;none&gt;          55m   v1.31.0   172.18.0.4    &lt;none&gt;        Debian GNU/Linux 12 (bookworm)   6.5.0-1025-azure   containerd://1.7.18<br>c3-worker2         Ready    &lt;none&gt;          55m   v1.31.0   172.18.0.3    &lt;none&gt;        Debian GNU/Linux 12 (bookworm)   6.5.0-1025-azure   containerd://1.7.18</pre><p>then add it to /etc/hosts of host,</p><pre>$ cat /etc/hosts<br>172.18.0.2      accounting.internal.acme.com <br>127.0.0.1       localhost</pre><p>let’s test it from host:</p><pre># wget -q -O- https://accounting.internal.acme.com --no-check-certificate<br><br>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;Welcome to nginx!&lt;/title&gt;<br>&lt;style&gt;<br>    body {<br>        width: 35em;<br>        margin: 0 auto;<br>        font-family: Tahoma, Verdana, Arial, sans-serif;<br>    }<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;<br>&lt;p&gt;If you see this page, the nginx web server is successfully installed and<br>working. Further configuration is required.&lt;/p&gt;<br><br>&lt;p&gt;For online documentation and support please refer to<br>&lt;a href=&quot;http://nginx.org/&quot;&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;<br>Commercial support is available at<br>&lt;a href=&quot;http://nginx.com/&quot;&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;<br><br>&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</pre><h3>Debugging</h3><p>if we want to test out the service inside the cluster</p><pre># k run tmp -n t75 --image=busybox --restart=Never -it --rm --  sh<br><br>/ # wget -q -O- accounting-service<br><br>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;Welcome to nginx!&lt;/title&gt;<br>&lt;style&gt;<br>    body {<br>        width: 35em;<br>        margin: 0 auto;<br>        font-family: Tahoma, Verdana, Arial, sans-serif;<br>    }<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;<br>&lt;p&gt;If you see this page, the nginx web server is successfully installed and<br>working. Further configuration is required.&lt;/p&gt;<br><br>&lt;p&gt;For online documentation and support please refer to<br>&lt;a href=&quot;http://nginx.org/&quot;&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;<br>Commercial support is available at<br>&lt;a href=&quot;http://nginx.com/&quot;&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;<br><br>&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</pre><p>if we want to use a custom path insead of / , we need to remember to add the annotation as below</p><pre>apiVersion: networking.k8s.io/v1<br>kind: Ingress<br>metadata:<br>  name: accounting-ingress<br>  namespace: t75<br>  annotations:<br>    nginx.ingress.kubernetes.io/rewrite-target: /<br>spec:<br>  tls:<br>  - hosts:<br>    - accounting.internal.acme.com<br>    secretName: accounting-secret<br>  rules:<br>  - host: accounting.internal.acme.com<br>    http:<br>      paths:<br>      - path: /acc<br>        pathType: Prefix<br>        backend:<br>          service:<br>            name: accounting-service<br>            port:<br>              number: 80</pre><p>then, we could visit the service at /acc</p><pre># wget -q -O- https://accounting.internal.acme.com/acc --no-check-certificate<br><br>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;Welcome to nginx!&lt;/title&gt;<br>&lt;style&gt;<br>    body {<br>        width: 35em;<br>        margin: 0 auto;<br>        font-family: Tahoma, Verdana, Arial, sans-serif;<br>    }<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;<br>&lt;p&gt;If you see this page, the nginx web server is successfully installed and<br>working. Further configuration is required.&lt;/p&gt;<br><br>&lt;p&gt;For online documentation and support please refer to<br>&lt;a href=&quot;http://nginx.org/&quot;&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;<br>Commercial support is available at<br>&lt;a href=&quot;http://nginx.com/&quot;&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;<br><br>&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</pre><blockquote><strong><em>so in summary, in order to expose a service outside the cluster, we need a deployment with pod, and a service point to the pods, and install ingressControler (if it is not deployed in your k8s cluster by default) and ingress rule (ingress.yaml).</em></strong></blockquote><blockquote><strong><em>specificially to KIND, you need to make sure the node are ready for ingressController deployment, and expose the relevant ports when creating cluster.</em></strong></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=be1f5e80e5c8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ci-cd-devops/how-to-deploy-ingress-to-multi-node-kind-cluster-be1f5e80e5c8">how to deploy ingress to multi node KIND cluster</a> was originally published in <a href="https://medium.com/ci-cd-devops">CI/CD/DevOps</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>