From 7bc19171f186a5ec7857ab8c022b92e05db980d0 Mon Sep 17 00:00:00 2001 From: Solomon Laing Date: Fri, 14 Jan 2022 12:49:05 +1030 Subject: [PATCH] updated some posts --- .gitlab-ci.yml | 24 ++- assets/rancher.png | Bin 0 -> 33768 bytes ...rs_Hardkernel Odroid Kubernetes Cluster.md | 2 - ...2-21_servers_An Old New Upgrade to Kube.md | 183 +++++++++++++++++- 4 files changed, 196 insertions(+), 13 deletions(-) create mode 100644 assets/rancher.png diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4606ba0..f802b1a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -44,8 +44,10 @@ push tag: - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG +REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG # Docker Deploy +# Not currently in use, here for posterity. # deploy: # extends: .docker_before_script # stage: deploy @@ -65,17 +67,19 @@ push tag: # - echo 'sed 's/"$CI_REGISTRY_IMAGE".*/"$CI_REGISTRY_IMAGE":"$CI_COMMIT_SHA"'' # - ssh -J "$PROD_SERVER_USER"@"$LIVE_SERVER_FQDN" "$PROD_SERVER_USER"@"$PROD_SERVER_LOCAL_HOST_NAME" "cd simple-blog-api && sed -i 's/simple-blog-api.*/simple-blog-api:"$CI_COMMIT_SHA"\x27/' docker-compose.yml && docker-compose up -d --remove-orphans --force-recreate" +# Helm Deploy +# Currently in use, works with *Magic* deploy: - stage: deploy - image: +stage: deploy +image: name: alpine/helm:latest entrypoint: [""] - script: +script: - helm upgrade - --install - --wait - --set image.tag=${CI_COMMIT_SHA} - simple-blog-api-${CI_COMMIT_REF_SLUG} - devops/simple-blog-api - environment: - name: production + --install + --wait + --set image.tag=${CI_COMMIT_SHA} + simple-blog-api-${CI_COMMIT_REF_SLUG} + devops/simple-blog-api +environment: + name: production \ No newline at end of file diff --git a/assets/rancher.png b/assets/rancher.png new file mode 100644 index 0000000000000000000000000000000000000000..73061422a15f01b146f92e3c3b38bbedcbb0c52a GIT binary patch literal 33768 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 As an aside, I'm yet to put much thought into security for my server or the applications I run on it, I use basic best practice however, my old CI/CD solution broke most of them, and more. So using the k3s cluster was definitely an upgrade there. + +As such, that is what I did. + +Not only is the API for this website running on it, all my gitlab runners run on it now. The setup was very simple, with most of it being standard k3s/k8s and gitlab integration configuration. All in all it greatly simplified my gitlab setup and I'm very happy with it. + +When I started writing this I had a much grander vision for the end result, however, it really isn't that grand. The final solution for the CI/CD can be found [here](). Using helm simplified things greatly. + +## Extras + +I don't have a comprehensive list of useful things and stuff I did while implementing all of this. I did it some time ago and didn't note much of it down. However, I will try and list of some of the bits and pieces I have. + +### Deployment.yaml + +This is used by helm as part of the CI/CD pipeline for deploying the app (I believe, it's been a while and I could be wrong). + + apiVersion: apps/v1 + kind: Deployment + metadata: + name: simple-blog-api + labels: + app: python + spec: + replicas: 3 + selector: + matchLabels: + app: python + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 33% + template: + metadata: + labels: + app: python + spec: + containers: + - name: python + image: inkletblot/simple-blog-api: + ports: + - containerPort: 5000 + livenessProbe: + httpGet: + path: /posts + port: 5000 + initialDelaySeconds: 2 + periodSeconds: 2 + readinessProbe: + httpGet: + path: /posts + port: 5000 + initialDelaySeconds: 2 + periodSeconds: 2 + +### gitlab-ci.yml + +This is the gitlab-ci configuration I'm using. It integrates with docker (as I couldn't get a local registry working with my current setup). I'll be entirely honest here, I don't exactly know how the helm integration works, I believe it works magically in the background using the variables supplied to the pipeline through gitlab. + + image: docker:20.10.5 + + stages: + - build + - push + - deploy + + .docker_before_script: + before_script: + - echo -n $CI_REGISTRY_TOKEN | docker login -u + "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY + + build: + extends: .docker_before_script + stage: build + tags: + - docker + script: + - docker pull $CI_REGISTRY_IMAGE:latest || true + - docker build --cache-from + $CI_REGISTRY_IMAGE:latest --tag + $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . + - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + + # Tag the "master" branch as "latest" + push latest: + extends: .docker_before_script + stage: push + tags: + - docker + script: + - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + $CI_REGISTRY_IMAGE:latest + - docker push $CI_REGISTRY_IMAGE:latest + only: + - master + + # Docker tag any Git tag + push tag: + extends: .docker_before_script + stage: push + tags: + - docker + only: + - tags + script: + - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + + # Docker Deploy + # Not currently in use, here for posterity. + # deploy: + # extends: .docker_before_script + # stage: deploy + # tags: + # - docker + # environment: + # name: Production + # url: "$LIVE_SERVER_FQDN" + # before_script: + # - 'command -v ssh-agent >/dev/null || ( apt-get + update -y && apt-get install openssh-client -y)' + # - eval $(ssh-agent -s) + # - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - + # - mkdir -p ~/.ssh + # - chmod 700 ~/.ssh + # - '[[ -f /.dockerenv ]] && echo -e "Host + *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config' + # script: + # - echo 'sed 's/"$CI_REGISTRY_IMAGE".*/ + "$CI_REGISTRY_IMAGE":"$CI_COMMIT_SHA"'' + # - ssh -J "$PROD_SERVER_USER"@"$LIVE_SERVER_FQDN" + "$PROD_SERVER_USER"@"$PROD_SERVER_LOCAL_HOST_NAME" "cd + simple-blog-api && sed -i 's/simple-blog-api.*/ + simple-blog-api:"$CI_COMMIT_SHA"\x27/' docker-compose. + yml && docker-compose up -d --remove-orphans + --force-recreate" + + # Helm Deploy + # Currently in use, works with *Magic* + deploy: + stage: deploy + image: + name: alpine/helm:latest + entrypoint: [""] + script: + - helm upgrade + --install + --wait + --set image.tag=${CI_COMMIT_SHA} + simple-blog-api-${CI_COMMIT_REF_SLUG} + devops/simple-blog-api + environment: + name: production + +That is about all I can come up with at the moment. I hope it is useful for someone. + +-ink \ No newline at end of file