GitOps with the InterSystems Kubernetes Operator
Tags: kubernetes, git, programming, tutorial
Published: 2023-12-20 20:11:03


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4c7y1oh0rxtuhgvi86u.png)

This article will cover turning over control of provisioning the InterSystems Kubernetes Operator, and starting your journey managing your own "Cloud" of InterSystems Solutions through Git Ops practices.  This deployment pattern is also the fulfillment path for the [PID^TOO||](https://www.pidtoo.com)| FHIR Breathing Identity Resolution Engine. 

### Git Ops  
I encourage you to do your own research or ask your favorite LLM about Git Ops, but I can paraphrase it here for you as we understand it.  Git Ops is an alternative deployment paradigm, where the Kubernetes Cluster itself is "pulling" updates from manifests that reside in source control to manage the state of your solutions, making "Git" an integral part of the name.

### Prerequisites

*   Provision a Kubernetes Cluster , this has been tested on EKS, GKE, and MicroK8s Clusters  
*   Provision a GitLab, GitHub, or other Git Repo that is accessible by your Kubernetes Cluster  

### Argo CD  
The star of our show here is [ArgoCD](https://argoproj.github.io/cd/), which provides a declarative approach to continuous delivery with a ridiculously well done UI.  Getting the chart going on your cluster is a snap with just a couple of strokes on your cluster.

    kubectl create namespace argocd
    kubectl apply -n argocd -f \
    https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Let's go get logged into the UI for ArgoCD on your Kubernetes Cluster, to do this, you need to grab the secret that was created for the UI, and setup a port forward to make it accessible on your system.  

**Grab Secret**  
Decrypt it and put it on your clipboard.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nyqjy1gxmtdj7f0kteae.png)


**Port Forward**  
Redirect port 4000 (or whatever) to your local host


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2h9n9jag4jmnluxk2w5c.png)


**UI**  
Navigate to https://0.0.0.0:4000 and supply the secret to the login screen and login.  


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bhiqhnea43xm4tpbg252.png)




###  InterSystems Kubernetes Operator (IKO)
Instructions for obtaining the IKO Helm chart in the [documentation ](https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=AIKO)itself, once you get it, check it in to your git repo in a feature branch.  I would provide a sample repo for this, but unfortunately cant do it without violating a re-distribution as it does not appear the chart is available in a public repository.

Create yourself a feature branch in your git repository and unpack the IKO Helm chart into a single directory.  As below, this is `iko/iris_operator_amd-3.5.48.100` off the root of the repo.

On `feature/iko` branch as an example:

    ├── iko
    │   ├── AIKO.pdf
    │   └── iris_operator_amd-3.5.48.100
    │       ├── chart
    │       │   └── iris-operator
    │       │       ├── Chart.yaml
    │       │       ├── templates
    │       │       │   ├── apiregistration.yaml
    │       │       │   ├── appcatalog-user-roles.yaml
    │       │       │   ├── cleaner.yaml
    │       │       │   ├── cluster-role-binding.yaml
    │       │       │   ├── cluster-role.yaml
    │       │       │   ├── deployment.yaml
    │       │       │   ├── _helpers.tpl
    │       │       │   ├── mutating-webhook.yaml
    │       │       │   ├── service-account.yaml
    │       │       │   ├── service.yaml
    │       │       │   ├── user-roles.yaml
    │       │       │   └── validating-webhook.yaml
    │       │       └── values.yaml




**IKO Setup**  
Create `isc` namespace, and add secret for `containers.intersystems.com` into it.

    kubectl create ns isc
    
    kubectl create secret docker-registry \
    pidtoo-pull-secret --namespace isc \
    --docker-server=https://containers.intersystems.com \
    --docker-username='ron@pidtoo.com' \
    --docker-password='12345'

This should conclude the setup for IKO, and enable it's delegate it entirely through Git Ops to Argo CD.  

 
### Connect Git to Argo  CD
This is a simple step in the UI for Argo CD to connect the repo, this step ONLY "connects" the repo, further configuration will be in the repo itself.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9yb2zvin32udvr1iiju1.png)


### Declare Branch to Argo CD
Configure Kubernetes to poll branch through Argo CD `values.yml` in the Argo CD chart.  It is up to you really for most of these locations in the git repo, but the opinionated way to declare things in your repo can be in an "App of Apps" paradigm.

Consider creating the folder structure below, and the files that need to be created as a table of contents below:

    ├── argocd
    │   ├── app-of-apps
    │   │   ├── charts
    │   │   │   └── iris-cluster-collection
    │   │   │       ├── Chart.yaml  ## Chart
    │   │   │       ├── templates
    │   │   │       │   ├── iris-operator-application.yaml  ## IKO As Application
    │   │   │       └── values.yaml ## Application Chart Values
    │   │   └── cluster-seeds
    │   │       ├── seed.yaml  ## Cluster Seed


**Chart** 

    apiVersion: v1
    description: 'pidtoo IRIS cluster'
    name: iris-cluster-collection
    version: 1.0.0
    appVersion: 3.5.48.100
    maintainers:
      - name: intersystems
        email: support@intersystems.com  


**IKO As Application**  

    apiVersion: argoproj.io/v1alpha1
        kind: Application
        metadata:
          name: iko
          namespace: argocd
        spec:
          destination:
            namespace: isc
            server: https://kubernetes.default.svc
          project: default
          source:
            path: iko/iris_operator_amd-3.5.48.100/chart/iris-operator
            repoURL: { .Values.repoURL }
            targetRevision: { .Values.targetRevision }
          syncPolicy:
            automated: {}
            syncOptions:
            - CreateNamespace=true  


**IKO Application Chart Values**  

    targetRevision: main
    repoURL: https://github.com/pidtoo/gitops_iko.git


**Cluster Seed**  


    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: gitops-iko-seed
      namespace: argocd
      labels:
        isAppOfApps: 'true'
    spec:
      destination:
        namespace: isc
        server: https://kubernetes.default.svc
      project: default
      source:
        path: argocd/app-of-apps/charts/iris-cluster-collection
        repoURL: https://github.com/pidtoo/gitops_iko.git
        targetRevision: main
      syncPolicy:
        automated: {}
        syncOptions:
        - CreateNamespace=true



### Seed the Cluster!
This is the final on interacting with your Argo CD/IKO Cluster applications, **the rest is up to Git**!

    kubectl apply -n argocd -f argocd/app-of-apps/cluster-seeds/seed.yaml


### Merge to Main
Ok, this is where we see how we did in the UI, you should immediately start seeing in Argo CD applications starting coming to life.  


**The apps view:**  

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yorx1ix6obtj30lgpk2i.png)



**InterSystems Kubernetes Operator View**  


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k69kq700dkqqo87d3l0s.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yscf7gksec76biz6h145.png)

> Welcome to GitOps with the InterSystems Kubernetes Operator!

[Git Demos are the Best! - Live October 19, 2023](https://youtu.be/IKoadH_oOPU?feature=shared)  

Ron Sweeney, Principal Architect Integration Required, LLC (PID^TOO)
Dan McCracken, COO, Devsoperative, INC