<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Pongsan Sayampol</title>
    <description>The latest articles on Forem by Pongsan Sayampol (@aonz).</description>
    <link>https://forem.com/aonz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F680469%2F2bbab0bf-39ca-46e9-93f7-3c0e9d736dda.jpg</url>
      <title>Forem: Pongsan Sayampol</title>
      <link>https://forem.com/aonz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aonz"/>
    <language>en</language>
    <item>
      <title>วิธีการติดตั้งและใช้งาน Flux (GitOps tool) บน Amazon EKS - Part 1</title>
      <dc:creator>Pongsan Sayampol</dc:creator>
      <pubDate>Wed, 15 Sep 2021 06:28:37 +0000</pubDate>
      <link>https://forem.com/awscommunity-asean/flux-gitops-tool-amazon-eks-part-1-4gla</link>
      <guid>https://forem.com/awscommunity-asean/flux-gitops-tool-amazon-eks-part-1-4gla</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;GitOps[1] เป็นการนำ tool, best practice และประโยชน์ต่างๆจาก Git และ Continuous Integration/Continuous Delivery (CI/CD) ที่มีการใช้งานกันเป็น standard ใน Software Development Life Cycle (SDLC) มาใช้ร่วมกับ Infrastructure as Code (IaC) ในทางฝั่งของ IT operation เพื่อจัดการกับ infrastructure ต่างๆ&lt;/p&gt;

&lt;p&gt;Flux[2] เป็นหนึ่งใน GitOps tool ที่ได้รับได้ความนิยมในปัจจุบัน เพื่อใช้การใช้จัดการ resource ต่างๆบน Kubernetes cluster โดย version ที่ใช้ในปัจจุบันคือ Flux v2 ซึ่งตัว Flux operator ใน cluster จะทำการ pull ตัว declarative (IaC) จาก Git repository และทำการ reconcile Kubernetes resource ต่างๆให้ตรงตามนั้น&lt;/p&gt;

&lt;p&gt;ใน blog post นี้เราจะมาดูการติดตั้งและใช้งาน Flux ในเบื้องต้นกัน&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ทำการติดตั้ง &lt;a href="https://eksctl.io/introduction/#installation" rel="noopener noreferrer"&gt;&lt;code&gt;eksctl&lt;/code&gt;&lt;/a&gt; และ &lt;a href="https://fluxcd.io/docs/installation/" rel="noopener noreferrer"&gt;&lt;code&gt;flux&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;สร้าง &lt;a href="https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token" rel="noopener noreferrer"&gt;&lt;code&gt;personal access token&lt;/code&gt;&lt;/a&gt; บน GitHub account&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to setup Flux on Amazon EKS cluster
&lt;/h3&gt;

&lt;p&gt;eksctl[3] เป็นหนึ่งใน standard tool ที่ใช้ในการสร้างและจัดการ EKS cluster และตั้งแต่ vesion &lt;code&gt;0.53.0&lt;/code&gt; จะมี feature ในการติดตั้ง Flux รวมอยู่ด้วย&lt;/p&gt;

&lt;p&gt;ขั้นตอนในการสร้าง EKS cluster ใหม่และติดตั้ง Flux โดยอัตโนมัติ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;export ค่าต่างๆที่จะต้องใช้ในขั้นตอนต่อๆไป&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export GITHUB_USERNAME=&amp;lt;your GitHub username&amp;gt;
export GITHUB_TOKEN=&amp;lt;your GitHub personal access token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;สร้าง config file ด้วย code ด้านล่างนี้และเปลี่ยน &lt;code&gt;&amp;lt;GitHub username&amp;gt;&lt;/code&gt; เป็นชื่อ GitHub username ของเรา&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOF &amp;gt; eks-gitops-demo.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eks-gitops-demo
  region: ap-southeast-1

managedNodeGroups:
  - name: ng-1
    instanceType: m5.large
    desiredCapacity: 1

gitops:
  flux:
    gitProvider: github
    flags:
      owner: "${GITHUB_USERNAME}"
      personal: "true"
      private: "true"
      repository: "eks-gitops-demo"
      branch: "master"
      namespace: "flux-system"
      path: "clusters/eks-gitops-demo"
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ทำการสร้าง EKS cluster โดยใช้คำสั่ง &lt;code&gt;eksctl create cluster --config-file eks-gitops-demo.yaml&lt;/code&gt; และรอจน cluster สร้างเสร็จ&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;เราสามารถเช็ค resource ต่างๆที่เกี่ยวกับ Flux โดยใช้คำสั่ง &lt;code&gt;kubectl --namespace flux-system get all&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6jtbd9fsfcd1rwi4bwz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6jtbd9fsfcd1rwi4bwz.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;และใน GitHub account ของเราจะมี repository ใหม่ที่ชื่อ &lt;code&gt;eks-gitops-demo&lt;/code&gt; ถูกสร้างขึ้นมาและมี commit ในส่วนของ Kubernetes manifest file ของ Flux component ต่างๆ&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhynb58ha1sold17px72.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhynb58ha1sold17px72.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ถึงตรงนี้แสดงว่าขั้นตอนการสร้าง EKS cluster ใหม่ที่มีการติดตั้ง Flux มาด้วยเป็นอันเสร็จสมบูรณ์แล้ว&lt;/p&gt;

&lt;p&gt;Note. สำหรับกรณีที่เป็น EKS cluster เดิมหรือต้องการติดตั้ง Flux แยกทีหลัง&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ในกรณีที่ cluster ที่ถูกสร้างด้วย eksctl เราสามารถติดตั้ง Flux โดยการใช้คำสั่ง &lt;a href="https://eksctl.io/usage/gitops-v2/" rel="noopener noreferrer"&gt;&lt;code&gt;eksctl enable flux&lt;/code&gt;&lt;/a&gt; ได้&lt;/li&gt;
&lt;li&gt;ในกรณีที่ไม่ได้ใช้ eksctl เราสามารถติดตั้ง Flux โดยการใช้ flux CLI และคำสั่ง &lt;a href="https://fluxcd.io/docs/installation/" rel="noopener noreferrer"&gt;&lt;code&gt;flux bootstrap&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to use Flux basic features
&lt;/h3&gt;

&lt;p&gt;ต่อมาเราจะมาดูการใช้งาน Flux แบบเบื้องต้นกัน&lt;/p&gt;

&lt;p&gt;ตัวอย่างแรกจะเป็นการใช้ Kubernetes manifest file ตามปกติ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;เริ่มต้นจากการ clone GitHub repository ที่ Flux ได้สร้างขึ้นมา&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone git@github.com:${GITHUB_USERNAME}/eks-gitops-demo.git
cd eks-gitops-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;หลังจากนั้นเราจะสร้าง Kubernetes manifest file สำหรับ &lt;code&gt;nginx:1.14.2&lt;/code&gt; deployment แล้วทำการ commit และ push ไปยัง GitHub&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p clusters/eks-gitops-demo/default/nginx

cat &amp;lt;&amp;lt; EOF &amp;gt; clusters/eks-gitops-demo/default/nginx/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
EOF

git add clusters/eks-gitops-demo/default/nginx/deployment.yaml
git commit -m "Add Nginx deployment"
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ตามค่า default config Flux จะ pull ข้อมูลจาก GitHub ทุกๆ 10 นาทีและทำการ reconcile Kubernetes resource แต่เราสามารถใช้คำสั่ง &lt;code&gt;flux reconcile source git flux-system&lt;/code&gt; เพื่อทำการ pull โดยทันทีได้&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtob1udj0lzhomopaq3d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtob1udj0lzhomopaq3d.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;หลังจากนั้นเราสามารถเช็คได้ว่า Flux ทำการ apply change ต่างๆและมีการสร้าง Kubernetes deployment ขึ้นมา โดยใช้คำสั่ง &lt;code&gt;kubectl get deployment nginx-deployment&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbusoxtmat7xu0bdq0ou.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbusoxtmat7xu0bdq0ou.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;หลังจากนั้นลองทำการเปลี่ยนใน deployment manifest file &lt;code&gt;nginx:1.15.0&lt;/code&gt; และทำการ commit และ push ไปยัง GitHub อีกครั้งนึง&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sed -i '' 's/1.14.2/1.15.0/' clusters/eks-gitops-demo/default/nginx/deployment.yaml

git add clusters/eks-gitops-demo/default/nginx/deployment.yaml
git commit -m "Change Nginx image to 1.15.0"
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;หลังจาก Flux ทำการ reconcile เสร็จ จะเห็นได้ว่า deployment มีการเปลี่ยนไปใช้ &lt;code&gt;nginx:1.15.0&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra7rbztybg0rqm3mx8fc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra7rbztybg0rqm3mx8fc.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;7.(Bonus) ถ้าลองลบ deployment manifest แล้วทำการ commit และ push ไปยัง GitHub หลังจาก Flux ทำการ reconcile เสร็จ จะเห็นได้ว่าตัว deployment ของ nginx จะถูกลบไปเช่นกัน&lt;/p&gt;

&lt;p&gt;อีกตัวอย่างนึงจะเป็นการใช้งาน Flux ร่วมกับ Helm&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;เริ่มต้นจากการสร้าง HelmRepository CRD ที่ชี้ไปยัง Helm Chart repository ในตัวอย่างนี้เราจะใช้ &lt;a href="https://prometheus-community.github.io/helm-charts" rel="noopener noreferrer"&gt;&lt;code&gt;prometheus-community&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p clusters/eks-gitops-demo/monitoring

cat &amp;lt;&amp;lt; EOF &amp;gt; clusters/eks-gitops-demo/monitoring/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
EOF
---
cat &amp;lt;&amp;lt; EOF &amp;gt; clusters/eks-gitops-demo/monitoring/prometheus-community.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
  name: prometheus-community
  namespace: monitoring
spec:
  url: https://prometheus-community.github.io/helm-charts
  interval: 10m
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;หลังจากนั้นทำการสร้าง HelmRelease CRD สำหรับที่จะให้ Flux deploy โดยใช้ Chart ที่ชื่อ &lt;code&gt;kube-prometheus-stack&lt;/code&gt; หลังจากนั้นทำการ commit และ push ไปยัง GitHub&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p clusters/eks-gitops-demo/monitoring

cat &amp;lt;&amp;lt; EOF &amp;gt; clusters/eks-gitops-demo/monitoring/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
EOF

cat &amp;lt;&amp;lt; EOF &amp;gt; clusters/eks-gitops-demo/monitoring/kube-prometheus-stack.yaml
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: kube-prometheus-stack
  namespace: monitoring
spec:
  releaseName: kube-prometheus-stack
  interval: 10m
  chart:
    spec:
      chart: kube-prometheus-stack
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: monitoring
EOF

git add clusters/eks-gitops-demo/monitoring/*
git commit -m "Add Prometheus with Helm"
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;หลักจากนั้นใช้คำสั่ง &lt;code&gt;flux reconcile source git flux-system&lt;/code&gt; เพื่อ pull change จาก GitHub และเนื่องจากใน HelmRelease CRD เราตั้ง interval ในการ reconcile เป็นทุกๆ 10 นาที เราสามารถใช้คำสั่ง &lt;code&gt;flux --namespace monitoring reconcile helmrelease kube-prometheus-stack&lt;/code&gt; เพื่อให้ reconcile ทันทีได้เช่นกัน&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpaokz1a1zb0b4iv74uh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpaokz1a1zb0b4iv74uh.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;หลักจาก reconcile เสร็จสิ้น เราสามารถเช็คได้ว่า resource ต่างๆสำหรับ Prometheus ได้มีการติดตั้งใน cluster อย่างถูกต้องโดย Helm Chart ผ่าน Flux&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhur9rqc565v8oxi7n616.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhur9rqc565v8oxi7n616.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;GitOps เป็นการนำเทคนิคและการใช้งาน Git, CI/CD และ IaC มาประกอบกันเพื่อให้เราสามารถจัดการ infrastructure ได้อย่างมีประสิทธิภาพและลดความผิดพลาดที่อาจจะเกิดขึ้นจาก manual process&lt;/p&gt;

&lt;p&gt;Flux เป็น tool ที่ช่วยให้เราสามารถ implement GitOps บน Kubernetes ได้อย่างสะดวกยิ่งขึ้น ซึ่งใน blog post นี้เราได้เห็นวิธีการติดตั้งบน Amazon EKS ผ่าน eksctl&lt;/p&gt;

&lt;p&gt;หลังจากนั้นเราได้เห็นตัวอย่างวิธีการติดใช้งาน Flux ในเบื้องต้น และใน part ที่ 2 เราจะมาดูตัวอย่างและ feature อื่นๆของ Flux กัน&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;[1] &lt;a href="https://www.gitops.tech/#what-is-gitops" rel="noopener noreferrer"&gt;https://www.gitops.tech/#what-is-gitops&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://fluxcd.io/" rel="noopener noreferrer"&gt;https://fluxcd.io/&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://eksctl.io/" rel="noopener noreferrer"&gt;https://eksctl.io/&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://helm.sh/" rel="noopener noreferrer"&gt;https://helm.sh/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flux</category>
      <category>gitops</category>
      <category>eks</category>
      <category>awsthai</category>
    </item>
  </channel>
</rss>
