{"id":46538,"date":"2024-06-15T03:17:59","date_gmt":"2024-06-15T03:17:59","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=46538"},"modified":"2024-06-15T03:17:59","modified_gmt":"2024-06-15T03:17:59","slug":"gitops-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/gitops-tutorial\/","title":{"rendered":"GitOps Tutorial"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"623\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2024\/06\/image-9-1024x623.png\" alt=\"\" class=\"wp-image-46539\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2024\/06\/image-9-1024x623.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2024\/06\/image-9-300x183.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2024\/06\/image-9-768x467.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2024\/06\/image-9.png 1101w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Introduction to GitOps<\/h3>\n\n\n\n<p>GitOps is a modern approach to managing infrastructure and application deployments using Git as the single source of truth. It leverages Git repositories to store declarative infrastructure and application code, which is then automatically applied to the desired environments by continuous delivery (CD) systems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Benefits of GitOps<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Version Control<\/strong>: All changes are versioned and auditable.<\/li>\n\n\n\n<li><strong>Collaboration<\/strong>: Facilitates collaboration among team members.<\/li>\n\n\n\n<li><strong>Automation<\/strong>: Reduces manual intervention through automation.<\/li>\n\n\n\n<li><strong>Consistency<\/strong>: Ensures consistent deployments across environments.<\/li>\n\n\n\n<li><strong>Rollback<\/strong>: Easy rollback to previous stable states.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Core Concepts of GitOps<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Declarative Infrastructure<\/strong>: Describing the desired state of your system using declarative code.<\/li>\n\n\n\n<li><strong>Continuous Deployment<\/strong>: Automated processes to apply changes to the system.<\/li>\n\n\n\n<li><strong>Git as the Source of Truth<\/strong>: Using Git repositories to manage the desired state and changes.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"1040\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2024\/06\/1718103648584.gif\" alt=\"\" class=\"wp-image-46540\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisites<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Basic knowledge of Git and version control.<\/li>\n\n\n\n<li>Familiarity with Kubernetes and container orchestration.<\/li>\n\n\n\n<li>Understanding of Infrastructure as Code (IaC) tools like Terraform or Ansible.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Setting Up a GitOps Environment<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Tools Required<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Git Repository<\/strong>: GitHub, GitLab, Bitbucket, etc.<\/li>\n\n\n\n<li><strong>Kubernetes Cluster<\/strong>: Minikube, EKS, GKE, AKS, etc.<\/li>\n\n\n\n<li><strong>GitOps Operator<\/strong>: Flux, Argo CD, etc.<\/li>\n\n\n\n<li><strong>CI\/CD Pipeline<\/strong>: Jenkins, GitHub Actions, GitLab CI, etc.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Step-by-Step Guide<\/h4>\n\n\n\n<h3 class=\"wp-block-heading\"><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Step <span class=\"hljs-number\">1<\/span>: Setting Up Your Git Repository\nCreate a Git Repository: <span class=\"hljs-built_in\">Set<\/span> up a <span class=\"hljs-keyword\">new<\/span> repository on your preferred Git hosting service.\n\ngit init my-gitops-repo\ncd my-gitops-repo\nCreate Directory Structure:\n\n\nmkdir -p k8s\/{base,overlays}\nAdd Sample Kubernetes Manifests:\n\nk8s\/base\/deployment.yaml:\n\n\napiVersion: apps\/v1\n<span class=\"hljs-attr\">kind<\/span>: Deployment\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: my-app\n  <span class=\"hljs-attr\">namespace<\/span>: <span class=\"hljs-keyword\">default<\/span>\n<span class=\"hljs-attr\">spec<\/span>:\n  replicas: <span class=\"hljs-number\">2<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    matchLabels:\n      app: my-app\n  <span class=\"hljs-attr\">template<\/span>:\n    metadata:\n      labels:\n        app: my-app\n    <span class=\"hljs-attr\">spec<\/span>:\n      containers:\n        - name: my-app\n          <span class=\"hljs-attr\">image<\/span>: my-app-image:latest\n          <span class=\"hljs-attr\">ports<\/span>:\n            - containerPort: <span class=\"hljs-number\">80<\/span>\nk8s\/base\/service.yaml:\n\n\napiVersion: v1\n<span class=\"hljs-attr\">kind<\/span>: Service\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: my-app\n  <span class=\"hljs-attr\">namespace<\/span>: <span class=\"hljs-keyword\">default<\/span>\n<span class=\"hljs-attr\">spec<\/span>:\n  selector:\n    app: my-app\n  <span class=\"hljs-attr\">ports<\/span>:\n    - protocol: TCP\n      <span class=\"hljs-attr\">port<\/span>: <span class=\"hljs-number\">80<\/span>\n      <span class=\"hljs-attr\">targetPort<\/span>: <span class=\"hljs-number\">80<\/span>\n  <span class=\"hljs-attr\">type<\/span>: LoadBalancer\nCommit and Push Changes:\n\n\ngit add .\ngit commit -m <span class=\"hljs-string\">\"Initial commit with Kubernetes manifests\"<\/span>\ngit push origin main\nStep <span class=\"hljs-number\">2<\/span>: Setting Up the Kubernetes Cluster\nInstall Minikube (local environment):\n\n\nminikube start\nConfigure kubectl:\n\n\nkubectl config use-context minikube\nStep <span class=\"hljs-number\">3<\/span>: Installing GitOps Operator\nUsing Flux\nInstall Flux CLI:\n\n\ncurl -s https:<span class=\"hljs-comment\">\/\/fluxcd.io\/install.sh | sudo bash<\/span>\nBootstrap Flux:\n\n\nflux bootstrap github \\\n  --owner=your-github-username \\\n  --repository=my-gitops-repo \\\n  --branch=main \\\n  --path=.\/k8s \\\n  --personal\nUsing Argo CD\nInstall Argo CD:\n\n\nkubectl create namespace argocd\nkubectl apply -n argocd -f https:<span class=\"hljs-comment\">\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml<\/span>\nAccess Argo CD UI:\n\n\nkubectl port-forward svc\/argocd-server -n argocd <span class=\"hljs-number\">8080<\/span>:<span class=\"hljs-number\">443<\/span>\nLogin to Argo CD:\n\nbash\nCopy code\nargocd login localhost:<span class=\"hljs-number\">8080<\/span>\nRegister the Git Repository:\n\n\nargocd repo add https:<span class=\"hljs-comment\">\/\/github.com\/your-github-username\/my-gitops-repo.git<\/span>\nCreate an Application <span class=\"hljs-keyword\">in<\/span> Argo CD:\n\n\nargocd app create my-app \\\n  --repo https:<span class=\"hljs-comment\">\/\/github.com\/your-github-username\/my-gitops-repo.git \\<\/span>\n  --path k8s\/base \\\n  --dest-server https:<span class=\"hljs-comment\">\/\/kubernetes.default.svc \\<\/span>\n  --dest-namespace <span class=\"hljs-keyword\">default<\/span>\nSync the Application:\n\n\nargocd app sync my-app\nStep <span class=\"hljs-number\">4<\/span>: Automating CI\/CD Pipeline\n<span class=\"hljs-built_in\">Set<\/span> Up GitHub Actions (example):\n\n.github\/workflows\/deploy.yml:\n\n\nname: Deploy to Kubernetes\n\n<span class=\"hljs-attr\">on<\/span>:\n  push:\n    branches:\n      - main\n\n<span class=\"hljs-attr\">jobs<\/span>:\n  build:\n    runs-on: ubuntu-latest\n\n    <span class=\"hljs-attr\">steps<\/span>:\n      - name: Checkout code\n        <span class=\"hljs-attr\">uses<\/span>: actions\/checkout@v2\n\n      - name: <span class=\"hljs-built_in\">Set<\/span> up Kubernetes\n        <span class=\"hljs-attr\">uses<\/span>: azure\/setup-kubectl@v1\n        <span class=\"hljs-attr\">with<\/span>:\n          version: <span class=\"hljs-string\">'latest'<\/span>\n\n      - name: Deploy to Kubernetes\n        <span class=\"hljs-attr\">run<\/span>: |\n          kubectl apply -f k8s\/base\nCommit and Push the Workflow:\n\n\ngit add .github\/workflows\/deploy.yml\ngit commit -m <span class=\"hljs-string\">\"Add GitHub Actions workflow for deployment\"<\/span>\ngit push origin main\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>GitOps provides a robust and scalable way to manage infrastructure and application deployments. By using Git as the single source of truth and leveraging continuous delivery tools, you can achieve reliable and automated deployments. Follow this comprehensive guide to set up your GitOps environment and reap the benefits of this modern approach to DevOps.<\/p>\n\n\n\n<p>For further reading and advanced topics, consider exploring:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Advanced GitOps patterns and practices.<\/li>\n\n\n\n<li>Integrating Helm with GitOps.<\/li>\n\n\n\n<li>Managing multi-cluster environments with GitOps.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">References<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a>Flux Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/argo-cd.readthedocs.io\/\" target=\"_blank\" rel=\"noopener\">Argo CD Documentation<\/a><\/li>\n\n\n\n<li><a>Kubernetes Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\" target=\"_blank\" rel=\"noopener\">GitHub Actions Documentation<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Introduction to GitOps GitOps is a modern approach to managing infrastructure and application deployments using Git as the single source of truth. It leverages Git repositories to store declarative infrastructure&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-46538","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/46538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=46538"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/46538\/revisions"}],"predecessor-version":[{"id":46541,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/46538\/revisions\/46541"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=46538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=46538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=46538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}