[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"content-/blog/2024/08/06/tf-tg-flux-eks":3,"related-/blog/2024/08/06/tf-tg-flux-eks":502},{"id":4,"title":5,"author":6,"body":7,"cover":480,"date":481,"description":13,"draft":482,"excerpt":483,"extension":484,"github":20,"keywords":485,"meta":486,"navigation":487,"path":488,"seo":489,"shortDesc":483,"slug":490,"stem":491,"tags":492,"video":483,"__hash__":501},"blog/blog/2024/08/06/tf-tg-flux-eks.md","Terraform, Terragrunt for IaC and FluxCD for GitOps","Oz Shemesh",{"type":8,"value":9,"toc":447},"minimark",[10,24,27,32,35,61,66,76,80,83,87,90,105,108,112,126,130,133,176,180,183,187,198,201,212,216,219,223,226,230,251,254,265,268,275,279,282,293,296,300,303,309,312,315,319,322,326,337,341,344,348,357,361,376,380,406,410,413,417,431,435,443],[11,12,14],"info-box",{"type":13},"",[15,16,17],"p",{},[18,19,23],"a",{"href":20,"rel":21},"https://gitlab.com/devozs/devops-infra",[22],"nofollow","Show me the Code!",[15,25,26],{},"This repository contains the Infrastructure as Code (IaC) using Terraform and Terragrunt, and implements GitOps practices using FluxCD for a simple counter application.",[28,29,31],"h2",{"id":30},"iac-terraform-and-terragrunt","IaC - Terraform and Terragrunt",[15,33,34],{},"We use Terraform with Terragrunt to manage our AWS infrastructure. The main components include:",[36,37,38,42],"ul",{},[39,40,41],"li",{},"EKS Cluster",[39,43,44,45,49,50],{},"Modules (",[18,46,47],{"href":47,"rel":48},"https://gitlab.com/devozs/infrastructure-modules",[22],")\n",[36,51,52,55,58],{},[39,53,54],{},"VPC and Networking",[39,56,57],{},"IAM Roles and Policies",[39,59,60],{},"ECR Repository",[62,63,65],"h3",{"id":64},"directory-structure","Directory Structure",[67,68,73],"pre",{"className":69,"code":71,"language":72},[70],"language-text","infrastructure/\n├── dev/\n│   ├── eks/\n│   ├── vpc/\n│   └── ecr/\n├── modules/ (in a seperate repo)\n│   ├── eks/\n│   ├── vpc/\n│   └── ecr/\n└── terragrunt.hcl\n","text",[74,75,71],"code",{"__ignoreMap":13},[28,77,79],{"id":78},"references-and-credits","References and Credits",[15,81,82],{},"In the development of this project, several external resources were invaluable:",[62,84,86],{"id":85},"terraform-and-terragrunt","Terraform and Terragrunt",[15,88,89],{},"For learning and implementing Terraform with Terragrunt, the following tutorial was extensively used:",[36,91,92,95,98],{},[39,93,94],{},"Title: \"Terraform & Terragrunt for AWS Beginner Project Tutorial\"",[39,96,97],{},"Author: Anton Putra",[39,99,100,101],{},"URL: ",[18,102,103],{"href":103,"rel":104},"https://www.youtube.com/watch?v=yduHaOj3XMg",[22],[15,106,107],{},"This tutorial provided crucial insights into setting up and managing AWS infrastructure using Terraform and Terragrunt, which greatly influenced the structure and approach of this project.",[62,109,111],{"id":110},"key-features","Key Features",[36,113,114,117,120,123],{},[39,115,116],{},"Modular design for reusability",[39,118,119],{},"Environment separation (dev, staging, prod)",[39,121,122],{},"Remote state management using S3 backend",[39,124,125],{},"IAM roles for EKS and ECR access",[62,127,129],{"id":128},"usage","Usage",[15,131,132],{},"To apply changes:",[67,134,138],{"className":135,"code":136,"language":137,"meta":13,"style":13},"language-bash shiki shiki-themes nord github-dark monokai","cd infrastructure/dev\nterragrunt run-all plan\nterragrunt run-all apply\n","bash",[74,139,140,153,166],{"__ignoreMap":13},[141,142,145,149],"span",{"class":143,"line":144},"line",1,[141,146,148],{"class":147},"sCWj5","cd",[141,150,152],{"class":151},"siq7d"," infrastructure/dev\n",[141,154,156,160,163],{"class":143,"line":155},2,[141,157,159],{"class":158},"sNHwn","terragrunt",[141,161,162],{"class":151}," run-all",[141,164,165],{"class":151}," plan\n",[141,167,169,171,173],{"class":143,"line":168},3,[141,170,159],{"class":158},[141,172,162],{"class":151},[141,174,175],{"class":151}," apply\n",[28,177,179],{"id":178},"gitops-fluxcd","GitOps - FluxCD",[15,181,182],{},"We use FluxCD for continuous deployment and GitOps practices.",[62,184,186],{"id":185},"components","Components",[36,188,189,192,195],{},[39,190,191],{},"Flux Bootstrap",[39,193,194],{},"Image Update Automation",[39,196,197],{},"Kustomize for Kubernetes manifests",[62,199,111],{"id":200},"key-features-1",[36,202,203,206,209],{},[39,204,205],{},"Automatic deployment of new container images",[39,207,208],{},"Git repository as the single source of truth",[39,210,211],{},"Kubernetes manifest management",[62,213,215],{"id":214},"configuration","Configuration",[15,217,218],{},"Flux is configured to watch the ECR repository for new images and automatically update the Kubernetes deployments.",[28,220,222],{"id":221},"cicd-pipeline","CI/CD Pipeline",[15,224,225],{},"We use GitLab CI for continuous integration and deployment.",[62,227,229],{"id":228},"pipeline-stages","Pipeline Stages",[231,232,233,236,239,242,245,248],"ol",{},[39,234,235],{},"Validate",[39,237,238],{},"Init",[39,240,241],{},"Plan",[39,243,244],{},"Apply",[39,246,247],{},"Destroy",[39,249,250],{},"Post-apply (Flux bootstrap)",[62,252,111],{"id":253},"key-features-2",[36,255,256,259,262],{},[39,257,258],{},"Automatic Terraform plan and apply on changes to infrastructure code",[39,260,261],{},"Manual approval step for apply stage",[39,263,264],{},"Flux bootstrap after successful infrastructure updates",[62,266,215],{"id":267},"configuration-1",[15,269,270,271,274],{},"The CI/CD pipeline is defined in ",[74,272,273],{},".gitlab-ci.yml"," at the root of this repository.",[28,276,278],{"id":277},"application-details","Application Details",[15,280,281],{},"The counter application (in a separate repository) is a simple Python Flask app that:",[36,283,284,287,290],{},[39,285,286],{},"Counts POST and GET requests",[39,288,289],{},"Displays the current count",[39,291,292],{},"Shows the application version (to demonstrate live update)",[15,294,295],{},"The application is containerized and pushed to ECR, from where Flux picks up new versions for deployment.",[28,297,299],{"id":298},"accessing-the-application","Accessing the Application",[15,301,302],{},"After deployment, the application is accessible via the Contour ingress controller. The URL for accessing the application is:",[67,304,307],{"className":305,"code":306,"language":72},[70],"http://a6c503949052c42ad8bcd686137bc100-40713477.eu-west-1.elb.amazonaws.com/counter\n",[74,308,306],{"__ignoreMap":13},[15,310,311],{},"This URL is composed of the DNS name of the AWS Elastic Load Balancer created by the Contour ingress controller, followed by the '/counter' path.",[15,313,314],{},"Note: This URL may change if the Load Balancer is recreated. Always refer to the most recent ELB DNS name in your AWS console or infrastructure outputs.",[28,316,318],{"id":317},"versioning","Versioning",[15,320,321],{},"The application version is injected at build time and displayed on the web interface. This helps in identifying which version of the application is currently deployed.",[28,323,325],{"id":324},"security-considerations","Security Considerations",[36,327,328,331,334],{},[39,329,330],{},"EKS cluster uses IAM roles for service accounts (IRSA)",[39,332,333],{},"Least privilege principle applied to IAM roles",[39,335,336],{},"Network policies and security groups restrict access",[28,338,340],{"id":339},"monitoring-and-logging","Monitoring and Logging",[15,342,343],{},"Our application and infrastructure can be monitored through various methods:",[62,345,347],{"id":346},"application-monitoring","Application Monitoring",[36,349,350],{},[39,351,352,356],{},[353,354,355],"strong",{},"UI Counter Tracking",": Monitor the increase in counters directly through the application's user interface. This provides a real-time view of application usage.",[62,358,360],{"id":359},"image-updates","Image Updates",[36,362,363],{},[39,364,365,368,369,375],{},[353,366,367],{},"Flux Image Policy",": Use the following command to check the latest image update detected by Flux:\n",[67,370,373],{"className":371,"code":372,"language":72},[70],"flux get image policy\n",[74,374,372],{"__ignoreMap":13},"\nThis command shows which image versions Flux is aware of and which one it considers the latest.",[62,377,379],{"id":378},"pod-information","Pod Information",[36,381,382],{},[39,383,384,387,388,394,395,398,399,405],{},[353,385,386],{},"Kubernetes Pod Details",": To get information about the currently running pod, including the image version in use, use the following kubectl command:\n",[67,389,392],{"className":390,"code":391,"language":72},[70],"kubectl describe pod -n counter-service \u003Cpod-name>\n",[74,393,391],{"__ignoreMap":13},"\nReplace ",[74,396,397],{},"\u003Cpod-name>"," with the actual name of your pod. For example:\n",[67,400,403],{"className":401,"code":402,"language":72},[70],"kubectl describe pod -n counter-service counter-service-f5f75fc69-5wd2k\n",[74,404,402],{"__ignoreMap":13},"\nThis command provides detailed information about the pod, including which image version is currently deployed.",[28,407,409],{"id":408},"future-enhancements-and-notes","Future Enhancements and Notes",[15,411,412],{},"As we continue to develop and improve this project, we've identified several areas for future enhancements and some important notes:",[62,414,416],{"id":415},"infrastructure-and-gitops","Infrastructure and GitOps",[36,418,419,425],{},[39,420,421,424],{},[353,422,423],{},"FluxCD as a Module",": Implement FluxCD as an additional Terraform module instead of installing it within the CI pipeline. This would provide better management and versioning of the GitOps tooling.",[39,426,427,430],{},[353,428,429],{},"CI Pipeline Structure",": Further refine the CI stages to create a more logical separation between the Terraform steps and Flux operations. This could improve pipeline clarity and maintainability.",[62,432,434],{"id":433},"cicd-improvements","CI/CD Improvements",[36,436,437],{},[39,438,439,442],{},[353,440,441],{},"Merge Request Approvals",": Implement additional merge request approvals and other GitLab approval processes to enhance code quality and security.",[444,445,446],"style",{},"html pre.shiki code .sCWj5, html code.shiki .sCWj5{--shiki-default:#88C0D0;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .siq7d, html code.shiki .siq7d{--shiki-default:#A3BE8C;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sNHwn, html code.shiki .sNHwn{--shiki-default:#88C0D0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":13,"searchDepth":155,"depth":155,"links":448},[449,452,457,462,467,468,469,470,471,476],{"id":30,"depth":155,"text":31,"children":450},[451],{"id":64,"depth":168,"text":65},{"id":78,"depth":155,"text":79,"children":453},[454,455,456],{"id":85,"depth":168,"text":86},{"id":110,"depth":168,"text":111},{"id":128,"depth":168,"text":129},{"id":178,"depth":155,"text":179,"children":458},[459,460,461],{"id":185,"depth":168,"text":186},{"id":200,"depth":168,"text":111},{"id":214,"depth":168,"text":215},{"id":221,"depth":155,"text":222,"children":463},[464,465,466],{"id":228,"depth":168,"text":229},{"id":253,"depth":168,"text":111},{"id":267,"depth":168,"text":215},{"id":277,"depth":155,"text":278},{"id":298,"depth":155,"text":299},{"id":317,"depth":155,"text":318},{"id":324,"depth":155,"text":325},{"id":339,"depth":155,"text":340,"children":472},[473,474,475],{"id":346,"depth":168,"text":347},{"id":359,"depth":168,"text":360},{"id":378,"depth":168,"text":379},{"id":408,"depth":155,"text":409,"children":477},[478,479],{"id":415,"depth":168,"text":416},{"id":433,"depth":168,"text":434},"./cd.png","2024-08-06T08:00:00.000Z",false,null,"md","IaC, Infra, AWS, EKS, Terraform, Terragrunt, FluxCD, GitLab",{"published":487},true,"/blog/2024/08/06/tf-tg-flux-eks",{"title":5,"description":13},"tf-tg-flux-eks","blog/2024/08/06/tf-tg-flux-eks",[493,494,495,496,497,498,499,500],"IaC","Infra","AWS","EKS","Terraform","Terragrunt","FluxCD","GitLab","iQMUr0D9yZDXUPKSEgcLleE6IMzJWyAxM5yjkryFUvU",[503,2117,4778],{"id":504,"title":505,"author":6,"body":506,"cover":2103,"date":2104,"description":510,"draft":482,"excerpt":483,"extension":484,"github":517,"keywords":2105,"meta":2106,"navigation":487,"path":2107,"seo":2108,"shortDesc":483,"slug":2109,"stem":2110,"tags":2111,"video":483,"__hash__":2116},"blog/blog/2023/12/17/ci-cd-github-actions-flux-helm.md","GitHub Actions FluxCD & Helm",{"type":8,"value":507,"toc":2087},[508,511,519,523,526,537,540,551,555,564,573,600,603,606,723,727,757,782,790,793,809,812,815,823,827,830,854,879,883,904,907,945,947,965,969,978,1109,1113,1116,1198,1202,1209,1332,1336,1339,1356,1360,1363,1371,1527,1531,1534,1539,1632,1702,1864,1869,2084],[15,509,510],{},"In the upcoming blog post, we will implement continuous integration and deployment with Helm and some GitOps characteristics",[11,512,513],{"type":13},[15,514,515],{},[18,516,23],{"href":517,"rel":518},"https://github.com/devozs/maven-hello-world",[22],[28,520,522],{"id":521},"guidelines","Guidelines",[15,524,525],{},"The primary focus of this blog post is to explore and showcase three key topics:",[231,527,528,531,534],{},[39,529,530],{},"Utilizing GitHub Actions Workflow",[39,532,533],{},"Implementing deployment through Helm, with an emphasis on basic templating techniques",[39,535,536],{},"Employing FluxCD for deployment and its integration with the HelmRelease resource and Image Automation",[15,538,539],{},"Considering that the blog post serves as an illustrative example, it's important to note that there are additional aspects of Continuous Integration (CI) and Continuous Deployment (CD) that are not covered in detail here. For instance, in the realm of CI, aspects such as testing methodologies and strategies play a crucial role. Similarly, in the CD complex processes within the workflow are also beyond the scope of this example.",[11,541,543],{"type":542},"warning",[15,544,545,546],{},"Make sure to install ",[18,547,550],{"href":548,"rel":549},"https://fluxcd.io/flux/installation/",[22],"FluxCD CLI and other prerequisites ",[28,552,554],{"id":553},"repository-structure","Repository Structure",[15,556,557,558,563],{},"There are several ways to structure FluxCD repository ",[18,559,562],{"href":560,"rel":561},"https://fluxcd.io/flux/guides/repository-structure/",[22],"More information can be found here",".\nFor the sake of simplicity in this tutorial, we will utilize a monorepo approach, consolidating all Kubernetes manifests within a single Git repository.",[15,565,566,567,572],{},"This is a simple Java Maven repository that was forked from ",[18,568,571],{"href":569,"rel":570},"https://github.com/ido83/maven-hello-world/",[22],"here"," and on top of it we`ve added",[231,574,575,578,597],{},[39,576,577],{},"Dockerfile with simple multistage",[39,579,580,581],{},"Two ways of deployment\n",[231,582,583,586],{},[39,584,585],{},"Kubectl and Helm CLIs",[39,587,588,589],{},"FluxCD\n",[231,590,591,594],{},[39,592,593],{},"Using HelmRelease",[39,595,596],{},"Using Flux Image Controller / Policy",[39,598,599],{},"The above are orchestrated as CI and CD via GitHub Action Workflow",[15,601,602],{},"Our repository is structured in a manner of a monorepo, yet it has been simplified for the purposes of this example. This streamlined approach retains the core characteristics of a monorepo while ensuring ease of understanding and accessibility for demonstration purposes.",[15,604,605],{},"High level structure:",[67,607,609],{"className":135,"code":608,"language":137,"meta":13,"style":13},"├── myapp (Java, Maven and Docker)\n└── deployment\n    ├── myapp-chart (Helm Chart)\n    └── flux\n        ├── apps\n        │   └── base\n        ├── infrastructure\n        │   └── dev\n        └── clusters\n            └── dev\n",[74,610,611,634,642,658,667,676,688,696,706,715],{"__ignoreMap":13},[141,612,613,616,619,623,626,629,632],{"class":143,"line":144},[141,614,615],{"class":158},"├──",[141,617,618],{"class":151}," myapp",[141,620,622],{"class":621},"sw3Zv"," (Java, ",[141,624,625],{"class":151},"Maven",[141,627,628],{"class":151}," and",[141,630,631],{"class":151}," Docker",[141,633,49],{"class":621},[141,635,636,639],{"class":143,"line":155},[141,637,638],{"class":158},"└──",[141,640,641],{"class":151}," deployment\n",[141,643,644,647,650,653,656],{"class":143,"line":168},[141,645,646],{"class":158},"    ├──",[141,648,649],{"class":151}," myapp-chart",[141,651,652],{"class":621}," (Helm ",[141,654,655],{"class":151},"Chart",[141,657,49],{"class":621},[141,659,661,664],{"class":143,"line":660},4,[141,662,663],{"class":158},"    └──",[141,665,666],{"class":151}," flux\n",[141,668,670,673],{"class":143,"line":669},5,[141,671,672],{"class":158},"        ├──",[141,674,675],{"class":151}," apps\n",[141,677,679,682,685],{"class":143,"line":678},6,[141,680,681],{"class":158},"        │",[141,683,684],{"class":151},"   └──",[141,686,687],{"class":151}," base\n",[141,689,691,693],{"class":143,"line":690},7,[141,692,672],{"class":158},[141,694,695],{"class":151}," infrastructure\n",[141,697,699,701,703],{"class":143,"line":698},8,[141,700,681],{"class":158},[141,702,684],{"class":151},[141,704,705],{"class":151}," dev\n",[141,707,709,712],{"class":143,"line":708},9,[141,710,711],{"class":158},"        └──",[141,713,714],{"class":151}," clusters\n",[141,716,718,721],{"class":143,"line":717},10,[141,719,720],{"class":158},"            └──",[141,722,705],{"class":151},[62,724,726],{"id":725},"github-workflow","GitHub Workflow",[15,728,729,730,736,737,742,743,748,749,756],{},"We've breaken our pipline into three GitHub Action jobs): ",[731,732,733],"em",{},[353,734,735],{},"app-build",", ",[731,738,739],{},[353,740,741],{},"docker-build"," and ",[731,744,745],{},[353,746,747],{},"deployment",".\nRefer to the workflow yaml located at ",[18,750,753],{"href":751,"rel":752},"https://github.com/devozs/maven-hello-world/blob/master/.github/workflows/myapp-workflow.yaml",[22],[74,754,755],{},".github/workflows/myapp-workflow.yaml"," for detailed information about the jobs and steps.\nNote: In case you want to run it on your repository make sure to create PAT in order to get repository access (same as describe below for setting GITHUB_TOKEN in order to locally run FluxCD)",[36,758,759,765,768],{},[39,760,761,762],{},"app-build: Java build using Maven. i.e. ",[74,763,764],{},"mvn clean package",[39,766,767],{},"docker-build: In this phase, we build the container using the Dockerfile, just for the example the Dockerfile includes multilayer. This job stars running only after a succesful complition of app-build phase.",[39,769,770,771],{},"deployment: triggering three independent jobs:\n",[36,772,773,776,779],{},[39,774,775],{},"Simple docker run",[39,777,778],{},"Kind cluster installation and Helm CLI (using the utility script)",[39,780,781],{},"Kind cluster installation and FluxCD bootstrap (using the utility script)",[15,783,784,789],{},[785,786],"img",{"alt":787,"src":788,"title":787},"GitHub Action Summary","/images/blog/2023/12/17/github-action-diagram.png","\nAt the buttom of the image you can see the logs of Helm CLI & FluxCD bootstrap steps (printing out the POD logs as explianed below).",[15,791,792],{},"Note: The repository also demostrate some branch protection:",[36,794,795,798],{},[39,796,797],{},"Require a pull request & approvals before merging",[39,799,800,801,803,804],{},"Require status checks to pass before merging, it will run the ",[74,802,735],{}," as part of the pull request\n",[785,805],{"alt":806,"src":807,"title":808},"GitHub Branch Protection","/images/blog/2023/12/17/brach-protection.png","GitHub Action List",[28,810,811],{"id":747},"Deployment",[15,813,814],{},"For your convinence you can use two utlity scripts:",[231,816,817,820],{},[39,818,819],{},"setup.sh - Setup the required softwares (the same script called during the CI/CD workflow)",[39,821,822],{},"deploy.sh - Automate the deployment proccess for both options: Kubectl & Help CLIs as well as using FluxCD",[62,824,826],{"id":825},"using-kubectl-and-helm-cli","Using Kubectl and Helm CLI",[15,828,829],{},"Executing the script:",[67,831,833],{"className":135,"code":832,"language":137,"meta":13,"style":13},"cd deployment\n./deploy.sh -v 1.0.0\n",[74,834,835,841],{"__ignoreMap":13},[141,836,837,839],{"class":143,"line":144},[141,838,148],{"class":147},[141,840,641],{"class":151},[141,842,843,846,850],{"class":143,"line":155},[141,844,845],{"class":158},"./deploy.sh",[141,847,849],{"class":848},"sqTyp"," -v",[141,851,853],{"class":852},"sX_qU"," 1.0.0\n",[15,855,856,857,862,863,866,867,870,871,874,875,878],{},"The script will install ",[18,858,861],{"href":859,"rel":860},"https://kind.sigs.k8s.io//",[22],"KIND Cluster"," and once the cluster is ready it will start the deployment using Helm Chart located at ",[74,864,865],{},"deployment/myapp-chart"," using ",[74,868,869],{},"values-dev.yaml"," templating as well as ",[74,872,873],{},"--set image.tag=${VERSION}"," as was set using the ",[74,876,877],{},"-v"," flag.",[62,880,882],{"id":881},"using-fluxcd","Using FluxCD",[11,884,885,893],{"type":542},[15,886,887,888],{},"Make to create and set ",[18,889,892],{"href":890,"rel":891},"https://fluxcd.io/flux/installation/bootstrap/github/",[22],"GITHUB_TOKEN ",[894,895,896],"template",{"v-slot:details":13},[15,897,898,899],{},"Or if you are using different Git server follow the ",[18,900,903],{"href":901,"rel":902},"https://fluxcd.io/flux/installation/bootstrap/",[22],"bootstrap documentation",[15,905,906],{},"You`ll need to set the both GITHUB_TOKEN & GITHUB_USER, it will be used by the utitlity script for FluxCD bootstrap command:",[67,908,910],{"className":135,"code":909,"language":137,"meta":13,"style":13},"export GITHUB_TOKEN=\u003CYOUR_PAT>\nexport GITHUB_USER=\u003CYOUR_GH_USER>\n",[74,911,912,931],{"__ignoreMap":13},[141,913,914,918,922,925,928],{"class":143,"line":144},[141,915,917],{"class":916},"s4BcI","export",[141,919,921],{"class":920},"sn_7u"," GITHUB_TOKEN",[141,923,924],{"class":916},"=\u003C",[141,926,927],{"class":920},"YOUR_PAT",[141,929,930],{"class":916},">\n",[141,932,933,935,938,940,943],{"class":143,"line":155},[141,934,917],{"class":916},[141,936,937],{"class":920}," GITHUB_USER",[141,939,924],{"class":916},[141,941,942],{"class":920},"YOUR_GH_USER",[141,944,930],{"class":916},[15,946,829],{},[67,948,950],{"className":135,"code":949,"language":137,"meta":13,"style":13},"cd deployment\n./deploy.sh --flux\n",[74,951,952,958],{"__ignoreMap":13},[141,953,954,956],{"class":143,"line":144},[141,955,148],{"class":147},[141,957,641],{"class":151},[141,959,960,962],{"class":143,"line":155},[141,961,845],{"class":158},[141,963,964],{"class":848}," --flux\n",[62,966,968],{"id":967},"verify-flux-pods","Verify Flux PODs",[15,970,971,972,977],{},"The following pods should be running on ",[731,973,974],{},[353,975,976],{},"flux-system"," namespace",[67,979,981],{"className":135,"code":980,"language":137,"meta":13,"style":13},"kubectl get pod -n flux-system\n\nNAME                                           READY   STATUS    RESTARTS   AGE\nhelm-controller-69dbf9568-tp4x6                1/1     Running   0          2m5s\nimage-automation-controller-6bbc947558-h82k6   1/1     Running   0          2m5s\nimage-reflector-controller-7c49fdc68f-skrjs    1/1     Running   0          2m5s\nkustomize-controller-77bf676476-cj5rr          1/1     Running   0          2m5s\nnotification-controller-7bb6d7684d-k9s9l       1/1     Running   0          2m5s\nsource-controller-5996567c74-kt5nt             1/1     Running   0          2m5s\n",[74,982,983,1000,1005,1022,1039,1053,1067,1081,1095],{"__ignoreMap":13},[141,984,985,988,991,994,997],{"class":143,"line":144},[141,986,987],{"class":158},"kubectl",[141,989,990],{"class":151}," get",[141,992,993],{"class":151}," pod",[141,995,996],{"class":848}," -n",[141,998,999],{"class":151}," flux-system\n",[141,1001,1002],{"class":143,"line":155},[141,1003,1004],{"emptyLinePlaceholder":487},"\n",[141,1006,1007,1010,1013,1016,1019],{"class":143,"line":168},[141,1008,1009],{"class":158},"NAME",[141,1011,1012],{"class":151},"                                           READY",[141,1014,1015],{"class":151},"   STATUS",[141,1017,1018],{"class":151},"    RESTARTS",[141,1020,1021],{"class":151},"   AGE\n",[141,1023,1024,1027,1030,1033,1036],{"class":143,"line":660},[141,1025,1026],{"class":158},"helm-controller-69dbf9568-tp4x6",[141,1028,1029],{"class":151},"                1/1",[141,1031,1032],{"class":151},"     Running",[141,1034,1035],{"class":852},"   0",[141,1037,1038],{"class":151},"          2m5s\n",[141,1040,1041,1044,1047,1049,1051],{"class":143,"line":669},[141,1042,1043],{"class":158},"image-automation-controller-6bbc947558-h82k6",[141,1045,1046],{"class":151},"   1/1",[141,1048,1032],{"class":151},[141,1050,1035],{"class":852},[141,1052,1038],{"class":151},[141,1054,1055,1058,1061,1063,1065],{"class":143,"line":678},[141,1056,1057],{"class":158},"image-reflector-controller-7c49fdc68f-skrjs",[141,1059,1060],{"class":151},"    1/1",[141,1062,1032],{"class":151},[141,1064,1035],{"class":852},[141,1066,1038],{"class":151},[141,1068,1069,1072,1075,1077,1079],{"class":143,"line":690},[141,1070,1071],{"class":158},"kustomize-controller-77bf676476-cj5rr",[141,1073,1074],{"class":151},"          1/1",[141,1076,1032],{"class":151},[141,1078,1035],{"class":852},[141,1080,1038],{"class":151},[141,1082,1083,1086,1089,1091,1093],{"class":143,"line":698},[141,1084,1085],{"class":158},"notification-controller-7bb6d7684d-k9s9l",[141,1087,1088],{"class":151},"       1/1",[141,1090,1032],{"class":151},[141,1092,1035],{"class":852},[141,1094,1038],{"class":151},[141,1096,1097,1100,1103,1105,1107],{"class":143,"line":708},[141,1098,1099],{"class":158},"source-controller-5996567c74-kt5nt",[141,1101,1102],{"class":151},"             1/1",[141,1104,1032],{"class":151},[141,1106,1035],{"class":852},[141,1108,1038],{"class":151},[62,1110,1112],{"id":1111},"exploring-flux-kustomizations","Exploring Flux Kustomizations",[15,1114,1115],{},"Flux manage the deployment and its dependencies using a kustomization resource.\nTo watch the kustomizations list and thier status:",[67,1117,1119],{"className":135,"code":1118,"language":137,"meta":13,"style":13},"flux get kustomizations\n\nNAME                REVISION            SUSPENDED   READY   MESSAGE                              \nflux-system         master@sha1:d27dac72    False       True    Applied revision: master@sha1:d27dac72  \nmyapp-dev           master@sha1:d27dac72    False       True    Applied revision: master@sha1:d27dac72  \n",[74,1120,1121,1131,1135,1154,1179],{"__ignoreMap":13},[141,1122,1123,1126,1128],{"class":143,"line":144},[141,1124,1125],{"class":158},"flux",[141,1127,990],{"class":151},[141,1129,1130],{"class":151}," kustomizations\n",[141,1132,1133],{"class":143,"line":155},[141,1134,1004],{"emptyLinePlaceholder":487},[141,1136,1137,1139,1142,1145,1148,1151],{"class":143,"line":168},[141,1138,1009],{"class":158},[141,1140,1141],{"class":151},"                REVISION",[141,1143,1144],{"class":151},"            SUSPENDED",[141,1146,1147],{"class":151},"   READY",[141,1149,1150],{"class":151},"   MESSAGE",[141,1152,1153],{"class":621},"                              \n",[141,1155,1156,1158,1161,1164,1167,1170,1173,1176],{"class":143,"line":660},[141,1157,976],{"class":158},[141,1159,1160],{"class":151},"         master@sha1:d27dac72",[141,1162,1163],{"class":151},"    False",[141,1165,1166],{"class":151},"       True",[141,1168,1169],{"class":151},"    Applied",[141,1171,1172],{"class":151}," revision:",[141,1174,1175],{"class":151}," master@sha1:d27dac72",[141,1177,1178],{"class":621},"  \n",[141,1180,1181,1184,1187,1189,1191,1193,1195],{"class":143,"line":669},[141,1182,1183],{"class":158},"myapp-dev",[141,1185,1186],{"class":151},"           master@sha1:d27dac72",[141,1188,1163],{"class":151},[141,1190,1166],{"class":151},[141,1192,1169],{"class":151},[141,1194,1172],{"class":151},[141,1196,1197],{"class":151}," master@sha1:d27dac72\n",[62,1199,1201],{"id":1200},"checking-the-logs","Checking the logs",[15,1203,1204,1205,1208],{},"Once the deployment is done, the script will get the POD i.e. ",[74,1206,1207],{},"myapp-6fc4d44c75-4jpvg"," logs and pring it out.",[67,1210,1212],{"className":135,"code":1211,"language":137,"meta":13,"style":13},"Starts new deployment...\nVersion: Managed By FluxCD\nDeploy using FluxCD\n\ndeployment \"myapp\" successfully rolled out\nPOD Image Details:\nImage: devozs/myapp:1.0.0\nImage ID: docker.io/devozs/myapp@sha256:0ac0962589fa30ca8d09f073a33fe7791359a295324aa237e2c5b6980f848415\nPOD Logs:\nHello World! DevOzs\nDeployment Done\n",[74,1213,1214,1225,1239,1249,1253,1276,1287,1295,1306,1313,1324],{"__ignoreMap":13},[141,1215,1216,1219,1222],{"class":143,"line":144},[141,1217,1218],{"class":158},"Starts",[141,1220,1221],{"class":151}," new",[141,1223,1224],{"class":151}," deployment...\n",[141,1226,1227,1230,1233,1236],{"class":143,"line":155},[141,1228,1229],{"class":158},"Version:",[141,1231,1232],{"class":151}," Managed",[141,1234,1235],{"class":151}," By",[141,1237,1238],{"class":151}," FluxCD\n",[141,1240,1241,1244,1247],{"class":143,"line":168},[141,1242,1243],{"class":158},"Deploy",[141,1245,1246],{"class":151}," using",[141,1248,1238],{"class":151},[141,1250,1251],{"class":143,"line":660},[141,1252,1004],{"emptyLinePlaceholder":487},[141,1254,1255,1257,1261,1264,1267,1270,1273],{"class":143,"line":669},[141,1256,747],{"class":158},[141,1258,1260],{"class":1259},"sQE_P"," \"",[141,1262,1263],{"class":151},"myapp",[141,1265,1266],{"class":1259},"\"",[141,1268,1269],{"class":151}," successfully",[141,1271,1272],{"class":151}," rolled",[141,1274,1275],{"class":151}," out\n",[141,1277,1278,1281,1284],{"class":143,"line":678},[141,1279,1280],{"class":158},"POD",[141,1282,1283],{"class":151}," Image",[141,1285,1286],{"class":151}," Details:\n",[141,1288,1289,1292],{"class":143,"line":690},[141,1290,1291],{"class":158},"Image:",[141,1293,1294],{"class":151}," devozs/myapp:1.0.0\n",[141,1296,1297,1300,1303],{"class":143,"line":698},[141,1298,1299],{"class":158},"Image",[141,1301,1302],{"class":151}," ID:",[141,1304,1305],{"class":151}," docker.io/devozs/myapp@sha256:0ac0962589fa30ca8d09f073a33fe7791359a295324aa237e2c5b6980f848415\n",[141,1307,1308,1310],{"class":143,"line":708},[141,1309,1280],{"class":158},[141,1311,1312],{"class":151}," Logs:\n",[141,1314,1315,1318,1321],{"class":143,"line":717},[141,1316,1317],{"class":158},"Hello",[141,1319,1320],{"class":151}," World!",[141,1322,1323],{"class":151}," DevOzs\n",[141,1325,1327,1329],{"class":143,"line":1326},11,[141,1328,811],{"class":158},[141,1330,1331],{"class":151}," Done\n",[62,1333,1335],{"id":1334},"secrets","Secrets",[15,1337,1338],{},"In this tutorial, we haven't utilized a secret manager like Azure Key Vault or any other valut. In case you need to use secrets (i.e when using Flux Image Repository with private regitry) make sure not to keep your secrets in Git.",[11,1340,1342,1345],{"type":1341},"error",[15,1343,1344],{},"Make sure not to put your kubernetes secrets in Git",[894,1346,1347],{"v-slot:details":13},[15,1348,1349,1350,1355],{},"For testing purpuse you can add them to gitignore. Permenant solution would be to use key vault or other solution like sealed-secrets (",[18,1351,1354],{"href":1352,"rel":1353},"https://fluxcd.io/flux/guides/sealed-secrets/",[22],"works well with FluxCD",")",[62,1357,1359],{"id":1358},"docker-pull-secret","Docker Pull Secret",[15,1361,1362],{},"In case you are workign with images from private registry, Docker pull secret is will used in two ways:",[36,1364,1365,1368],{},[39,1366,1367],{},"Pull the deployment image from Github registry",[39,1369,1370],{},"FluxCD uses it to fetch new tags from Github registry",[67,1372,1376],{"className":1373,"code":1374,"language":1375,"meta":13,"style":13},"language-yaml shiki shiki-themes nord github-dark monokai","apiVersion: v1\nkind: Secret\nmetadata:\n  name: cr-secret\n  namespace: flux-system\ntype: kubernetes.io/dockerconfigjson\ndata:\n  .dockerconfigjson: \u003CPUT_YOURS>\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: cr-secret\n  namespace: dev\ntype: kubernetes.io/dockerconfigjson\ndata:\n  .dockerconfigjson: \u003CPUT_YOURS>\n","yaml",[74,1377,1378,1391,1401,1409,1419,1428,1438,1445,1455,1461,1469,1477,1484,1493,1502,1511,1518],{"__ignoreMap":13},[141,1379,1380,1384,1388],{"class":143,"line":144},[141,1381,1383],{"class":1382},"skFRX","apiVersion",[141,1385,1387],{"class":1386},"sUaCP",":",[141,1389,1390],{"class":151}," v1\n",[141,1392,1393,1396,1398],{"class":143,"line":155},[141,1394,1395],{"class":1382},"kind",[141,1397,1387],{"class":1386},[141,1399,1400],{"class":151}," Secret\n",[141,1402,1403,1406],{"class":143,"line":168},[141,1404,1405],{"class":1382},"metadata",[141,1407,1408],{"class":1386},":\n",[141,1410,1411,1414,1416],{"class":143,"line":660},[141,1412,1413],{"class":1382},"  name",[141,1415,1387],{"class":1386},[141,1417,1418],{"class":151}," cr-secret\n",[141,1420,1421,1424,1426],{"class":143,"line":669},[141,1422,1423],{"class":1382},"  namespace",[141,1425,1387],{"class":1386},[141,1427,999],{"class":151},[141,1429,1430,1433,1435],{"class":143,"line":678},[141,1431,1432],{"class":1382},"type",[141,1434,1387],{"class":1386},[141,1436,1437],{"class":151}," kubernetes.io/dockerconfigjson\n",[141,1439,1440,1443],{"class":143,"line":690},[141,1441,1442],{"class":1382},"data",[141,1444,1408],{"class":1386},[141,1446,1447,1450,1452],{"class":143,"line":698},[141,1448,1449],{"class":1382},"  .dockerconfigjson",[141,1451,1387],{"class":1386},[141,1453,1454],{"class":151}," \u003CPUT_YOURS>\n",[141,1456,1457],{"class":143,"line":708},[141,1458,1460],{"class":1459},"siby6","---\n",[141,1462,1463,1465,1467],{"class":143,"line":717},[141,1464,1383],{"class":1382},[141,1466,1387],{"class":1386},[141,1468,1390],{"class":151},[141,1470,1471,1473,1475],{"class":143,"line":1326},[141,1472,1395],{"class":1382},[141,1474,1387],{"class":1386},[141,1476,1400],{"class":151},[141,1478,1480,1482],{"class":143,"line":1479},12,[141,1481,1405],{"class":1382},[141,1483,1408],{"class":1386},[141,1485,1487,1489,1491],{"class":143,"line":1486},13,[141,1488,1413],{"class":1382},[141,1490,1387],{"class":1386},[141,1492,1418],{"class":151},[141,1494,1496,1498,1500],{"class":143,"line":1495},14,[141,1497,1423],{"class":1382},[141,1499,1387],{"class":1386},[141,1501,705],{"class":151},[141,1503,1505,1507,1509],{"class":143,"line":1504},15,[141,1506,1432],{"class":1382},[141,1508,1387],{"class":1386},[141,1510,1437],{"class":151},[141,1512,1514,1516],{"class":143,"line":1513},16,[141,1515,1442],{"class":1382},[141,1517,1408],{"class":1386},[141,1519,1521,1523,1525],{"class":143,"line":1520},17,[141,1522,1449],{"class":1382},[141,1524,1387],{"class":1386},[141,1526,1454],{"class":151},[62,1528,1530],{"id":1529},"the-fluxcd-magic","The FluxCD Magic 🪄",[15,1532,1533],{},"We are using two powerful Flux capabilities:",[36,1535,1536],{},[39,1537,1538],{},"Listen to new images in a certian repository and given pattern",[67,1540,1542],{"className":1373,"code":1541,"language":1375,"meta":13,"style":13},"apiVersion: image.toolkit.fluxcd.io/v1beta1\nkind: ImagePolicy\nmetadata:\n  name: myapp\n  namespace: flux-system\nspec:\n  imageRepositoryRef:\n    name: myapp\n  policy:\n    semver:\n      range: 1.0.x\n",[74,1543,1544,1553,1562,1568,1577,1585,1592,1599,1608,1615,1622],{"__ignoreMap":13},[141,1545,1546,1548,1550],{"class":143,"line":144},[141,1547,1383],{"class":1382},[141,1549,1387],{"class":1386},[141,1551,1552],{"class":151}," image.toolkit.fluxcd.io/v1beta1\n",[141,1554,1555,1557,1559],{"class":143,"line":155},[141,1556,1395],{"class":1382},[141,1558,1387],{"class":1386},[141,1560,1561],{"class":151}," ImagePolicy\n",[141,1563,1564,1566],{"class":143,"line":168},[141,1565,1405],{"class":1382},[141,1567,1408],{"class":1386},[141,1569,1570,1572,1574],{"class":143,"line":660},[141,1571,1413],{"class":1382},[141,1573,1387],{"class":1386},[141,1575,1576],{"class":151}," myapp\n",[141,1578,1579,1581,1583],{"class":143,"line":669},[141,1580,1423],{"class":1382},[141,1582,1387],{"class":1386},[141,1584,999],{"class":151},[141,1586,1587,1590],{"class":143,"line":678},[141,1588,1589],{"class":1382},"spec",[141,1591,1408],{"class":1386},[141,1593,1594,1597],{"class":143,"line":690},[141,1595,1596],{"class":1382},"  imageRepositoryRef",[141,1598,1408],{"class":1386},[141,1600,1601,1604,1606],{"class":143,"line":698},[141,1602,1603],{"class":1382},"    name",[141,1605,1387],{"class":1386},[141,1607,1576],{"class":151},[141,1609,1610,1613],{"class":143,"line":708},[141,1611,1612],{"class":1382},"  policy",[141,1614,1408],{"class":1386},[141,1616,1617,1620],{"class":143,"line":717},[141,1618,1619],{"class":1382},"    semver",[141,1621,1408],{"class":1386},[141,1623,1624,1627,1629],{"class":143,"line":1326},[141,1625,1626],{"class":1382},"      range",[141,1628,1387],{"class":1386},[141,1630,1631],{"class":151}," 1.0.x\n",[67,1633,1635],{"className":1373,"code":1634,"language":1375,"meta":13,"style":13},"apiVersion: image.toolkit.fluxcd.io/v1beta1\nkind: ImageRepository\nmetadata:\n  name: myapp\n  namespace: flux-system\nspec:\n  image: devozs/myapp\n  interval: 1m0s\n\n",[74,1636,1637,1645,1654,1660,1668,1676,1682,1692],{"__ignoreMap":13},[141,1638,1639,1641,1643],{"class":143,"line":144},[141,1640,1383],{"class":1382},[141,1642,1387],{"class":1386},[141,1644,1552],{"class":151},[141,1646,1647,1649,1651],{"class":143,"line":155},[141,1648,1395],{"class":1382},[141,1650,1387],{"class":1386},[141,1652,1653],{"class":151}," ImageRepository\n",[141,1655,1656,1658],{"class":143,"line":168},[141,1657,1405],{"class":1382},[141,1659,1408],{"class":1386},[141,1661,1662,1664,1666],{"class":143,"line":660},[141,1663,1413],{"class":1382},[141,1665,1387],{"class":1386},[141,1667,1576],{"class":151},[141,1669,1670,1672,1674],{"class":143,"line":669},[141,1671,1423],{"class":1382},[141,1673,1387],{"class":1386},[141,1675,999],{"class":151},[141,1677,1678,1680],{"class":143,"line":678},[141,1679,1589],{"class":1382},[141,1681,1408],{"class":1386},[141,1683,1684,1687,1689],{"class":143,"line":690},[141,1685,1686],{"class":1382},"  image",[141,1688,1387],{"class":1386},[141,1690,1691],{"class":151}," devozs/myapp\n",[141,1693,1694,1697,1699],{"class":143,"line":698},[141,1695,1696],{"class":1382},"  interval",[141,1698,1387],{"class":1386},[141,1700,1701],{"class":151}," 1m0s\n",[67,1703,1705],{"className":135,"code":1704,"language":137,"meta":13,"style":13},"flux get image policy -A\nNAMESPACE   NAME    LATEST IMAGE        READY   MESSAGE                                                           \ndev         myapp   devozs/myapp:1.0.40 True    Latest image tag for 'devozs/myapp' updated from 1.0.39 to 1.0.40   \n\nflux get image repository   \nNAMESPACE   NAME    LAST SCAN                   SUSPENDED   READY   MESSAGE                        \ndev         myapp   2023-12-18T00:43:48+02:00   False       True    successful scan: found 41 tags  \n\n",[74,1706,1707,1722,1744,1796,1800,1813,1835],{"__ignoreMap":13},[141,1708,1709,1711,1713,1716,1719],{"class":143,"line":144},[141,1710,1125],{"class":158},[141,1712,990],{"class":151},[141,1714,1715],{"class":151}," image",[141,1717,1718],{"class":151}," policy",[141,1720,1721],{"class":848}," -A\n",[141,1723,1724,1727,1730,1733,1736,1739,1741],{"class":143,"line":155},[141,1725,1726],{"class":158},"NAMESPACE",[141,1728,1729],{"class":151},"   NAME",[141,1731,1732],{"class":151},"    LATEST",[141,1734,1735],{"class":151}," IMAGE",[141,1737,1738],{"class":151},"        READY",[141,1740,1150],{"class":151},[141,1742,1743],{"class":621},"                                                           \n",[141,1745,1746,1749,1752,1755,1758,1761,1763,1766,1769,1772,1775,1778,1781,1784,1787,1790,1793],{"class":143,"line":168},[141,1747,1748],{"class":158},"dev",[141,1750,1751],{"class":151},"         myapp",[141,1753,1754],{"class":151},"   devozs/myapp:1.0.40",[141,1756,1757],{"class":151}," True",[141,1759,1760],{"class":151},"    Latest",[141,1762,1715],{"class":151},[141,1764,1765],{"class":151}," tag",[141,1767,1768],{"class":151}," for",[141,1770,1771],{"class":1259}," '",[141,1773,1774],{"class":151},"devozs/myapp",[141,1776,1777],{"class":1259},"'",[141,1779,1780],{"class":151}," updated",[141,1782,1783],{"class":151}," from",[141,1785,1786],{"class":852}," 1.0.39",[141,1788,1789],{"class":151}," to",[141,1791,1792],{"class":852}," 1.0.40",[141,1794,1795],{"class":621},"   \n",[141,1797,1798],{"class":143,"line":660},[141,1799,1004],{"emptyLinePlaceholder":487},[141,1801,1802,1804,1806,1808,1811],{"class":143,"line":669},[141,1803,1125],{"class":158},[141,1805,990],{"class":151},[141,1807,1715],{"class":151},[141,1809,1810],{"class":151}," repository",[141,1812,1795],{"class":621},[141,1814,1815,1817,1819,1822,1825,1828,1830,1832],{"class":143,"line":678},[141,1816,1726],{"class":158},[141,1818,1729],{"class":151},[141,1820,1821],{"class":151},"    LAST",[141,1823,1824],{"class":151}," SCAN",[141,1826,1827],{"class":151},"                   SUSPENDED",[141,1829,1147],{"class":151},[141,1831,1150],{"class":151},[141,1833,1834],{"class":621},"                        \n",[141,1836,1837,1839,1841,1844,1847,1849,1852,1855,1858,1861],{"class":143,"line":690},[141,1838,1748],{"class":158},[141,1840,1751],{"class":151},[141,1842,1843],{"class":151},"   2023-12-18T00:43:48+02:00",[141,1845,1846],{"class":151},"   False",[141,1848,1166],{"class":151},[141,1850,1851],{"class":151},"    successful",[141,1853,1854],{"class":151}," scan:",[141,1856,1857],{"class":151}," found",[141,1859,1860],{"class":852}," 41",[141,1862,1863],{"class":151}," tags\n",[36,1865,1866],{},[39,1867,1868],{},"Update the resolved image tag in the relevant Kubernetes yaml (directly to the Deployment YAML or vie Kustomization YAML)",[67,1870,1872],{"className":1373,"code":1871,"language":1375,"meta":13,"style":13},"apiVersion: image.toolkit.fluxcd.io/v1beta1\nkind: ImageUpdateAutomation\nmetadata:\n  name: image-update-automation\n  namespace: flux-system\nspec:\n  interval: 1m10s\n  sourceRef:\n    kind: GitRepository\n    name: flux-system\n  git:\n    checkout:\n      ref:\n        branch: main\n    commit:\n      author:\n        email: fluxcdbot@users.noreply.github.com\n        name: fluxcdbot\n      messageTemplate: '{{range .Updated.Images}}{{println .}}{{end}}'\n    push:\n      branch: main\n  update:\n    path: ./gitops/clusters/dev\n    strategy: Setters\n",[74,1873,1874,1882,1891,1897,1906,1914,1920,1929,1936,1946,1954,1961,1968,1975,1985,1992,1999,2009,2020,2036,2044,2054,2062,2073],{"__ignoreMap":13},[141,1875,1876,1878,1880],{"class":143,"line":144},[141,1877,1383],{"class":1382},[141,1879,1387],{"class":1386},[141,1881,1552],{"class":151},[141,1883,1884,1886,1888],{"class":143,"line":155},[141,1885,1395],{"class":1382},[141,1887,1387],{"class":1386},[141,1889,1890],{"class":151}," ImageUpdateAutomation\n",[141,1892,1893,1895],{"class":143,"line":168},[141,1894,1405],{"class":1382},[141,1896,1408],{"class":1386},[141,1898,1899,1901,1903],{"class":143,"line":660},[141,1900,1413],{"class":1382},[141,1902,1387],{"class":1386},[141,1904,1905],{"class":151}," image-update-automation\n",[141,1907,1908,1910,1912],{"class":143,"line":669},[141,1909,1423],{"class":1382},[141,1911,1387],{"class":1386},[141,1913,999],{"class":151},[141,1915,1916,1918],{"class":143,"line":678},[141,1917,1589],{"class":1382},[141,1919,1408],{"class":1386},[141,1921,1922,1924,1926],{"class":143,"line":690},[141,1923,1696],{"class":1382},[141,1925,1387],{"class":1386},[141,1927,1928],{"class":151}," 1m10s\n",[141,1930,1931,1934],{"class":143,"line":698},[141,1932,1933],{"class":1382},"  sourceRef",[141,1935,1408],{"class":1386},[141,1937,1938,1941,1943],{"class":143,"line":708},[141,1939,1940],{"class":1382},"    kind",[141,1942,1387],{"class":1386},[141,1944,1945],{"class":151}," GitRepository\n",[141,1947,1948,1950,1952],{"class":143,"line":717},[141,1949,1603],{"class":1382},[141,1951,1387],{"class":1386},[141,1953,999],{"class":151},[141,1955,1956,1959],{"class":143,"line":1326},[141,1957,1958],{"class":1382},"  git",[141,1960,1408],{"class":1386},[141,1962,1963,1966],{"class":143,"line":1479},[141,1964,1965],{"class":1382},"    checkout",[141,1967,1408],{"class":1386},[141,1969,1970,1973],{"class":143,"line":1486},[141,1971,1972],{"class":1382},"      ref",[141,1974,1408],{"class":1386},[141,1976,1977,1980,1982],{"class":143,"line":1495},[141,1978,1979],{"class":1382},"        branch",[141,1981,1387],{"class":1386},[141,1983,1984],{"class":151}," main\n",[141,1986,1987,1990],{"class":143,"line":1504},[141,1988,1989],{"class":1382},"    commit",[141,1991,1408],{"class":1386},[141,1993,1994,1997],{"class":143,"line":1513},[141,1995,1996],{"class":1382},"      author",[141,1998,1408],{"class":1386},[141,2000,2001,2004,2006],{"class":143,"line":1520},[141,2002,2003],{"class":1382},"        email",[141,2005,1387],{"class":1386},[141,2007,2008],{"class":151}," fluxcdbot@users.noreply.github.com\n",[141,2010,2012,2015,2017],{"class":143,"line":2011},18,[141,2013,2014],{"class":1382},"        name",[141,2016,1387],{"class":1386},[141,2018,2019],{"class":151}," fluxcdbot\n",[141,2021,2023,2026,2028,2030,2033],{"class":143,"line":2022},19,[141,2024,2025],{"class":1382},"      messageTemplate",[141,2027,1387],{"class":1386},[141,2029,1771],{"class":1259},[141,2031,2032],{"class":151},"{{range .Updated.Images}}{{println .}}{{end}}",[141,2034,2035],{"class":1259},"'\n",[141,2037,2039,2042],{"class":143,"line":2038},20,[141,2040,2041],{"class":1382},"    push",[141,2043,1408],{"class":1386},[141,2045,2047,2050,2052],{"class":143,"line":2046},21,[141,2048,2049],{"class":1382},"      branch",[141,2051,1387],{"class":1386},[141,2053,1984],{"class":151},[141,2055,2057,2060],{"class":143,"line":2056},22,[141,2058,2059],{"class":1382},"  update",[141,2061,1408],{"class":1386},[141,2063,2065,2068,2070],{"class":143,"line":2064},23,[141,2066,2067],{"class":1382},"    path",[141,2069,1387],{"class":1386},[141,2071,2072],{"class":151}," ./gitops/clusters/dev\n",[141,2074,2076,2079,2081],{"class":143,"line":2075},24,[141,2077,2078],{"class":1382},"    strategy",[141,2080,1387],{"class":1386},[141,2082,2083],{"class":151}," Setters\n",[444,2085,2086],{},"html pre.shiki code .sNHwn, html code.shiki .sNHwn{--shiki-default:#88C0D0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .siq7d, html code.shiki .siq7d{--shiki-default:#A3BE8C;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sw3Zv, html code.shiki .sw3Zv{--shiki-default:#D8DEE9FF;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sCWj5, html code.shiki .sCWj5{--shiki-default:#88C0D0;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sqTyp, html code.shiki .sqTyp{--shiki-default:#A3BE8C;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sX_qU, html code.shiki .sX_qU{--shiki-default:#B48EAD;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s4BcI, html code.shiki .s4BcI{--shiki-default:#81A1C1;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sn_7u, html code.shiki .sn_7u{--shiki-default:#D8DEE9;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sQE_P, html code.shiki .sQE_P{--shiki-default:#ECEFF4;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .skFRX, html code.shiki .skFRX{--shiki-default:#8FBCBB;--shiki-dark:#85E89D;--shiki-sepia:#F92672}html pre.shiki code .sUaCP, html code.shiki .sUaCP{--shiki-default:#ECEFF4;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siby6, html code.shiki .siby6{--shiki-default:#D8DEE9FF;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}",{"title":13,"searchDepth":155,"depth":155,"links":2088},[2089,2090,2093],{"id":521,"depth":155,"text":522},{"id":553,"depth":155,"text":554,"children":2091},[2092],{"id":725,"depth":168,"text":726},{"id":747,"depth":155,"text":811,"children":2094},[2095,2096,2097,2098,2099,2100,2101,2102],{"id":825,"depth":168,"text":826},{"id":881,"depth":168,"text":882},{"id":967,"depth":168,"text":968},{"id":1111,"depth":168,"text":1112},{"id":1200,"depth":168,"text":1201},{"id":1334,"depth":168,"text":1335},{"id":1358,"depth":168,"text":1359},{"id":1529,"depth":168,"text":1530},"./workflow.png","2023-12-17T08:00:00.000Z","GitOps, CD, Deployment, FluxCD, GitHub, Helm",{"published":487},"/blog/2023/12/17/ci-cd-github-actions-flux-helm",{"title":505,"description":510},"ci-cd-github-actions-flux-helm","blog/2023/12/17/ci-cd-github-actions-flux-helm",[2112,2113,811,499,2114,2115],"GitOps","CD","GitHub","Helm","SG8llZBvfzEOyOM0OvjiCxhkwt7qRbDxYBC6X4od99U",{"id":2118,"title":2119,"author":6,"body":2120,"cover":480,"date":4769,"description":2124,"draft":482,"excerpt":483,"extension":484,"github":2131,"keywords":4770,"meta":4771,"navigation":487,"path":4772,"seo":4773,"shortDesc":483,"slug":4774,"stem":4775,"tags":4776,"video":483,"__hash__":4777},"blog/blog/2023/09/10/continuence-deployment-flux.md","Continuences Deployment FluxCD",{"type":8,"value":2121,"toc":4751},[2122,2125,2133,2135,2138,2141,2152,2155,2162,2164,2169,2172,2174,2239,2243,2281,2284,2344,2358,2375,2378,2944,2946,2952,3056,3058,3060,3172,3175,3275,3277,3286,3297,3299,3302,3309,3439,3443,3446,3455,3604,3608,3611,3659,3674,3676,3678,3682,3804,3885,4011,4015,4195,4273,4287,4545,4549,4569,4571,4629,4632,4641,4649,4748],[15,2123,2124],{},"In the upcoming blog post, we will implement continuous deployment with some GitOps characteristics, using this web application and AKS as our foundation.",[11,2126,2127],{"type":13},[15,2128,2129],{},[18,2130,23],{"href":2131,"rel":2132},"https://github.com/devozs/blog-deployment/tree/main/gitops",[22],[28,2134,522],{"id":521},[15,2136,2137],{},"In the previous tutorials, we set up the infrastructure (AKS via Terraform) and created a continuous integration workflow that builds a Node.js web application, containerizes it, and pushes the image to a container registry.",[15,2139,2140],{},"The key GitOps principles we aim to illustrate include:",[36,2142,2143,2146,2149],{},[39,2144,2145],{},"Storing deployment manifests in a Git repository.",[39,2147,2148],{},"Reconciling, pulling and applying changes within Kubernetes, rather than externally pushing changes into Kubernetes from a CD pipeline.",[39,2150,2151],{},"listen to new image versions and update the relevant manifet with the updated tag.",[15,2153,2154],{},"To accomplish this, we'll leverage FluxCD as our chosen GitOps tool. Within FluxCD, we will make use of several automation capabilities, including image policies, image automation, and more.",[11,2156,2157],{"type":542},[15,2158,545,2159],{},[18,2160,550],{"href":548,"rel":2161},[22],[28,2163,554],{"id":553},[15,2165,557,2166,563],{},[18,2167,562],{"href":560,"rel":2168},[22],[15,2170,2171],{},"This is what our repository looks like (made small changes in compare to FluxCD monorepo. Later on, after the setup and bootstraping, we will delve into various kustomizations and their correlation with the repository structure",[15,2173,605],{},[67,2175,2177],{"className":135,"code":2176,"language":137,"meta":13,"style":13},"├── apps\n│   ├── base\n│   └── dev\n├── infrastructure\n│   ├── config\n│   └── controllers\n└── clusters\n    └── dev\n",[74,2178,2179,2185,2195,2203,2209,2218,2227,2233],{"__ignoreMap":13},[141,2180,2181,2183],{"class":143,"line":144},[141,2182,615],{"class":158},[141,2184,675],{"class":151},[141,2186,2187,2190,2193],{"class":143,"line":155},[141,2188,2189],{"class":158},"│",[141,2191,2192],{"class":151},"   ├──",[141,2194,687],{"class":151},[141,2196,2197,2199,2201],{"class":143,"line":168},[141,2198,2189],{"class":158},[141,2200,684],{"class":151},[141,2202,705],{"class":151},[141,2204,2205,2207],{"class":143,"line":660},[141,2206,615],{"class":158},[141,2208,695],{"class":151},[141,2210,2211,2213,2215],{"class":143,"line":669},[141,2212,2189],{"class":158},[141,2214,2192],{"class":151},[141,2216,2217],{"class":151}," config\n",[141,2219,2220,2222,2224],{"class":143,"line":678},[141,2221,2189],{"class":158},[141,2223,684],{"class":151},[141,2225,2226],{"class":151}," controllers\n",[141,2228,2229,2231],{"class":143,"line":690},[141,2230,638],{"class":158},[141,2232,714],{"class":151},[141,2234,2235,2237],{"class":143,"line":698},[141,2236,663],{"class":158},[141,2238,705],{"class":151},[28,2240,2242],{"id":2241},"bootstraping-flux","Bootstraping Flux",[11,2244,2245,2248],{"type":74},[15,2246,2247],{},"Make sure you are using the right kubectl context!",[894,2249,2250,2253],{"v-slot:details":13},[15,2251,2252],{},"For example in case you are using Azure AKS:",[67,2254,2256],{"className":135,"code":2255,"language":137,"meta":13,"style":13},"az aks get-credentials --resource-group rg-k8s-dev --name aks-dev\n",[74,2257,2258],{"__ignoreMap":13},[141,2259,2260,2263,2266,2269,2272,2275,2278],{"class":143,"line":144},[141,2261,2262],{"class":158},"az",[141,2264,2265],{"class":151}," aks",[141,2267,2268],{"class":151}," get-credentials",[141,2270,2271],{"class":848}," --resource-group",[141,2273,2274],{"class":151}," rg-k8s-dev",[141,2276,2277],{"class":848}," --name",[141,2279,2280],{"class":151}," aks-dev\n",[15,2282,2283],{},"Verify cluster readiness:",[67,2285,2287],{"className":135,"code":2286,"language":137,"meta":13,"style":13},"flux check --pre\n\n► checking prerequisites\n✔ Kubernetes 1.25.12 >=1.20.6-0\n✔ prerequisites checks passed\n",[74,2288,2289,2299,2303,2314,2331],{"__ignoreMap":13},[141,2290,2291,2293,2296],{"class":143,"line":144},[141,2292,1125],{"class":158},[141,2294,2295],{"class":151}," check",[141,2297,2298],{"class":848}," --pre\n",[141,2300,2301],{"class":143,"line":155},[141,2302,1004],{"emptyLinePlaceholder":487},[141,2304,2305,2308,2311],{"class":143,"line":168},[141,2306,2307],{"class":158},"►",[141,2309,2310],{"class":151}," checking",[141,2312,2313],{"class":151}," prerequisites\n",[141,2315,2316,2319,2322,2325,2328],{"class":143,"line":660},[141,2317,2318],{"class":158},"✔",[141,2320,2321],{"class":151}," Kubernetes",[141,2323,2324],{"class":852}," 1.25.12",[141,2326,2327],{"class":916}," >",[141,2329,2330],{"class":151},"=1.20.6-0\n",[141,2332,2333,2335,2338,2341],{"class":143,"line":669},[141,2334,2318],{"class":158},[141,2336,2337],{"class":151}," prerequisites",[141,2339,2340],{"class":151}," checks",[141,2342,2343],{"class":151}," passed\n",[11,2345,2346,2351],{"type":542},[15,2347,887,2348],{},[18,2349,892],{"href":890,"rel":2350},[22],[894,2352,2353],{"v-slot:details":13},[15,2354,898,2355],{},[18,2356,903],{"href":901,"rel":2357},[22],[67,2359,2361],{"className":135,"code":2360,"language":137,"meta":13,"style":13},"export GITHUB_TOKEN=\u003CYOUR_PAT>\n",[74,2362,2363],{"__ignoreMap":13},[141,2364,2365,2367,2369,2371,2373],{"class":143,"line":144},[141,2366,917],{"class":916},[141,2368,921],{"class":920},[141,2370,924],{"class":916},[141,2372,927],{"class":920},[141,2374,930],{"class":916},[15,2376,2377],{},"Start the bootstrap (Flux will create the repository for you incase it doesnt exists):",[67,2379,2381],{"className":135,"code":2380,"language":137,"meta":13,"style":13},"flux bootstrap github --read-write-key --owner=\u003CYOUR_ORG> --repository=blog-deployment --branch=main --path=gitops/clusters/dev --components-extra=image-reflector-controller,image-automation-controller\n\n    Message:\n    ► connecting to github.com\n    ► cloning branch \"main\" from Git repository \"https://github.com/devozs/blog-deployment.git\"\n    ✔ cloned repository\n    ► generating component manifests\n    ✔ generated component manifests\n    ✔ committed sync manifests to \"main\" (\"e65db7e29d592c016a8f82271a577e6b6c0b2935\")\n    ► pushing component manifests to \"https://github.com/devozs/blog-deployment.git\"\n    ► installing components in \"flux-system\" namespace\n    ✔ installed components\n    ✔ reconciled components\n    ► determining if source secret \"flux-system/flux-system\" exists\n    ► generating source secret\n    ✔ public key: ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBNOHqQkmVLEVGXn9IiiOAuHkv8/Je0lFGdrCJAccUHYalIDiDOF9CKFxLFXvpTtIePVS3kshJRnfNKfwFVqYdEWTP0xHm7KXSv4dwZZgf011FdYBv4JSSujIhv8m31qu1A==\n    ✔ configured deploy key \"flux-system-main-flux-system-./gitops/clusters/dev\" for \"https://github.com/devozs/blog-deployment\"\n    ► applying source secret \"flux-system/flux-system\"\n    ✔ reconciled source secret\n    ► generating sync manifests\n    ✔ generated sync manifests\n    ✔ committed sync manifests to \"main\" (\"9e14f895a4916fad884ffbe564c049e72f1ecd58\")\n    ► pushing sync manifests to \"https://github.com/devozs/blog-deployment.git\"\n    ► applying sync manifests\n    ✔ reconciled sync configuration\n    ◎ waiting for Kustomization \"flux-system/flux-system\" to be reconciled\n    ✔ Kustomization reconciled successfully\n    ► confirming components are healthy\n    ✔ helm-controller: deployment ready\n    ✔ image-automation-controller: deployment ready\n    ✔ image-reflector-controller: deployment ready\n    ✔ kustomize-controller: deployment ready\n    ✔ notification-controller: deployment ready\n    ✔ source-controller: deployment ready\n    ✔ all components are healthy\n",[74,2382,2383,2420,2424,2429,2442,2474,2485,2498,2509,2542,2561,2583,2593,2602,2628,2639,2655,2684,2701,2711,2721,2731,2760,2778,2788,2800,2828,2840,2856,2870,2882,2894,2906,2918,2930],{"__ignoreMap":13},[141,2384,2385,2387,2390,2393,2396,2399,2402,2405,2408,2411,2414,2417],{"class":143,"line":144},[141,2386,1125],{"class":158},[141,2388,2389],{"class":151}," bootstrap",[141,2391,2392],{"class":151}," github",[141,2394,2395],{"class":848}," --read-write-key",[141,2397,2398],{"class":848}," --owner=",[141,2400,2401],{"class":916},"\u003C",[141,2403,2404],{"class":848},"YOUR_ORG",[141,2406,2407],{"class":916},">",[141,2409,2410],{"class":848}," --repository=blog-deployment",[141,2412,2413],{"class":848}," --branch=main",[141,2415,2416],{"class":848}," --path=gitops/clusters/dev",[141,2418,2419],{"class":848}," --components-extra=image-reflector-controller,image-automation-controller\n",[141,2421,2422],{"class":143,"line":155},[141,2423,1004],{"emptyLinePlaceholder":487},[141,2425,2426],{"class":143,"line":168},[141,2427,2428],{"class":158},"    Message:\n",[141,2430,2431,2434,2437,2439],{"class":143,"line":660},[141,2432,2433],{"class":158},"    ►",[141,2435,2436],{"class":151}," connecting",[141,2438,1789],{"class":151},[141,2440,2441],{"class":151}," github.com\n",[141,2443,2444,2446,2449,2452,2454,2457,2459,2461,2464,2466,2468,2471],{"class":143,"line":669},[141,2445,2433],{"class":158},[141,2447,2448],{"class":151}," cloning",[141,2450,2451],{"class":151}," branch",[141,2453,1260],{"class":1259},[141,2455,2456],{"class":151},"main",[141,2458,1266],{"class":1259},[141,2460,1783],{"class":151},[141,2462,2463],{"class":151}," Git",[141,2465,1810],{"class":151},[141,2467,1260],{"class":1259},[141,2469,2470],{"class":151},"https://github.com/devozs/blog-deployment.git",[141,2472,2473],{"class":1259},"\"\n",[141,2475,2476,2479,2482],{"class":143,"line":678},[141,2477,2478],{"class":158},"    ✔",[141,2480,2481],{"class":151}," cloned",[141,2483,2484],{"class":151}," repository\n",[141,2486,2487,2489,2492,2495],{"class":143,"line":690},[141,2488,2433],{"class":158},[141,2490,2491],{"class":151}," generating",[141,2493,2494],{"class":151}," component",[141,2496,2497],{"class":151}," manifests\n",[141,2499,2500,2502,2505,2507],{"class":143,"line":698},[141,2501,2478],{"class":158},[141,2503,2504],{"class":151}," generated",[141,2506,2494],{"class":151},[141,2508,2497],{"class":151},[141,2510,2511,2513,2516,2519,2522,2524,2526,2528,2530,2533,2535,2538,2540],{"class":143,"line":708},[141,2512,2478],{"class":158},[141,2514,2515],{"class":151}," committed",[141,2517,2518],{"class":151}," sync",[141,2520,2521],{"class":151}," manifests",[141,2523,1789],{"class":151},[141,2525,1260],{"class":1259},[141,2527,2456],{"class":151},[141,2529,1266],{"class":1259},[141,2531,2532],{"class":621}," (",[141,2534,1266],{"class":1259},[141,2536,2537],{"class":151},"e65db7e29d592c016a8f82271a577e6b6c0b2935",[141,2539,1266],{"class":1259},[141,2541,49],{"class":621},[141,2543,2544,2546,2549,2551,2553,2555,2557,2559],{"class":143,"line":717},[141,2545,2433],{"class":158},[141,2547,2548],{"class":151}," pushing",[141,2550,2494],{"class":151},[141,2552,2521],{"class":151},[141,2554,1789],{"class":151},[141,2556,1260],{"class":1259},[141,2558,2470],{"class":151},[141,2560,2473],{"class":1259},[141,2562,2563,2565,2568,2571,2574,2576,2578,2580],{"class":143,"line":1326},[141,2564,2433],{"class":158},[141,2566,2567],{"class":151}," installing",[141,2569,2570],{"class":151}," components",[141,2572,2573],{"class":151}," in",[141,2575,1260],{"class":1259},[141,2577,976],{"class":151},[141,2579,1266],{"class":1259},[141,2581,2582],{"class":151}," namespace\n",[141,2584,2585,2587,2590],{"class":143,"line":1479},[141,2586,2478],{"class":158},[141,2588,2589],{"class":151}," installed",[141,2591,2592],{"class":151}," components\n",[141,2594,2595,2597,2600],{"class":143,"line":1486},[141,2596,2478],{"class":158},[141,2598,2599],{"class":151}," reconciled",[141,2601,2592],{"class":151},[141,2603,2604,2606,2609,2612,2615,2618,2620,2623,2625],{"class":143,"line":1495},[141,2605,2433],{"class":158},[141,2607,2608],{"class":151}," determining",[141,2610,2611],{"class":151}," if",[141,2613,2614],{"class":151}," source",[141,2616,2617],{"class":151}," secret",[141,2619,1260],{"class":1259},[141,2621,2622],{"class":151},"flux-system/flux-system",[141,2624,1266],{"class":1259},[141,2626,2627],{"class":151}," exists\n",[141,2629,2630,2632,2634,2636],{"class":143,"line":1504},[141,2631,2433],{"class":158},[141,2633,2491],{"class":151},[141,2635,2614],{"class":151},[141,2637,2638],{"class":151}," secret\n",[141,2640,2641,2643,2646,2649,2652],{"class":143,"line":1513},[141,2642,2478],{"class":158},[141,2644,2645],{"class":151}," public",[141,2647,2648],{"class":151}," key:",[141,2650,2651],{"class":151}," ecdsa-sha2-nistp384",[141,2653,2654],{"class":151}," AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBNOHqQkmVLEVGXn9IiiOAuHkv8/Je0lFGdrCJAccUHYalIDiDOF9CKFxLFXvpTtIePVS3kshJRnfNKfwFVqYdEWTP0xHm7KXSv4dwZZgf011FdYBv4JSSujIhv8m31qu1A==\n",[141,2656,2657,2659,2662,2665,2668,2670,2673,2675,2677,2679,2682],{"class":143,"line":1520},[141,2658,2478],{"class":158},[141,2660,2661],{"class":151}," configured",[141,2663,2664],{"class":151}," deploy",[141,2666,2667],{"class":151}," key",[141,2669,1260],{"class":1259},[141,2671,2672],{"class":151},"flux-system-main-flux-system-./gitops/clusters/dev",[141,2674,1266],{"class":1259},[141,2676,1768],{"class":151},[141,2678,1260],{"class":1259},[141,2680,2681],{"class":151},"https://github.com/devozs/blog-deployment",[141,2683,2473],{"class":1259},[141,2685,2686,2688,2691,2693,2695,2697,2699],{"class":143,"line":2011},[141,2687,2433],{"class":158},[141,2689,2690],{"class":151}," applying",[141,2692,2614],{"class":151},[141,2694,2617],{"class":151},[141,2696,1260],{"class":1259},[141,2698,2622],{"class":151},[141,2700,2473],{"class":1259},[141,2702,2703,2705,2707,2709],{"class":143,"line":2022},[141,2704,2478],{"class":158},[141,2706,2599],{"class":151},[141,2708,2614],{"class":151},[141,2710,2638],{"class":151},[141,2712,2713,2715,2717,2719],{"class":143,"line":2038},[141,2714,2433],{"class":158},[141,2716,2491],{"class":151},[141,2718,2518],{"class":151},[141,2720,2497],{"class":151},[141,2722,2723,2725,2727,2729],{"class":143,"line":2046},[141,2724,2478],{"class":158},[141,2726,2504],{"class":151},[141,2728,2518],{"class":151},[141,2730,2497],{"class":151},[141,2732,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753,2756,2758],{"class":143,"line":2056},[141,2734,2478],{"class":158},[141,2736,2515],{"class":151},[141,2738,2518],{"class":151},[141,2740,2521],{"class":151},[141,2742,1789],{"class":151},[141,2744,1260],{"class":1259},[141,2746,2456],{"class":151},[141,2748,1266],{"class":1259},[141,2750,2532],{"class":621},[141,2752,1266],{"class":1259},[141,2754,2755],{"class":151},"9e14f895a4916fad884ffbe564c049e72f1ecd58",[141,2757,1266],{"class":1259},[141,2759,49],{"class":621},[141,2761,2762,2764,2766,2768,2770,2772,2774,2776],{"class":143,"line":2064},[141,2763,2433],{"class":158},[141,2765,2548],{"class":151},[141,2767,2518],{"class":151},[141,2769,2521],{"class":151},[141,2771,1789],{"class":151},[141,2773,1260],{"class":1259},[141,2775,2470],{"class":151},[141,2777,2473],{"class":1259},[141,2779,2780,2782,2784,2786],{"class":143,"line":2075},[141,2781,2433],{"class":158},[141,2783,2690],{"class":151},[141,2785,2518],{"class":151},[141,2787,2497],{"class":151},[141,2789,2791,2793,2795,2797],{"class":143,"line":2790},25,[141,2792,2478],{"class":158},[141,2794,2599],{"class":151},[141,2796,2518],{"class":151},[141,2798,2799],{"class":151}," configuration\n",[141,2801,2803,2806,2809,2811,2814,2816,2818,2820,2822,2825],{"class":143,"line":2802},26,[141,2804,2805],{"class":158},"    ◎",[141,2807,2808],{"class":151}," waiting",[141,2810,1768],{"class":151},[141,2812,2813],{"class":151}," Kustomization",[141,2815,1260],{"class":1259},[141,2817,2622],{"class":151},[141,2819,1266],{"class":1259},[141,2821,1789],{"class":151},[141,2823,2824],{"class":151}," be",[141,2826,2827],{"class":151}," reconciled\n",[141,2829,2831,2833,2835,2837],{"class":143,"line":2830},27,[141,2832,2478],{"class":158},[141,2834,2813],{"class":151},[141,2836,2599],{"class":151},[141,2838,2839],{"class":151}," successfully\n",[141,2841,2843,2845,2848,2850,2853],{"class":143,"line":2842},28,[141,2844,2433],{"class":158},[141,2846,2847],{"class":151}," confirming",[141,2849,2570],{"class":151},[141,2851,2852],{"class":151}," are",[141,2854,2855],{"class":151}," healthy\n",[141,2857,2859,2861,2864,2867],{"class":143,"line":2858},29,[141,2860,2478],{"class":158},[141,2862,2863],{"class":151}," helm-controller:",[141,2865,2866],{"class":151}," deployment",[141,2868,2869],{"class":151}," ready\n",[141,2871,2873,2875,2878,2880],{"class":143,"line":2872},30,[141,2874,2478],{"class":158},[141,2876,2877],{"class":151}," image-automation-controller:",[141,2879,2866],{"class":151},[141,2881,2869],{"class":151},[141,2883,2885,2887,2890,2892],{"class":143,"line":2884},31,[141,2886,2478],{"class":158},[141,2888,2889],{"class":151}," image-reflector-controller:",[141,2891,2866],{"class":151},[141,2893,2869],{"class":151},[141,2895,2897,2899,2902,2904],{"class":143,"line":2896},32,[141,2898,2478],{"class":158},[141,2900,2901],{"class":151}," kustomize-controller:",[141,2903,2866],{"class":151},[141,2905,2869],{"class":151},[141,2907,2909,2911,2914,2916],{"class":143,"line":2908},33,[141,2910,2478],{"class":158},[141,2912,2913],{"class":151}," notification-controller:",[141,2915,2866],{"class":151},[141,2917,2869],{"class":151},[141,2919,2921,2923,2926,2928],{"class":143,"line":2920},34,[141,2922,2478],{"class":158},[141,2924,2925],{"class":151}," source-controller:",[141,2927,2866],{"class":151},[141,2929,2869],{"class":151},[141,2931,2933,2935,2938,2940,2942],{"class":143,"line":2932},35,[141,2934,2478],{"class":158},[141,2936,2937],{"class":151}," all",[141,2939,2570],{"class":151},[141,2941,2852],{"class":151},[141,2943,2855],{"class":151},[62,2945,968],{"id":967},[15,2947,971,2948,977],{},[731,2949,2950],{},[353,2951,976],{},[67,2953,2954],{"className":135,"code":980,"language":137,"meta":13,"style":13},[74,2955,2956,2968,2972,2984,2996,3008,3020,3032,3044],{"__ignoreMap":13},[141,2957,2958,2960,2962,2964,2966],{"class":143,"line":144},[141,2959,987],{"class":158},[141,2961,990],{"class":151},[141,2963,993],{"class":151},[141,2965,996],{"class":848},[141,2967,999],{"class":151},[141,2969,2970],{"class":143,"line":155},[141,2971,1004],{"emptyLinePlaceholder":487},[141,2973,2974,2976,2978,2980,2982],{"class":143,"line":168},[141,2975,1009],{"class":158},[141,2977,1012],{"class":151},[141,2979,1015],{"class":151},[141,2981,1018],{"class":151},[141,2983,1021],{"class":151},[141,2985,2986,2988,2990,2992,2994],{"class":143,"line":660},[141,2987,1026],{"class":158},[141,2989,1029],{"class":151},[141,2991,1032],{"class":151},[141,2993,1035],{"class":852},[141,2995,1038],{"class":151},[141,2997,2998,3000,3002,3004,3006],{"class":143,"line":669},[141,2999,1043],{"class":158},[141,3001,1046],{"class":151},[141,3003,1032],{"class":151},[141,3005,1035],{"class":852},[141,3007,1038],{"class":151},[141,3009,3010,3012,3014,3016,3018],{"class":143,"line":678},[141,3011,1057],{"class":158},[141,3013,1060],{"class":151},[141,3015,1032],{"class":151},[141,3017,1035],{"class":852},[141,3019,1038],{"class":151},[141,3021,3022,3024,3026,3028,3030],{"class":143,"line":690},[141,3023,1071],{"class":158},[141,3025,1074],{"class":151},[141,3027,1032],{"class":151},[141,3029,1035],{"class":852},[141,3031,1038],{"class":151},[141,3033,3034,3036,3038,3040,3042],{"class":143,"line":698},[141,3035,1085],{"class":158},[141,3037,1088],{"class":151},[141,3039,1032],{"class":151},[141,3041,1035],{"class":852},[141,3043,1038],{"class":151},[141,3045,3046,3048,3050,3052,3054],{"class":143,"line":708},[141,3047,1099],{"class":158},[141,3049,1102],{"class":151},[141,3051,1032],{"class":151},[141,3053,1035],{"class":852},[141,3055,1038],{"class":151},[62,3057,1112],{"id":1111},[15,3059,1115],{},[67,3061,3063],{"className":135,"code":3062,"language":137,"meta":13,"style":13},"flux get kustomizations\n\nNAME                REVISION            SUSPENDED   READY   MESSAGE                              \napps                main@sha1:45260107  False       True    Applied revision: main@sha1:45260107    \nflux-system         main@sha1:45260107  False       True    Applied revision: main@sha1:45260107    \ninfra-configs       main@sha1:45260107  False       True    Applied revision: main@sha1:45260107    \ninfra-controllers   main@sha1:45260107  False       True    Applied revision: main@sha1:45260107    \n",[74,3064,3065,3073,3077,3091,3114,3133,3153],{"__ignoreMap":13},[141,3066,3067,3069,3071],{"class":143,"line":144},[141,3068,1125],{"class":158},[141,3070,990],{"class":151},[141,3072,1130],{"class":151},[141,3074,3075],{"class":143,"line":155},[141,3076,1004],{"emptyLinePlaceholder":487},[141,3078,3079,3081,3083,3085,3087,3089],{"class":143,"line":168},[141,3080,1009],{"class":158},[141,3082,1141],{"class":151},[141,3084,1144],{"class":151},[141,3086,1147],{"class":151},[141,3088,1150],{"class":151},[141,3090,1153],{"class":621},[141,3092,3093,3096,3099,3102,3104,3106,3108,3111],{"class":143,"line":660},[141,3094,3095],{"class":158},"apps",[141,3097,3098],{"class":151},"                main@sha1:45260107",[141,3100,3101],{"class":151},"  False",[141,3103,1166],{"class":151},[141,3105,1169],{"class":151},[141,3107,1172],{"class":151},[141,3109,3110],{"class":151}," main@sha1:45260107",[141,3112,3113],{"class":621},"    \n",[141,3115,3116,3118,3121,3123,3125,3127,3129,3131],{"class":143,"line":669},[141,3117,976],{"class":158},[141,3119,3120],{"class":151},"         main@sha1:45260107",[141,3122,3101],{"class":151},[141,3124,1166],{"class":151},[141,3126,1169],{"class":151},[141,3128,1172],{"class":151},[141,3130,3110],{"class":151},[141,3132,3113],{"class":621},[141,3134,3135,3138,3141,3143,3145,3147,3149,3151],{"class":143,"line":678},[141,3136,3137],{"class":158},"infra-configs",[141,3139,3140],{"class":151},"       main@sha1:45260107",[141,3142,3101],{"class":151},[141,3144,1166],{"class":151},[141,3146,1169],{"class":151},[141,3148,1172],{"class":151},[141,3150,3110],{"class":151},[141,3152,3113],{"class":621},[141,3154,3155,3158,3161,3163,3165,3167,3169],{"class":143,"line":690},[141,3156,3157],{"class":158},"infra-controllers",[141,3159,3160],{"class":151},"   main@sha1:45260107",[141,3162,3101],{"class":151},[141,3164,1166],{"class":151},[141,3166,1169],{"class":151},[141,3168,1172],{"class":151},[141,3170,3171],{"class":151}," main@sha1:45260107\n",[15,3173,3174],{},"You can also get kustomizations CRD using the kubectl CLI:",[67,3176,3178],{"className":135,"code":3177,"language":137,"meta":13,"style":13},"kubectl get kustomizations -n flux-system \n\nNAME                AGE   READY   STATUS\napps                28h   True    Applied revision: main@sha1:45260107f70f9618872e50d4a196126a92ef715c\nflux-system         36h   True    Applied revision: main@sha1:45260107f70f9618872e50d4a196126a92ef715c\ninfra-configs       28h   True    Applied revision: main@sha1:45260107f70f9618872e50d4a196126a92ef715c\ninfra-controllers   28h   True    Applied revision: main@sha1:45260107f70f9618872e50d4a196126a92ef715c\n\n",[74,3179,3180,3197,3201,3213,3230,3245,3260],{"__ignoreMap":13},[141,3181,3182,3184,3186,3189,3191,3194],{"class":143,"line":144},[141,3183,987],{"class":158},[141,3185,990],{"class":151},[141,3187,3188],{"class":151}," kustomizations",[141,3190,996],{"class":848},[141,3192,3193],{"class":151}," flux-system",[141,3195,3196],{"class":621}," \n",[141,3198,3199],{"class":143,"line":155},[141,3200,1004],{"emptyLinePlaceholder":487},[141,3202,3203,3205,3208,3210],{"class":143,"line":168},[141,3204,1009],{"class":158},[141,3206,3207],{"class":151},"                AGE",[141,3209,1147],{"class":151},[141,3211,3212],{"class":151},"   STATUS\n",[141,3214,3215,3217,3220,3223,3225,3227],{"class":143,"line":660},[141,3216,3095],{"class":158},[141,3218,3219],{"class":151},"                28h",[141,3221,3222],{"class":151},"   True",[141,3224,1169],{"class":151},[141,3226,1172],{"class":151},[141,3228,3229],{"class":151}," main@sha1:45260107f70f9618872e50d4a196126a92ef715c\n",[141,3231,3232,3234,3237,3239,3241,3243],{"class":143,"line":669},[141,3233,976],{"class":158},[141,3235,3236],{"class":151},"         36h",[141,3238,3222],{"class":151},[141,3240,1169],{"class":151},[141,3242,1172],{"class":151},[141,3244,3229],{"class":151},[141,3246,3247,3249,3252,3254,3256,3258],{"class":143,"line":678},[141,3248,3137],{"class":158},[141,3250,3251],{"class":151},"       28h",[141,3253,3222],{"class":151},[141,3255,1169],{"class":151},[141,3257,1172],{"class":151},[141,3259,3229],{"class":151},[141,3261,3262,3264,3267,3269,3271,3273],{"class":143,"line":690},[141,3263,3157],{"class":158},[141,3265,3266],{"class":151},"   28h",[141,3268,3222],{"class":151},[141,3270,1169],{"class":151},[141,3272,1172],{"class":151},[141,3274,3229],{"class":151},[28,3276,1335],{"id":1334},[15,3278,3279,3280,3285],{},"In this tutorial, I haven't utilized a secret manager like Azure Key Vault. Instead, I've used a secret YAML file and ensured that it's not committed to GitHub by including it in the ",[731,3281,3282],{},[353,3283,3284],{},".gitignore"," file.",[11,3287,3288,3290],{"type":1341},[15,3289,1344],{},[894,3291,3292],{"v-slot:details":13},[15,3293,1349,3294,1355],{},[18,3295,1354],{"href":1352,"rel":3296},[22],[62,3298,1359],{"id":1358},[15,3300,3301],{},"Docker pull secret is being used in two ways:",[36,3303,3304,3307],{},[39,3305,3306],{},"Pull the blog-frontend image from Github registry",[39,3308,1370],{},[67,3310,3312],{"className":1373,"code":3311,"language":1375,"meta":13,"style":13},"apiVersion: v1\nkind: Secret\nmetadata:\n  name: cr-secret\n  namespace: flux-system\ntype: kubernetes.io/dockerconfigjson\ndata:\n  .dockerconfigjson: \u003CPUT_YOURS>\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: cr-secret\n  namespace: blog\ntype: kubernetes.io/dockerconfigjson\ndata:\n  .dockerconfigjson: \u003CPUT_YOURS>\n",[74,3313,3314,3322,3330,3336,3344,3352,3360,3366,3374,3378,3386,3394,3400,3408,3417,3425,3431],{"__ignoreMap":13},[141,3315,3316,3318,3320],{"class":143,"line":144},[141,3317,1383],{"class":1382},[141,3319,1387],{"class":1386},[141,3321,1390],{"class":151},[141,3323,3324,3326,3328],{"class":143,"line":155},[141,3325,1395],{"class":1382},[141,3327,1387],{"class":1386},[141,3329,1400],{"class":151},[141,3331,3332,3334],{"class":143,"line":168},[141,3333,1405],{"class":1382},[141,3335,1408],{"class":1386},[141,3337,3338,3340,3342],{"class":143,"line":660},[141,3339,1413],{"class":1382},[141,3341,1387],{"class":1386},[141,3343,1418],{"class":151},[141,3345,3346,3348,3350],{"class":143,"line":669},[141,3347,1423],{"class":1382},[141,3349,1387],{"class":1386},[141,3351,999],{"class":151},[141,3353,3354,3356,3358],{"class":143,"line":678},[141,3355,1432],{"class":1382},[141,3357,1387],{"class":1386},[141,3359,1437],{"class":151},[141,3361,3362,3364],{"class":143,"line":690},[141,3363,1442],{"class":1382},[141,3365,1408],{"class":1386},[141,3367,3368,3370,3372],{"class":143,"line":698},[141,3369,1449],{"class":1382},[141,3371,1387],{"class":1386},[141,3373,1454],{"class":151},[141,3375,3376],{"class":143,"line":708},[141,3377,1460],{"class":1459},[141,3379,3380,3382,3384],{"class":143,"line":717},[141,3381,1383],{"class":1382},[141,3383,1387],{"class":1386},[141,3385,1390],{"class":151},[141,3387,3388,3390,3392],{"class":143,"line":1326},[141,3389,1395],{"class":1382},[141,3391,1387],{"class":1386},[141,3393,1400],{"class":151},[141,3395,3396,3398],{"class":143,"line":1479},[141,3397,1405],{"class":1382},[141,3399,1408],{"class":1386},[141,3401,3402,3404,3406],{"class":143,"line":1486},[141,3403,1413],{"class":1382},[141,3405,1387],{"class":1386},[141,3407,1418],{"class":151},[141,3409,3410,3412,3414],{"class":143,"line":1495},[141,3411,1423],{"class":1382},[141,3413,1387],{"class":1386},[141,3415,3416],{"class":151}," blog\n",[141,3418,3419,3421,3423],{"class":143,"line":1504},[141,3420,1432],{"class":1382},[141,3422,1387],{"class":1386},[141,3424,1437],{"class":151},[141,3426,3427,3429],{"class":143,"line":1513},[141,3428,1442],{"class":1382},[141,3430,1408],{"class":1386},[141,3432,3433,3435,3437],{"class":143,"line":1520},[141,3434,1449],{"class":1382},[141,3436,1387],{"class":1386},[141,3438,1454],{"class":151},[62,3440,3442],{"id":3441},"tls-cert-secret","TLS Cert Secret",[15,3444,3445],{},"You might want to use cert-mnagaer or manually use your own certificate or free one like Let's Encrypt.",[15,3447,3448,3449,3454],{},"I havent implemented cert-manager and simply created ",[731,3450,3451],{},[353,3452,3453],{},"cert-secret"," that you`ll have to replace and apply the below yaml.",[67,3456,3458],{"className":1373,"code":3457,"language":1375,"meta":13,"style":13},"apiVersion: v1\nkind: Secret\nmetadata:\n  name: cert-secret\n  namespace: flux-system\ntype: kubernetes.io/tls\ndata:\n  tls.crt: \u003CPUT_YOURS>\n  tls.key: \u003CPUT_YOURS>\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: cert-secret\n  namespace: blog\ntype: kubernetes.io/tls\ndata:\n  tls.crt: \u003CPUT_YOURS>\n  tls.key: \u003CPUT_YOURS>\n",[74,3459,3460,3468,3476,3482,3491,3499,3508,3514,3523,3532,3536,3544,3552,3558,3566,3574,3582,3588,3596],{"__ignoreMap":13},[141,3461,3462,3464,3466],{"class":143,"line":144},[141,3463,1383],{"class":1382},[141,3465,1387],{"class":1386},[141,3467,1390],{"class":151},[141,3469,3470,3472,3474],{"class":143,"line":155},[141,3471,1395],{"class":1382},[141,3473,1387],{"class":1386},[141,3475,1400],{"class":151},[141,3477,3478,3480],{"class":143,"line":168},[141,3479,1405],{"class":1382},[141,3481,1408],{"class":1386},[141,3483,3484,3486,3488],{"class":143,"line":660},[141,3485,1413],{"class":1382},[141,3487,1387],{"class":1386},[141,3489,3490],{"class":151}," cert-secret\n",[141,3492,3493,3495,3497],{"class":143,"line":669},[141,3494,1423],{"class":1382},[141,3496,1387],{"class":1386},[141,3498,999],{"class":151},[141,3500,3501,3503,3505],{"class":143,"line":678},[141,3502,1432],{"class":1382},[141,3504,1387],{"class":1386},[141,3506,3507],{"class":151}," kubernetes.io/tls\n",[141,3509,3510,3512],{"class":143,"line":690},[141,3511,1442],{"class":1382},[141,3513,1408],{"class":1386},[141,3515,3516,3519,3521],{"class":143,"line":698},[141,3517,3518],{"class":1382},"  tls.crt",[141,3520,1387],{"class":1386},[141,3522,1454],{"class":151},[141,3524,3525,3528,3530],{"class":143,"line":708},[141,3526,3527],{"class":1382},"  tls.key",[141,3529,1387],{"class":1386},[141,3531,1454],{"class":151},[141,3533,3534],{"class":143,"line":717},[141,3535,1460],{"class":1459},[141,3537,3538,3540,3542],{"class":143,"line":1326},[141,3539,1383],{"class":1382},[141,3541,1387],{"class":1386},[141,3543,1390],{"class":151},[141,3545,3546,3548,3550],{"class":143,"line":1479},[141,3547,1395],{"class":1382},[141,3549,1387],{"class":1386},[141,3551,1400],{"class":151},[141,3553,3554,3556],{"class":143,"line":1486},[141,3555,1405],{"class":1382},[141,3557,1408],{"class":1386},[141,3559,3560,3562,3564],{"class":143,"line":1495},[141,3561,1413],{"class":1382},[141,3563,1387],{"class":1386},[141,3565,3490],{"class":151},[141,3567,3568,3570,3572],{"class":143,"line":1504},[141,3569,1423],{"class":1382},[141,3571,1387],{"class":1386},[141,3573,3416],{"class":151},[141,3575,3576,3578,3580],{"class":143,"line":1513},[141,3577,1432],{"class":1382},[141,3579,1387],{"class":1386},[141,3581,3507],{"class":151},[141,3583,3584,3586],{"class":143,"line":1520},[141,3585,1442],{"class":1382},[141,3587,1408],{"class":1386},[141,3589,3590,3592,3594],{"class":143,"line":2011},[141,3591,3518],{"class":1382},[141,3593,1387],{"class":1386},[141,3595,1454],{"class":151},[141,3597,3598,3600,3602],{"class":143,"line":2022},[141,3599,3527],{"class":1382},[141,3601,1387],{"class":1386},[141,3603,1454],{"class":151},[28,3605,3607],{"id":3606},"validation","Validation",[15,3609,3610],{},"Once the reconciliation is completed and verified all kustomization are ready (described above) we can check the rest of the deployment.",[67,3612,3614],{"className":135,"code":3613,"language":137,"meta":13,"style":13},"kubectl get pod -n blog\n\nNAME                             READY   STATUS    RESTARTS   AGE\nblog-frontend-647c656d49-7q6x4   1/1     Running   0          79m\n",[74,3615,3616,3628,3632,3645],{"__ignoreMap":13},[141,3617,3618,3620,3622,3624,3626],{"class":143,"line":144},[141,3619,987],{"class":158},[141,3621,990],{"class":151},[141,3623,993],{"class":151},[141,3625,996],{"class":848},[141,3627,3416],{"class":151},[141,3629,3630],{"class":143,"line":155},[141,3631,1004],{"emptyLinePlaceholder":487},[141,3633,3634,3636,3639,3641,3643],{"class":143,"line":168},[141,3635,1009],{"class":158},[141,3637,3638],{"class":151},"                             READY",[141,3640,1015],{"class":151},[141,3642,1018],{"class":151},[141,3644,1021],{"class":151},[141,3646,3647,3650,3652,3654,3656],{"class":143,"line":660},[141,3648,3649],{"class":158},"blog-frontend-647c656d49-7q6x4",[141,3651,1046],{"class":151},[141,3653,1032],{"class":151},[141,3655,1035],{"class":852},[141,3657,3658],{"class":151},"          79m\n",[15,3660,3661,3662,3667,3671],{},"Flux also have ",[731,3663,3664],{},[353,3665,3666],{},"weave-gitops UI",[785,3668],{"alt":3669,"src":3670,"title":3669},"Weave Gitops","/images/blog/2023/09/10/weave-gitops-1.png",[785,3672],{"alt":3669,"src":3673,"title":3669},"/images/blog/2023/09/10/weave-gitops-2.png",[28,3675,1530],{"id":1529},[15,3677,1533],{},[36,3679,3680],{},[39,3681,1538],{},[67,3683,3685],{"className":1373,"code":3684,"language":1375,"meta":13,"style":13},"apiVersion: image.toolkit.fluxcd.io/v1beta1\nkind: ImagePolicy\nmetadata:\n  name: blog-frontend\n  namespace: flux-system\nspec:\n  imageRepositoryRef:\n    name: blog-frontend\n  filterTags:\n    pattern: '^main-[a-f0-9]+-(?P\u003Cts>[0-9]+)'\n    extract: '$ts'\n  policy:\n    numerical:\n      order: asc\n",[74,3686,3687,3695,3703,3709,3718,3726,3732,3738,3746,3753,3767,3781,3787,3794],{"__ignoreMap":13},[141,3688,3689,3691,3693],{"class":143,"line":144},[141,3690,1383],{"class":1382},[141,3692,1387],{"class":1386},[141,3694,1552],{"class":151},[141,3696,3697,3699,3701],{"class":143,"line":155},[141,3698,1395],{"class":1382},[141,3700,1387],{"class":1386},[141,3702,1561],{"class":151},[141,3704,3705,3707],{"class":143,"line":168},[141,3706,1405],{"class":1382},[141,3708,1408],{"class":1386},[141,3710,3711,3713,3715],{"class":143,"line":660},[141,3712,1413],{"class":1382},[141,3714,1387],{"class":1386},[141,3716,3717],{"class":151}," blog-frontend\n",[141,3719,3720,3722,3724],{"class":143,"line":669},[141,3721,1423],{"class":1382},[141,3723,1387],{"class":1386},[141,3725,999],{"class":151},[141,3727,3728,3730],{"class":143,"line":678},[141,3729,1589],{"class":1382},[141,3731,1408],{"class":1386},[141,3733,3734,3736],{"class":143,"line":690},[141,3735,1596],{"class":1382},[141,3737,1408],{"class":1386},[141,3739,3740,3742,3744],{"class":143,"line":698},[141,3741,1603],{"class":1382},[141,3743,1387],{"class":1386},[141,3745,3717],{"class":151},[141,3747,3748,3751],{"class":143,"line":708},[141,3749,3750],{"class":1382},"  filterTags",[141,3752,1408],{"class":1386},[141,3754,3755,3758,3760,3762,3765],{"class":143,"line":717},[141,3756,3757],{"class":1382},"    pattern",[141,3759,1387],{"class":1386},[141,3761,1771],{"class":1259},[141,3763,3764],{"class":151},"^main-[a-f0-9]+-(?P\u003Cts>[0-9]+)",[141,3766,2035],{"class":1259},[141,3768,3769,3772,3774,3776,3779],{"class":143,"line":1326},[141,3770,3771],{"class":1382},"    extract",[141,3773,1387],{"class":1386},[141,3775,1771],{"class":1259},[141,3777,3778],{"class":151},"$ts",[141,3780,2035],{"class":1259},[141,3782,3783,3785],{"class":143,"line":1479},[141,3784,1612],{"class":1382},[141,3786,1408],{"class":1386},[141,3788,3789,3792],{"class":143,"line":1486},[141,3790,3791],{"class":1382},"    numerical",[141,3793,1408],{"class":1386},[141,3795,3796,3799,3801],{"class":143,"line":1495},[141,3797,3798],{"class":1382},"      order",[141,3800,1387],{"class":1386},[141,3802,3803],{"class":151}," asc\n",[67,3805,3807],{"className":1373,"code":3806,"language":1375,"meta":13,"style":13},"apiVersion: image.toolkit.fluxcd.io/v1beta1\nkind: ImageRepository\nmetadata:\n  name: blog-frontend\n  namespace: flux-system\nspec:\n  image: blog-frontend\n  interval: 1m0s\n  secretRef:\n    name: DOCKER_SECRET\n",[74,3808,3809,3817,3825,3831,3839,3847,3853,3861,3869,3876],{"__ignoreMap":13},[141,3810,3811,3813,3815],{"class":143,"line":144},[141,3812,1383],{"class":1382},[141,3814,1387],{"class":1386},[141,3816,1552],{"class":151},[141,3818,3819,3821,3823],{"class":143,"line":155},[141,3820,1395],{"class":1382},[141,3822,1387],{"class":1386},[141,3824,1653],{"class":151},[141,3826,3827,3829],{"class":143,"line":168},[141,3828,1405],{"class":1382},[141,3830,1408],{"class":1386},[141,3832,3833,3835,3837],{"class":143,"line":660},[141,3834,1413],{"class":1382},[141,3836,1387],{"class":1386},[141,3838,3717],{"class":151},[141,3840,3841,3843,3845],{"class":143,"line":669},[141,3842,1423],{"class":1382},[141,3844,1387],{"class":1386},[141,3846,999],{"class":151},[141,3848,3849,3851],{"class":143,"line":678},[141,3850,1589],{"class":1382},[141,3852,1408],{"class":1386},[141,3854,3855,3857,3859],{"class":143,"line":690},[141,3856,1686],{"class":1382},[141,3858,1387],{"class":1386},[141,3860,3717],{"class":151},[141,3862,3863,3865,3867],{"class":143,"line":698},[141,3864,1696],{"class":1382},[141,3866,1387],{"class":1386},[141,3868,1701],{"class":151},[141,3870,3871,3874],{"class":143,"line":708},[141,3872,3873],{"class":1382},"  secretRef",[141,3875,1408],{"class":1386},[141,3877,3878,3880,3882],{"class":143,"line":717},[141,3879,1603],{"class":1382},[141,3881,1387],{"class":1386},[141,3883,3884],{"class":151}," DOCKER_SECRET\n",[67,3886,3888],{"className":135,"code":3887,"language":137,"meta":13,"style":13},"flux get image policy    \nNAME            LATEST IMAGE                                            READY   MESSAGE                                                                                                               \nblog-frontend   ghcr.io/devozs/blog-frontend:main-0292a018-1694284510   True    Latest image tag for 'ghcr.io/devozs/blog-frontend' updated from main-18c2d24e-1694278211 to main-0292a018-1694284510\n\nflux get image repository   \nNAME            LAST SCAN                   SUSPENDED   READY   MESSAGE                        \nblog-frontend   2023-09-09T22:50:26+03:00   False       True    successful scan: found 15 tags  \n\n",[74,3889,3890,3902,3919,3956,3960,3972,3989],{"__ignoreMap":13},[141,3891,3892,3894,3896,3898,3900],{"class":143,"line":144},[141,3893,1125],{"class":158},[141,3895,990],{"class":151},[141,3897,1715],{"class":151},[141,3899,1718],{"class":151},[141,3901,3113],{"class":621},[141,3903,3904,3906,3909,3911,3914,3916],{"class":143,"line":155},[141,3905,1009],{"class":158},[141,3907,3908],{"class":151},"            LATEST",[141,3910,1735],{"class":151},[141,3912,3913],{"class":151},"                                            READY",[141,3915,1150],{"class":151},[141,3917,3918],{"class":621},"                                                                                                               \n",[141,3920,3921,3924,3927,3929,3931,3933,3935,3937,3939,3942,3944,3946,3948,3951,3953],{"class":143,"line":168},[141,3922,3923],{"class":158},"blog-frontend",[141,3925,3926],{"class":151},"   ghcr.io/devozs/blog-frontend:main-0292a018-1694284510",[141,3928,3222],{"class":151},[141,3930,1760],{"class":151},[141,3932,1715],{"class":151},[141,3934,1765],{"class":151},[141,3936,1768],{"class":151},[141,3938,1771],{"class":1259},[141,3940,3941],{"class":151},"ghcr.io/devozs/blog-frontend",[141,3943,1777],{"class":1259},[141,3945,1780],{"class":151},[141,3947,1783],{"class":151},[141,3949,3950],{"class":151}," main-18c2d24e-1694278211",[141,3952,1789],{"class":151},[141,3954,3955],{"class":151}," main-0292a018-1694284510\n",[141,3957,3958],{"class":143,"line":660},[141,3959,1004],{"emptyLinePlaceholder":487},[141,3961,3962,3964,3966,3968,3970],{"class":143,"line":669},[141,3963,1125],{"class":158},[141,3965,990],{"class":151},[141,3967,1715],{"class":151},[141,3969,1810],{"class":151},[141,3971,1795],{"class":621},[141,3973,3974,3976,3979,3981,3983,3985,3987],{"class":143,"line":678},[141,3975,1009],{"class":158},[141,3977,3978],{"class":151},"            LAST",[141,3980,1824],{"class":151},[141,3982,1827],{"class":151},[141,3984,1147],{"class":151},[141,3986,1150],{"class":151},[141,3988,1834],{"class":621},[141,3990,3991,3993,3996,3998,4000,4002,4004,4006,4009],{"class":143,"line":690},[141,3992,3923],{"class":158},[141,3994,3995],{"class":151},"   2023-09-09T22:50:26+03:00",[141,3997,1846],{"class":151},[141,3999,1166],{"class":151},[141,4001,1851],{"class":151},[141,4003,1854],{"class":151},[141,4005,1857],{"class":151},[141,4007,4008],{"class":852}," 15",[141,4010,1863],{"class":151},[36,4012,4013],{},[39,4014,1868],{},[67,4016,4017],{"className":1373,"code":1871,"language":1375,"meta":13,"style":13},[74,4018,4019,4027,4035,4041,4049,4057,4063,4071,4077,4085,4093,4099,4105,4111,4119,4125,4131,4139,4147,4159,4165,4173,4179,4187],{"__ignoreMap":13},[141,4020,4021,4023,4025],{"class":143,"line":144},[141,4022,1383],{"class":1382},[141,4024,1387],{"class":1386},[141,4026,1552],{"class":151},[141,4028,4029,4031,4033],{"class":143,"line":155},[141,4030,1395],{"class":1382},[141,4032,1387],{"class":1386},[141,4034,1890],{"class":151},[141,4036,4037,4039],{"class":143,"line":168},[141,4038,1405],{"class":1382},[141,4040,1408],{"class":1386},[141,4042,4043,4045,4047],{"class":143,"line":660},[141,4044,1413],{"class":1382},[141,4046,1387],{"class":1386},[141,4048,1905],{"class":151},[141,4050,4051,4053,4055],{"class":143,"line":669},[141,4052,1423],{"class":1382},[141,4054,1387],{"class":1386},[141,4056,999],{"class":151},[141,4058,4059,4061],{"class":143,"line":678},[141,4060,1589],{"class":1382},[141,4062,1408],{"class":1386},[141,4064,4065,4067,4069],{"class":143,"line":690},[141,4066,1696],{"class":1382},[141,4068,1387],{"class":1386},[141,4070,1928],{"class":151},[141,4072,4073,4075],{"class":143,"line":698},[141,4074,1933],{"class":1382},[141,4076,1408],{"class":1386},[141,4078,4079,4081,4083],{"class":143,"line":708},[141,4080,1940],{"class":1382},[141,4082,1387],{"class":1386},[141,4084,1945],{"class":151},[141,4086,4087,4089,4091],{"class":143,"line":717},[141,4088,1603],{"class":1382},[141,4090,1387],{"class":1386},[141,4092,999],{"class":151},[141,4094,4095,4097],{"class":143,"line":1326},[141,4096,1958],{"class":1382},[141,4098,1408],{"class":1386},[141,4100,4101,4103],{"class":143,"line":1479},[141,4102,1965],{"class":1382},[141,4104,1408],{"class":1386},[141,4106,4107,4109],{"class":143,"line":1486},[141,4108,1972],{"class":1382},[141,4110,1408],{"class":1386},[141,4112,4113,4115,4117],{"class":143,"line":1495},[141,4114,1979],{"class":1382},[141,4116,1387],{"class":1386},[141,4118,1984],{"class":151},[141,4120,4121,4123],{"class":143,"line":1504},[141,4122,1989],{"class":1382},[141,4124,1408],{"class":1386},[141,4126,4127,4129],{"class":143,"line":1513},[141,4128,1996],{"class":1382},[141,4130,1408],{"class":1386},[141,4132,4133,4135,4137],{"class":143,"line":1520},[141,4134,2003],{"class":1382},[141,4136,1387],{"class":1386},[141,4138,2008],{"class":151},[141,4140,4141,4143,4145],{"class":143,"line":2011},[141,4142,2014],{"class":1382},[141,4144,1387],{"class":1386},[141,4146,2019],{"class":151},[141,4148,4149,4151,4153,4155,4157],{"class":143,"line":2022},[141,4150,2025],{"class":1382},[141,4152,1387],{"class":1386},[141,4154,1771],{"class":1259},[141,4156,2032],{"class":151},[141,4158,2035],{"class":1259},[141,4160,4161,4163],{"class":143,"line":2038},[141,4162,2041],{"class":1382},[141,4164,1408],{"class":1386},[141,4166,4167,4169,4171],{"class":143,"line":2046},[141,4168,2049],{"class":1382},[141,4170,1387],{"class":1386},[141,4172,1984],{"class":151},[141,4174,4175,4177],{"class":143,"line":2056},[141,4176,2059],{"class":1382},[141,4178,1408],{"class":1386},[141,4180,4181,4183,4185],{"class":143,"line":2064},[141,4182,2067],{"class":1382},[141,4184,1387],{"class":1386},[141,4186,2072],{"class":151},[141,4188,4189,4191,4193],{"class":143,"line":2075},[141,4190,2078],{"class":1382},[141,4192,1387],{"class":1386},[141,4194,2083],{"class":151},[67,4196,4198],{"className":135,"code":4197,"language":137,"meta":13,"style":13},"flux get image update    \nNAME                    LAST RUN                    SUSPENDED   READY   MESSAGE                                                      \nimage-update-automation 2023-09-09T22:52:13+03:00   False       True    no updates made; last commit d984f3e at 2023-09-09T18:37:57Z    \n",[74,4199,4200,4213,4233],{"__ignoreMap":13},[141,4201,4202,4204,4206,4208,4211],{"class":143,"line":144},[141,4203,1125],{"class":158},[141,4205,990],{"class":151},[141,4207,1715],{"class":151},[141,4209,4210],{"class":151}," update",[141,4212,3113],{"class":621},[141,4214,4215,4217,4220,4223,4226,4228,4230],{"class":143,"line":155},[141,4216,1009],{"class":158},[141,4218,4219],{"class":151},"                    LAST",[141,4221,4222],{"class":151}," RUN",[141,4224,4225],{"class":151},"                    SUSPENDED",[141,4227,1147],{"class":151},[141,4229,1150],{"class":151},[141,4231,4232],{"class":621},"                                                      \n",[141,4234,4235,4238,4241,4243,4245,4248,4251,4254,4258,4261,4264,4267,4270],{"class":143,"line":168},[141,4236,4237],{"class":158},"image-update-automation",[141,4239,4240],{"class":151}," 2023-09-09T22:52:13+03:00",[141,4242,1846],{"class":151},[141,4244,1166],{"class":151},[141,4246,4247],{"class":151},"    no",[141,4249,4250],{"class":151}," updates",[141,4252,4253],{"class":151}," made",[141,4255,4257],{"class":4256},"sDxrV",";",[141,4259,4260],{"class":158}," last",[141,4262,4263],{"class":151}," commit",[141,4265,4266],{"class":151}," d984f3e",[141,4268,4269],{"class":151}," at",[141,4271,4272],{"class":151}," 2023-09-09T18:37:57Z\n",[15,4274,4275,4276,4281,4282],{},"It will cause an update on ",[731,4277,4278],{},[353,4279,4280],{},"./gitops/clusters/dev/kustomization.yaml"," by the placeholder ",[731,4283,4284],{},[353,4285,4286],{},"{\"$imagepolicy\": \"flux-system:blog-frontend:tag\"}",[67,4288,4290],{"className":1373,"code":4289,"language":1375,"meta":13,"style":13},"apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n  - ../base\npatches:\n  - path: patches/blog-frontend-image-policy.yaml\n    target:\n      group: image.toolkit.fluxcd.io\n      version: v1beta1\n      kind: ImagePolicy\n      namespace: flux-system\n      name: blog-frontend\n  - path: patches/blog-frontend-image-repository.yaml\n    target:\n      group: image.toolkit.fluxcd.io\n      version: v1beta1\n      kind: ImageRepository\n      namespace: flux-system\n      name: blog-frontend\n  - path: patches/image-update-automation.yaml\n    target:\n      group: image.toolkit.fluxcd.io\n      version: v1beta1\n      kind: ImageUpdateAutomation\n      namespace: flux-system\nimages:\n  - name: blog-frontend\n    newName: ghcr.io/devozs/blog-frontend\n    newTag: main-18c2d24e-1694278211 # {\"$imagepolicy\": \"flux-system:blog-frontend:tag\"}\n\n",[74,4291,4292,4301,4310,4317,4325,4332,4344,4351,4361,4371,4380,4389,4398,4409,4415,4423,4431,4439,4447,4455,4466,4472,4480,4488,4496,4504,4511,4522,4532],{"__ignoreMap":13},[141,4293,4294,4296,4298],{"class":143,"line":144},[141,4295,1383],{"class":1382},[141,4297,1387],{"class":1386},[141,4299,4300],{"class":151}," kustomize.config.k8s.io/v1beta1\n",[141,4302,4303,4305,4307],{"class":143,"line":155},[141,4304,1395],{"class":1382},[141,4306,1387],{"class":1386},[141,4308,4309],{"class":151}," Kustomization\n",[141,4311,4312,4315],{"class":143,"line":168},[141,4313,4314],{"class":1382},"resources",[141,4316,1408],{"class":1386},[141,4318,4319,4322],{"class":143,"line":660},[141,4320,4321],{"class":1386},"  -",[141,4323,4324],{"class":151}," ../base\n",[141,4326,4327,4330],{"class":143,"line":669},[141,4328,4329],{"class":1382},"patches",[141,4331,1408],{"class":1386},[141,4333,4334,4336,4339,4341],{"class":143,"line":678},[141,4335,4321],{"class":1386},[141,4337,4338],{"class":1382}," path",[141,4340,1387],{"class":1386},[141,4342,4343],{"class":151}," patches/blog-frontend-image-policy.yaml\n",[141,4345,4346,4349],{"class":143,"line":690},[141,4347,4348],{"class":1382},"    target",[141,4350,1408],{"class":1386},[141,4352,4353,4356,4358],{"class":143,"line":698},[141,4354,4355],{"class":1382},"      group",[141,4357,1387],{"class":1386},[141,4359,4360],{"class":151}," image.toolkit.fluxcd.io\n",[141,4362,4363,4366,4368],{"class":143,"line":708},[141,4364,4365],{"class":1382},"      version",[141,4367,1387],{"class":1386},[141,4369,4370],{"class":151}," v1beta1\n",[141,4372,4373,4376,4378],{"class":143,"line":717},[141,4374,4375],{"class":1382},"      kind",[141,4377,1387],{"class":1386},[141,4379,1561],{"class":151},[141,4381,4382,4385,4387],{"class":143,"line":1326},[141,4383,4384],{"class":1382},"      namespace",[141,4386,1387],{"class":1386},[141,4388,999],{"class":151},[141,4390,4391,4394,4396],{"class":143,"line":1479},[141,4392,4393],{"class":1382},"      name",[141,4395,1387],{"class":1386},[141,4397,3717],{"class":151},[141,4399,4400,4402,4404,4406],{"class":143,"line":1486},[141,4401,4321],{"class":1386},[141,4403,4338],{"class":1382},[141,4405,1387],{"class":1386},[141,4407,4408],{"class":151}," patches/blog-frontend-image-repository.yaml\n",[141,4410,4411,4413],{"class":143,"line":1495},[141,4412,4348],{"class":1382},[141,4414,1408],{"class":1386},[141,4416,4417,4419,4421],{"class":143,"line":1504},[141,4418,4355],{"class":1382},[141,4420,1387],{"class":1386},[141,4422,4360],{"class":151},[141,4424,4425,4427,4429],{"class":143,"line":1513},[141,4426,4365],{"class":1382},[141,4428,1387],{"class":1386},[141,4430,4370],{"class":151},[141,4432,4433,4435,4437],{"class":143,"line":1520},[141,4434,4375],{"class":1382},[141,4436,1387],{"class":1386},[141,4438,1653],{"class":151},[141,4440,4441,4443,4445],{"class":143,"line":2011},[141,4442,4384],{"class":1382},[141,4444,1387],{"class":1386},[141,4446,999],{"class":151},[141,4448,4449,4451,4453],{"class":143,"line":2022},[141,4450,4393],{"class":1382},[141,4452,1387],{"class":1386},[141,4454,3717],{"class":151},[141,4456,4457,4459,4461,4463],{"class":143,"line":2038},[141,4458,4321],{"class":1386},[141,4460,4338],{"class":1382},[141,4462,1387],{"class":1386},[141,4464,4465],{"class":151}," patches/image-update-automation.yaml\n",[141,4467,4468,4470],{"class":143,"line":2046},[141,4469,4348],{"class":1382},[141,4471,1408],{"class":1386},[141,4473,4474,4476,4478],{"class":143,"line":2056},[141,4475,4355],{"class":1382},[141,4477,1387],{"class":1386},[141,4479,4360],{"class":151},[141,4481,4482,4484,4486],{"class":143,"line":2064},[141,4483,4365],{"class":1382},[141,4485,1387],{"class":1386},[141,4487,4370],{"class":151},[141,4489,4490,4492,4494],{"class":143,"line":2075},[141,4491,4375],{"class":1382},[141,4493,1387],{"class":1386},[141,4495,1890],{"class":151},[141,4497,4498,4500,4502],{"class":143,"line":2790},[141,4499,4384],{"class":1382},[141,4501,1387],{"class":1386},[141,4503,999],{"class":151},[141,4505,4506,4509],{"class":143,"line":2802},[141,4507,4508],{"class":1382},"images",[141,4510,1408],{"class":1386},[141,4512,4513,4515,4518,4520],{"class":143,"line":2830},[141,4514,4321],{"class":1386},[141,4516,4517],{"class":1382}," name",[141,4519,1387],{"class":1386},[141,4521,3717],{"class":151},[141,4523,4524,4527,4529],{"class":143,"line":2842},[141,4525,4526],{"class":1382},"    newName",[141,4528,1387],{"class":1386},[141,4530,4531],{"class":151}," ghcr.io/devozs/blog-frontend\n",[141,4533,4534,4537,4539,4541],{"class":143,"line":2858},[141,4535,4536],{"class":1382},"    newTag",[141,4538,1387],{"class":1386},[141,4540,3950],{"class":151},[141,4542,4544],{"class":4543},"sr5Cr"," # {\"$imagepolicy\": \"flux-system:blog-frontend:tag\"}\n",[28,4546,4548],{"id":4547},"access-the-application-ui","Access the application UI",[15,4550,4551,4552,4557,4558,4562,4563,4568],{},"You can either set a ",[731,4553,4554],{},[353,4555,4556],{},"port-forward"," to the ",[731,4559,4560],{},[353,4561,3923],{}," service or add a DNS record with envoy ",[731,4564,4565],{},[353,4566,4567],{},"Load Balancer EXTERNAL-IP",".",[62,4570,4556],{"id":4556},[67,4572,4574],{"className":135,"code":4573,"language":137,"meta":13,"style":13},"kubectl port-forward -n blog service/blog-frontend 3000:3000\n\nForwarding from 127.0.0.1:3000 -> 3000\nForwarding from [::1]:3000 -> 3000\n\n",[74,4575,4576,4594,4598,4616],{"__ignoreMap":13},[141,4577,4578,4580,4583,4585,4588,4591],{"class":143,"line":144},[141,4579,987],{"class":158},[141,4581,4582],{"class":151}," port-forward",[141,4584,996],{"class":848},[141,4586,4587],{"class":151}," blog",[141,4589,4590],{"class":151}," service/blog-frontend",[141,4592,4593],{"class":151}," 3000:3000\n",[141,4595,4596],{"class":143,"line":155},[141,4597,1004],{"emptyLinePlaceholder":487},[141,4599,4600,4603,4605,4608,4611,4613],{"class":143,"line":168},[141,4601,4602],{"class":158},"Forwarding",[141,4604,1783],{"class":151},[141,4606,4607],{"class":151}," 127.0.0.1:3000",[141,4609,4610],{"class":621}," -",[141,4612,2407],{"class":916},[141,4614,4615],{"class":852}," 3000\n",[141,4617,4618,4620,4622,4625,4627],{"class":143,"line":660},[141,4619,4602],{"class":158},[141,4621,1783],{"class":151},[141,4623,4624],{"class":621}," [::1]:3000 -",[141,4626,2407],{"class":916},[141,4628,4615],{"class":621},[62,4630,4631],{"id":4631},"contour",[15,4633,4634,4635,4640],{},"As part of the deployment we are also using ",[18,4636,4639],{"href":4637,"rel":4638},"https://projectcontour.io/",[22],"Contour"," as ingress controller.",[15,4642,4643,4644,4648],{},"Once the services are deployed you can get envoy ",[731,4645,4646],{},[353,4647,4567],{},". for example: 20.xx.xx.224 and add a DNS A record in your domain provider.",[67,4650,4652],{"className":135,"code":4651,"language":137,"meta":13,"style":13},"kubectl get services -n projectcontour \n\nNAME      TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE\ncontour   ClusterIP      10.0.89.98     \u003Cnone>         8001/TCP                     24h\nenvoy     LoadBalancer   10.0.253.112   20.xx.xx.224   80:30395/TCP,443:31965/TCP   24h\n\n",[74,4653,4654,4670,4674,4701,4728],{"__ignoreMap":13},[141,4655,4656,4658,4660,4663,4665,4668],{"class":143,"line":144},[141,4657,987],{"class":158},[141,4659,990],{"class":151},[141,4661,4662],{"class":151}," services",[141,4664,996],{"class":848},[141,4666,4667],{"class":151}," projectcontour",[141,4669,3196],{"class":621},[141,4671,4672],{"class":143,"line":155},[141,4673,1004],{"emptyLinePlaceholder":487},[141,4675,4676,4678,4681,4684,4687,4690,4693,4696,4698],{"class":143,"line":168},[141,4677,1009],{"class":158},[141,4679,4680],{"class":151},"      TYPE",[141,4682,4683],{"class":151},"           CLUSTER-IP",[141,4685,4686],{"class":151},"     EXTERNAL-IP",[141,4688,4689],{"class":151},"    PORT",[141,4691,4692],{"class":1386},"(",[141,4694,4695],{"class":158},"S",[141,4697,1355],{"class":1386},[141,4699,4700],{"class":151},"                      AGE\n",[141,4702,4703,4705,4708,4711,4714,4717,4720,4722,4725],{"class":143,"line":660},[141,4704,4631],{"class":158},[141,4706,4707],{"class":151},"   ClusterIP",[141,4709,4710],{"class":852},"      10.0.89.98",[141,4712,4713],{"class":916},"     \u003C",[141,4715,4716],{"class":151},"non",[141,4718,4719],{"class":621},"e",[141,4721,2407],{"class":916},[141,4723,4724],{"class":151},"         8001/TCP",[141,4726,4727],{"class":151},"                     24h\n",[141,4729,4730,4733,4736,4739,4742,4745],{"class":143,"line":669},[141,4731,4732],{"class":158},"envoy",[141,4734,4735],{"class":151},"     LoadBalancer",[141,4737,4738],{"class":852},"   10.0.253.112",[141,4740,4741],{"class":151},"   20.xx.xx.224",[141,4743,4744],{"class":151},"   80:30395/TCP,443:31965/TCP",[141,4746,4747],{"class":151},"   24h\n",[444,4749,4750],{},"html pre.shiki code .sNHwn, html code.shiki .sNHwn{--shiki-default:#88C0D0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .siq7d, html code.shiki .siq7d{--shiki-default:#A3BE8C;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sqTyp, html code.shiki .sqTyp{--shiki-default:#A3BE8C;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sX_qU, html code.shiki .sX_qU{--shiki-default:#B48EAD;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s4BcI, html code.shiki .s4BcI{--shiki-default:#81A1C1;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sn_7u, html code.shiki .sn_7u{--shiki-default:#D8DEE9;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sQE_P, html code.shiki .sQE_P{--shiki-default:#ECEFF4;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sw3Zv, html code.shiki .sw3Zv{--shiki-default:#D8DEE9FF;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .skFRX, html code.shiki .skFRX{--shiki-default:#8FBCBB;--shiki-dark:#85E89D;--shiki-sepia:#F92672}html pre.shiki code .sUaCP, html code.shiki .sUaCP{--shiki-default:#ECEFF4;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siby6, html code.shiki .siby6{--shiki-default:#D8DEE9FF;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sDxrV, html code.shiki .sDxrV{--shiki-default:#81A1C1;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sr5Cr, html code.shiki .sr5Cr{--shiki-default:#616E88;--shiki-dark:#6A737D;--shiki-sepia:#88846F}",{"title":13,"searchDepth":155,"depth":155,"links":4752},[4753,4754,4755,4759,4763,4764,4765],{"id":521,"depth":155,"text":522},{"id":553,"depth":155,"text":554},{"id":2241,"depth":155,"text":2242,"children":4756},[4757,4758],{"id":967,"depth":168,"text":968},{"id":1111,"depth":168,"text":1112},{"id":1334,"depth":155,"text":1335,"children":4760},[4761,4762],{"id":1358,"depth":168,"text":1359},{"id":3441,"depth":168,"text":3442},{"id":3606,"depth":155,"text":3607},{"id":1529,"depth":155,"text":1530},{"id":4547,"depth":155,"text":4548,"children":4766},[4767,4768],{"id":4556,"depth":168,"text":4556},{"id":4631,"depth":168,"text":4631},"2023-09-10T08:00:00.000Z","GitOps, CD, Deployment, FluxCD",{"published":487},"/blog/2023/09/10/continuence-deployment-flux",{"title":2119,"description":2124},"continuence-deployment","blog/2023/09/10/continuence-deployment-flux",[2112,2113,811,499],"uLuop-k74KATaQGXfpqX0N1YyFtdqJy4eWN791_QdrA",{"id":4779,"title":4780,"author":6,"body":4781,"cover":5415,"date":5416,"description":4785,"draft":482,"excerpt":483,"extension":484,"github":5417,"keywords":5418,"meta":5419,"navigation":487,"path":5420,"seo":5421,"shortDesc":483,"slug":5422,"stem":5423,"tags":5424,"video":483,"__hash__":5427},"blog/blog/2023/09/08/Infrastructure-azure-terraform.md","Infrastructure As Code",{"type":8,"value":4782,"toc":5408},[4783,4786,4788,4791,4805,4808,4811,4838,4846,4849,4859,4929,4933,4936,5027,5159,5161,5169,5212,5215,5273,5276,5370,5374,5402,5405],[15,4784,4785],{},"In the upcoming blog post, we will establish the foundational infrastructure that will be pivotal throughout the remaining CI & CD tutorials.",[28,4787,522],{"id":521},[15,4789,4790],{},"For this purpose, I've opted to utilize Azure Kubernetes Service (AKS) and Terraform. However, it's worth noting that you have the flexibility to choose from a variety of providers, including GCP, EKS, or any other Kubernetes service that suits your needs.",[11,4792,4793,4796],{"type":542},[15,4794,4795],{},"Persisting Terraform State!",[894,4797,4798],{"v-slot:details":13},[15,4799,4800,4801],{},"I'm utilizing Azure Blob Storage as the backend for storing the Terraform state, but it's important to mention that you have the option to select an alternative backend or even forgo state persistence altogether.",[18,4802,562],{"href":4803,"rel":4804},"https://developer.hashicorp.com/terraform/language/settings/backends/configuration",[22],[28,4806,497],{"id":4807},"terraform",[15,4809,4810],{},"We are about to buildthe following:",[36,4812,4813,4816,4827],{},[39,4814,4815],{},"Simple AKS",[39,4817,4818,4819],{},"Terrafor will create for us two resource groups:\n",[36,4820,4821,4824],{},[39,4822,4823],{},"one to hold AKS itself (and other resources like key vault for example if being used)",[39,4825,4826],{},"the second for node pools, load balancer, volumes etc.",[39,4828,4829,4830],{},"We have devided it into two node pools:\n",[36,4831,4832,4835],{},[39,4833,4834],{},"System PODs (only_critical_addons_enabled)",[39,4836,4837],{},"Management PODs (our application).",[15,4839,4840,4841],{},"More information about Terraform and AKS can be found ",[18,4842,4845],{"href":4843,"rel":4844},"https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster",[22],"Here",[15,4847,4848],{},"Update azure/aks/variables.tf and azure/environment/dev/backend.conf files.",[11,4850,4851,4854],{"type":542},[15,4852,4853],{},"Cloud provide CLI init",[894,4855,4856],{"v-slot:details":13},[15,4857,4858],{},"Before executing Terraform CLI make sure to login to init the relevant provider (i.e. az login, gcloud init etc.) depends on the backend you are using.",[67,4860,4862],{"className":135,"code":4861,"language":137,"meta":13,"style":13},"cd infra/terraform/azure\nterraform -chdir='aks' init -backend-config=../environment/dev/backend.conf -reconfigure\nterraform -chdir='aks' plan -var-file=../environment/dev/.tfvars\nterraform -chdir='aks' apply -var-file=../environment/dev/.tfvars\n",[74,4863,4864,4871,4894,4912],{"__ignoreMap":13},[141,4865,4866,4868],{"class":143,"line":144},[141,4867,148],{"class":147},[141,4869,4870],{"class":151}," infra/terraform/azure\n",[141,4872,4873,4875,4878,4880,4883,4885,4888,4891],{"class":143,"line":155},[141,4874,4807],{"class":158},[141,4876,4877],{"class":848}," -chdir=",[141,4879,1777],{"class":1259},[141,4881,4882],{"class":151},"aks",[141,4884,1777],{"class":1259},[141,4886,4887],{"class":151}," init",[141,4889,4890],{"class":848}," -backend-config=../environment/dev/backend.conf",[141,4892,4893],{"class":848}," -reconfigure\n",[141,4895,4896,4898,4900,4902,4904,4906,4909],{"class":143,"line":168},[141,4897,4807],{"class":158},[141,4899,4877],{"class":848},[141,4901,1777],{"class":1259},[141,4903,4882],{"class":151},[141,4905,1777],{"class":1259},[141,4907,4908],{"class":151}," plan",[141,4910,4911],{"class":848}," -var-file=../environment/dev/.tfvars\n",[141,4913,4914,4916,4918,4920,4922,4924,4927],{"class":143,"line":660},[141,4915,4807],{"class":158},[141,4917,4877],{"class":848},[141,4919,1777],{"class":1259},[141,4921,4882],{"class":151},[141,4923,1777],{"class":1259},[141,4925,4926],{"class":151}," apply",[141,4928,4911],{"class":848},[28,4930,4932],{"id":4931},"azure-kubernetes-service","Azure Kubernetes Service",[15,4934,4935],{},"If everything went well at the prevois step you should have a working AKS.\nGo to Azure portal and search for AKS instances or use the Azure CLI and kubectl.",[67,4937,4939],{"className":135,"code":4938,"language":137,"meta":13,"style":13},"az aks list\n\n[\n  {\n    \"aadProfile\": null,\n    \"addonProfiles\": null,\n    \"agentPoolProfiles\": [\n      {}\n    ]\n  }\n  ...\n]\n",[74,4940,4941,4950,4954,4959,4964,4977,4988,5002,5007,5012,5017,5022],{"__ignoreMap":13},[141,4942,4943,4945,4947],{"class":143,"line":144},[141,4944,2262],{"class":158},[141,4946,2265],{"class":151},[141,4948,4949],{"class":151}," list\n",[141,4951,4952],{"class":143,"line":155},[141,4953,1004],{"emptyLinePlaceholder":487},[141,4955,4956],{"class":143,"line":168},[141,4957,4958],{"class":1386},"[\n",[141,4960,4961],{"class":143,"line":660},[141,4962,4963],{"class":621},"  {\n",[141,4965,4966,4969,4972,4974],{"class":143,"line":669},[141,4967,4968],{"class":1259},"    \"",[141,4970,4971],{"class":151},"aadProfile",[141,4973,1266],{"class":1259},[141,4975,4976],{"class":621},": null,\n",[141,4978,4979,4981,4984,4986],{"class":143,"line":678},[141,4980,4968],{"class":1259},[141,4982,4983],{"class":151},"addonProfiles",[141,4985,1266],{"class":1259},[141,4987,4976],{"class":621},[141,4989,4990,4992,4995,4997,5000],{"class":143,"line":690},[141,4991,4968],{"class":1259},[141,4993,4994],{"class":151},"agentPoolProfiles",[141,4996,1266],{"class":1259},[141,4998,4999],{"class":621},": ",[141,5001,4958],{"class":1386},[141,5003,5004],{"class":143,"line":698},[141,5005,5006],{"class":621},"      {}\n",[141,5008,5009],{"class":143,"line":708},[141,5010,5011],{"class":1386},"    ]\n",[141,5013,5014],{"class":143,"line":717},[141,5015,5016],{"class":621},"  }\n",[141,5018,5019],{"class":143,"line":1326},[141,5020,5021],{"class":621},"  ...\n",[141,5023,5024],{"class":143,"line":1479},[141,5025,5026],{"class":1386},"]\n",[67,5028,5030],{"className":135,"code":5029,"language":137,"meta":13,"style":13},"kubectl get nodes -owide\n\nNAME                                 STATUS   ROLES   AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\naks-management-41779884-vmss000001   Ready    agent   15s   v1.26.6   10.224.0.100   \u003Cnone>        Ubuntu 22.04.3 LTS   5.15.0-1042-azure   containerd://1.7.1+azure-1\naks-system-18952855-vmss000000       Ready    agent   29h   v1.26.6   10.224.0.4     \u003Cnone>        Ubuntu 22.04.3 LTS   5.15.0-1042-azure   containerd://1.7.1+azure-1\n\n",[74,5031,5032,5044,5048,5079,5123],{"__ignoreMap":13},[141,5033,5034,5036,5038,5041],{"class":143,"line":144},[141,5035,987],{"class":158},[141,5037,990],{"class":151},[141,5039,5040],{"class":151}," nodes",[141,5042,5043],{"class":848}," -owide\n",[141,5045,5046],{"class":143,"line":155},[141,5047,1004],{"emptyLinePlaceholder":487},[141,5049,5050,5052,5055,5058,5061,5064,5067,5070,5073,5076],{"class":143,"line":168},[141,5051,1009],{"class":158},[141,5053,5054],{"class":151},"                                 STATUS",[141,5056,5057],{"class":151},"   ROLES",[141,5059,5060],{"class":151},"   AGE",[141,5062,5063],{"class":151},"   VERSION",[141,5065,5066],{"class":151},"   INTERNAL-IP",[141,5068,5069],{"class":151},"    EXTERNAL-IP",[141,5071,5072],{"class":151},"   OS-IMAGE",[141,5074,5075],{"class":151},"             KERNEL-VERSION",[141,5077,5078],{"class":151},"      CONTAINER-RUNTIME\n",[141,5080,5081,5084,5087,5090,5093,5096,5099,5102,5104,5106,5108,5111,5114,5117,5120],{"class":143,"line":660},[141,5082,5083],{"class":158},"aks-management-41779884-vmss000001",[141,5085,5086],{"class":151},"   Ready",[141,5088,5089],{"class":151},"    agent",[141,5091,5092],{"class":151},"   15s",[141,5094,5095],{"class":151},"   v1.26.6",[141,5097,5098],{"class":852},"   10.224.0.100",[141,5100,5101],{"class":916},"   \u003C",[141,5103,4716],{"class":151},[141,5105,4719],{"class":621},[141,5107,2407],{"class":916},[141,5109,5110],{"class":151},"        Ubuntu",[141,5112,5113],{"class":852}," 22.04.3",[141,5115,5116],{"class":151}," LTS",[141,5118,5119],{"class":151},"   5.15.0-1042-azure",[141,5121,5122],{"class":151},"   containerd://1.7.1+azure-1\n",[141,5124,5125,5128,5131,5133,5136,5138,5141,5143,5145,5147,5149,5151,5153,5155,5157],{"class":143,"line":669},[141,5126,5127],{"class":158},"aks-system-18952855-vmss000000",[141,5129,5130],{"class":151},"       Ready",[141,5132,5089],{"class":151},[141,5134,5135],{"class":151},"   29h",[141,5137,5095],{"class":151},[141,5139,5140],{"class":852},"   10.224.0.4",[141,5142,4713],{"class":916},[141,5144,4716],{"class":151},[141,5146,4719],{"class":621},[141,5148,2407],{"class":916},[141,5150,5110],{"class":151},[141,5152,5113],{"class":852},[141,5154,5116],{"class":151},[141,5156,5119],{"class":151},[141,5158,5122],{"class":151},[28,5160,3607],{"id":3606},[15,5162,5163,5164],{},"We`ll be a simple web application just to test a POD deployment.\n",[18,5165,5168],{"href":5166,"rel":5167},"https://github.com/stefanprodan/podinfo",[22],"Here is a useful implementation",[67,5170,5172],{"className":135,"code":5171,"language":137,"meta":13,"style":13},"kubectl apply -k github.com/stefanprodan/podinfo/kustomize\n\nservice/podinfo created\ndeployment.apps/podinfo created\nhorizontalpodautoscaler.autoscaling/podinfo created\n\n",[74,5173,5174,5186,5190,5198,5205],{"__ignoreMap":13},[141,5175,5176,5178,5180,5183],{"class":143,"line":144},[141,5177,987],{"class":158},[141,5179,4926],{"class":151},[141,5181,5182],{"class":848}," -k",[141,5184,5185],{"class":151}," github.com/stefanprodan/podinfo/kustomize\n",[141,5187,5188],{"class":143,"line":155},[141,5189,1004],{"emptyLinePlaceholder":487},[141,5191,5192,5195],{"class":143,"line":168},[141,5193,5194],{"class":158},"service/podinfo",[141,5196,5197],{"class":151}," created\n",[141,5199,5200,5203],{"class":143,"line":660},[141,5201,5202],{"class":158},"deployment.apps/podinfo",[141,5204,5197],{"class":151},[141,5206,5207,5210],{"class":143,"line":669},[141,5208,5209],{"class":158},"horizontalpodautoscaler.autoscaling/podinfo",[141,5211,5197],{"class":151},[15,5213,5214],{},"Check the PODs are running",[67,5216,5218],{"className":135,"code":5217,"language":137,"meta":13,"style":13},"kubectl get pod\n\nNAME                       READY   STATUS    RESTARTS   AGE\npodinfo-6c77b54bb8-9vgd2   1/1     Running   0          25m\npodinfo-6c77b54bb8-cnnc8   1/1     Running   0          25m\n\n",[74,5219,5220,5229,5233,5246,5260],{"__ignoreMap":13},[141,5221,5222,5224,5226],{"class":143,"line":144},[141,5223,987],{"class":158},[141,5225,990],{"class":151},[141,5227,5228],{"class":151}," pod\n",[141,5230,5231],{"class":143,"line":155},[141,5232,1004],{"emptyLinePlaceholder":487},[141,5234,5235,5237,5240,5242,5244],{"class":143,"line":168},[141,5236,1009],{"class":158},[141,5238,5239],{"class":151},"                       READY",[141,5241,1015],{"class":151},[141,5243,1018],{"class":151},[141,5245,1021],{"class":151},[141,5247,5248,5251,5253,5255,5257],{"class":143,"line":660},[141,5249,5250],{"class":158},"podinfo-6c77b54bb8-9vgd2",[141,5252,1046],{"class":151},[141,5254,1032],{"class":151},[141,5256,1035],{"class":852},[141,5258,5259],{"class":151},"          25m\n",[141,5261,5262,5265,5267,5269,5271],{"class":143,"line":669},[141,5263,5264],{"class":158},"podinfo-6c77b54bb8-cnnc8",[141,5266,1046],{"class":151},[141,5268,1032],{"class":151},[141,5270,1035],{"class":852},[141,5272,5259],{"class":151},[15,5274,5275],{},"Remove the podinfo resources",[67,5277,5279],{"className":135,"code":5278,"language":137,"meta":13,"style":13},"kubectl delete -k github.com/stefanprodan/podinfo/kustomize\n\nservice \"podinfo\" deleted\ndeployment.apps \"podinfo\" deleted\nhorizontalpodautoscaler.autoscaling \"podinfo\" deleted\n\nkubectl get pod                                            \nNo resources found in default namespace.\n",[74,5280,5281,5292,5296,5311,5324,5337,5341,5352],{"__ignoreMap":13},[141,5282,5283,5285,5288,5290],{"class":143,"line":144},[141,5284,987],{"class":158},[141,5286,5287],{"class":151}," delete",[141,5289,5182],{"class":848},[141,5291,5185],{"class":151},[141,5293,5294],{"class":143,"line":155},[141,5295,1004],{"emptyLinePlaceholder":487},[141,5297,5298,5301,5303,5306,5308],{"class":143,"line":168},[141,5299,5300],{"class":158},"service",[141,5302,1260],{"class":1259},[141,5304,5305],{"class":151},"podinfo",[141,5307,1266],{"class":1259},[141,5309,5310],{"class":151}," deleted\n",[141,5312,5313,5316,5318,5320,5322],{"class":143,"line":660},[141,5314,5315],{"class":158},"deployment.apps",[141,5317,1260],{"class":1259},[141,5319,5305],{"class":151},[141,5321,1266],{"class":1259},[141,5323,5310],{"class":151},[141,5325,5326,5329,5331,5333,5335],{"class":143,"line":669},[141,5327,5328],{"class":158},"horizontalpodautoscaler.autoscaling",[141,5330,1260],{"class":1259},[141,5332,5305],{"class":151},[141,5334,1266],{"class":1259},[141,5336,5310],{"class":151},[141,5338,5339],{"class":143,"line":678},[141,5340,1004],{"emptyLinePlaceholder":487},[141,5342,5343,5345,5347,5349],{"class":143,"line":690},[141,5344,987],{"class":158},[141,5346,990],{"class":151},[141,5348,993],{"class":151},[141,5350,5351],{"class":621},"                                            \n",[141,5353,5354,5357,5360,5362,5364,5367],{"class":143,"line":698},[141,5355,5356],{"class":158},"No",[141,5358,5359],{"class":151}," resources",[141,5361,1857],{"class":151},[141,5363,2573],{"class":151},[141,5365,5366],{"class":151}," default",[141,5368,5369],{"class":151}," namespace.\n",[28,5371,5373],{"id":5372},"cleanup-resource","Cleanup Resource",[67,5375,5377],{"className":135,"code":5376,"language":137,"meta":13,"style":13},"cd infra/terraform/azure\nterraform -chdir='aks' destroy -var-file=../environment/dev/.tfvars\n",[74,5378,5379,5385],{"__ignoreMap":13},[141,5380,5381,5383],{"class":143,"line":144},[141,5382,148],{"class":147},[141,5384,4870],{"class":151},[141,5386,5387,5389,5391,5393,5395,5397,5400],{"class":143,"line":155},[141,5388,4807],{"class":158},[141,5390,4877],{"class":848},[141,5392,1777],{"class":1259},[141,5394,4882],{"class":151},[141,5396,1777],{"class":1259},[141,5398,5399],{"class":151}," destroy",[141,5401,4911],{"class":848},[15,5403,5404],{},"Also remember to delete BlobStorage or any other backend that you have used for the Terraform state and any other resource that you have created manualy.",[444,5406,5407],{},"html pre.shiki code .sCWj5, html code.shiki .sCWj5{--shiki-default:#88C0D0;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .siq7d, html code.shiki .siq7d{--shiki-default:#A3BE8C;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sNHwn, html code.shiki .sNHwn{--shiki-default:#88C0D0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sqTyp, html code.shiki .sqTyp{--shiki-default:#A3BE8C;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sQE_P, html code.shiki .sQE_P{--shiki-default:#ECEFF4;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sUaCP, html code.shiki .sUaCP{--shiki-default:#ECEFF4;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sw3Zv, html code.shiki .sw3Zv{--shiki-default:#D8DEE9FF;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sX_qU, html code.shiki .sX_qU{--shiki-default:#B48EAD;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s4BcI, html code.shiki .s4BcI{--shiki-default:#81A1C1;--shiki-dark:#F97583;--shiki-sepia:#F92672}",{"title":13,"searchDepth":155,"depth":155,"links":5409},[5410,5411,5412,5413,5414],{"id":521,"depth":155,"text":522},{"id":4807,"depth":155,"text":497},{"id":4931,"depth":155,"text":4932},{"id":3606,"depth":155,"text":3607},{"id":5372,"depth":155,"text":5373},"./infra.png","2023-09-08T08:00:00.000Z","https://github.com/devozs/blog-deployment/tree/main/infra/terraform/azure","IaC, Infra, Azure, AKS, Terraform",{"published":487},"/blog/2023/09/08/infrastructure-azure-terraform",{"title":4780,"description":4785},"infrastructure-azure-terraform","blog/2023/09/08/Infrastructure-azure-terraform",[493,494,5425,5426,497],"Azure","AKS","vJX4TS3MBcjWpEvB4Y0RozC5VYfxqzZXGDBQ_R4BVIY"]