๐ŸŽจDeploy locally

// ```powershell
#? The script tries to deploy the resource to K8, via kubectl or flux.
#! Mandatory Parameters : $mode, $env
#*--------------------------------------------------------------------------------
#? Example 
   #! Just pre configure the Cluster with few prerequistes like, prom-op,redis
   #? ./deploy.ps1 -mode local -env dev -preSetup true -deploy true
   #! Deploys the complete infra and services
   #? ./deploy.ps1 -mode local -env dev -preSetup false -deploy true
#*--------------------------------------------------------------------------------
param( [Parameter(Mandatory = $true)] $mode = "local", [Parameter(Mandatory = $true)] $env = "dev", $preSetup = "false", $deploy = "false")


#-------- Functions-----------------------------
function CreateNamespaceInK8 {
    param (
        $name
    )
    $namespace = kubectl get ns $name --output=json | ConvertFrom-Json
    if ($namespace.metadata.name -ne $name) {
        kubectl create ns $name
    }
    else {
        Write-Output "$name namespace already exists"
    }
}

function InstallDaprInK8 {
    dapr init -k
    Start-sleep -s 2
}
#-------- Functions-----------------------------



##  ----------------- > Pre Configure K8 Cluster with Dapr, Redis, Secrets, Vault and Prometheus <---------------
#& Setup
if ($preSetup -eq "true") {
    #& Create namespace 'evolution' and adding secrets
    CreateNamespaceInK8 -name evolution

    #& Enable dapr
    InstallDaprInK8

    $namespace = kubectl get ns kubernetes-dashboard --output=json | ConvertFrom-Json 
    if ($namespace.metadata.name -ne "kubernetes-dashboard") {
        kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
    }
    else {
        Write-Output "kubernetes-dashboard already exists. Doing Nothing !!" -Foregroundcolor Red
    }
    
    #& Create deployment 'evolution'
    kubectl create deployment zipkin --image openzipkin/zipkin -n evolution


    #& Setting Up Secrets from env 

    if ($null -eq $env:AWS_ACCESS_KEY -and $null -eq $env:AWS_SECRET_KEY ) {
        Write-Output "Environment variables are required. AWS_ACCESS_KEY or AWS_SECRET_KEY is not present"
        exit 1
    }
    else {
        # Mssql secret
        kubectl create secret generic mssql --from-literal=SA_PASSWORD="password@1" -n evolution
        # AWS S3 Access secret
        kubectl create secret generic access --from-literal=AWS_ACCESS_KEY=$env:AWS_ACCESS_KEY -n evolution
        # AWS S3 Access secret
        kubectl create secret generic secret --from-literal=AWS_SECRET_KEY=$env:AWS_SECRET_KEY -n evolution
    }


    #&  Setup Redis and Vault and Prometheus Operator
    $helm = helm list -A --output=json | ConvertFrom-Json 
    $relases = @($helm.name)
    if (!$relases.Contains('redis')) {
        helm install redis .\Evolution.infra\deploy\k8s\infra\base\redis\charts\redis\ 
    }
    if (!$relases.Contains('vault') -and 1 -eq 2) {
        helm repo add hashicorp https://helm.releases.hashicorp.com
        helm install vault hashicorp/vault
    }
    if (!$relases.Contains('vault') -and 1 -eq 2) {
        kubectl apply -k github.com/fluxcd/flagger//kustomize/linkerd
        kubectl apply -k https://github.com/fluxcd/flagger//kustomize/tester?ref=main
    }
    if (!$relases.Contains('prometheus') -And 1 -eq 2) {
        kubectl create ns monitoring
        helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
        #helm search repo prometheus-community
        helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring
        kubectl patch ds prometheus-prometheus-node-exporter --type "json" -p '[{"op": "remove", "path" : "/spec/template/spec/containers/0/volumeMounts/2/mountPropagation"}]' -n monitoring
        #! grafana pass : prom-operator, user: admin
    }
    if (!$relases.Contains('linkerd') -And 1 -eq 2) {
        helm repo add linkerd https://helm.linkerd.io/stable
        
        helm install linkerd-crds linkerd/linkerd-crds -n linkerd --create-namespace 

        #~ STEP to GENERATE CERT FOR LINKERD
        #* **** curl.exe -LO https://dl.step.sm/gh-release/cli/docs-cli-install/v0.21.0/step_windows_0.21.0_amd64.zip
        #* *** Download Step and add bin/step.exe to path. Then, run below connands
        #* step certificate create root.linkerd.cluster.local ca.crt ca.key --profile root-ca --no-password --insecure
        #* step certificate create identity.linkerd.cluster.local issuer.crt issuer.key --profile intermediate-ca --not-after 8760h --no-password --insecure --ca ca.crt --ca-key ca.key

        helm install linkerd-control-plane -n linkerd --set-file identityTrustAnchorsPEM=ca.crt --set-file identity.issuer.tls.crtPEM=issuer.crt --set-file identity.issuer.tls.keyPEM=issuer.key linkerd/linkerd-control-plane

    }
   
    Start-sleep -s 2

    #& If Pre only , EXIT from here.
  
}

#& Deploy
if($deploy -eq "true"){
    #? Cheking mode to local, If local would deploy directly
    If ($mode -eq "local") {   
        
        Write-Output "Deploying Indivisual repo locally using kubectl"
    
        $sql = kubectl get deploy mssql-server -n evolution --output=json | ConvertFrom-Json
        if ($sql.metadata.name -ne "mssql-server") {
            kubectl apply -k .\Evolution.infra\deploy\k8s\infra\overlays\$env
            Start-sleep -s 30
        }
        else {
            Write-Output "infra setup already done, sql ready"
        }
    
        #& Setup Identity API  
        $identity = kubectl get deploy identity-api-deployment -n evolution --output=json | ConvertFrom-Json
        if ($identity.metadata.name -ne "identity-api-deployment") {
            kubectl apply -k .\Evolution.Identity\deploy\k8s\identity\overlays\$env
            Start-sleep -s 2
        }
        else {
            Write-Host "Identity Api already running"  -Foregroundcolor Green
        }
            
        #& Setup Processor API
        $processor = kubectl get deploy processor-api-deployment -n evolution --output=json | ConvertFrom-Json
        if ($processor.metadata.name -ne "processor-api-deployment") {
            kubectl apply -k .\Evolution.Processor\deploy\k8s\processor\overlays\$env
            Start-sleep -s 2
        }
        else {
            Write-Host "Processor Api already running" -Foregroundcolor Green
        }
        
        #& Setup Uploader API
        $uploader = kubectl get deploy uploader-api-deployment -n evolution --output=json | ConvertFrom-Json
        if ($uploader.metadata.name -ne "uploader-api-deployment") {
            kubectl apply -k .\Evolution.Uploader\deploy\k8s\uploader\overlays\$env
        }
        else {
            Write-Host "Uploader Api already running" -Foregroundcolor Green
        }

        Write-Host "Successfully deployed all resources in $env" -Foregroundcolor Green

        $token = kubectl -n kubernetes-dashboard create token admin-user

        Write-Host "$token" -Foregroundcolor Green

    }
    elseif ($mode -eq "flux") {

        Set-Location Evolution.infra
    
        $GITHUB_USER = 'cloud-first-approach'
        flux bootstrap github --owner=$GITHUB_USER --repository=Evolution.infra --branch=main --path=./deploy/k8s/flux/clusters/$env --personal

        flux bootstrap github --owner=cloud-first-approach --repository=Evolution.Infra --branch=main --path=./deploy/k8s/flux/clusters/dev --personal

        flux bootstrap github --owner=$GITHUB_USER --repository=Evolution.Baseline --branch=main --path=./k8s/clusters/dev --personal

    }
    else{
        Write-Output "Invalid 'mode' selected" 
    }
}


# $helm | Where-Object -FilterScript { $Output.name -match 'evolution' }  |
#   ForEach-Object -Process { 
#     echo $Output.name
#   }



# export PATH=$PATH:/home/sourabh/.linkerd2/bin
# linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
# linkerd viz install | kubectl apply -f -
# linkerd viz dashboard --port 3333
# dapr dashboard -k
# kubectl proxy
# kubectl apply -k github.com/fluxcd/flagger//kustomize/linkerd

# kubectl create ns test (Load TEsted for Hey)
# kubectl apply -k https://github.com/fluxcd/flagger//kustomize/tester?ref=main
# kubectl exec -t -i flagger-loadtester-7b9bbcb79-h45j8 -n test bash
# hey -z 1m -q 100 -c 5 http://identity-api-deployment.evolution:80/healthz

#linkerd viz install | kubectl delete -f -
```

Last updated