These are the example files for my presentation about GitLab + Kubernetes for Continuous Integration and Delivery. They are also partly used in my GitLab CI posts.
INFO This is one of the ways to deploy an application as a Docker image to your K8s cluster. It is important to note that this repository is just an example of what can be done.
The presentation can be found here: Kubernetes - WYNTK - GitLab CI + Kubernetes Presentation. The blog post these files are specifically used in is here: GitLab + Kubernetes: Using GitLab CI's Kubernetes Cluster feature and old post GitLab + Kubernetes: Perfect Match for Continuous Delivery with Container.
An uptodate list of all my blog posts around GitLab and Kubernetes can be found on this page. This list is just an excerpt of some of my GitLab posts:
- GitLab + Kubernetes: Using GitLab CI's Kubernetes Cluster feature - UPDATED
- GitLab + Kubernetes: Using GitLab CI's Kubernetes Cluster feature
- GitLab + Kubernetes: Perfect Match for Continuous Delivery with Container
- Kubernetes - WYNTK - GitLab CI + Kubernetes Presentation
- GitLab + Kubernetes: Running CI Runners in Kubernetes
- GitLab + Kubernetes: GitLab on top of Kubernetes
- GitLab: Use Keycloak as SAML 2.0 OmniAuth Provider
This repository shows off/uses the following GitLab CI features:
Other features also shown are:
- prometheus-operator/prometheus-operator ServiceMonitor - for automatic monitoring of deployed applications.
The following points are required for this repository to work correctly:
- GitLab (
>= 13.x
) with the following features configured:- Container Registry
- GitLab CI (with working GitLab CI Runners, at least version
>= 13.x
)
- Kubernetes cluster
- You need to be "bound" to the
admin
(cluster-admin
) ClusterRole, see Kubernetes.io Using RBAC Authorization - User-facing Roles. - An Ingress controller should already been deployed, see Kubernetes.io Ingress.
- You need to be "bound" to the
kubectl
installed locally.- Editor of your choice.
NOTE
Best is to follow the blog post GitLab + Kubernetes: Using GitLab CI's Kubernetes Cluster feature as it contains more detailed instructions about using GitLab CI for Kubernetes.
You have to replace the following addresses in all files:
gitlab.zerbytes.net
with your GitLab address (e.g.gitlab.example.com
).edenmal.net
(in the Ingress manifest) with your domain name.- You probably also want to change the subdomain name while you are at it.
presentation-gitlab-k8s
with the Namespace name of your choice.
If you are using prometheus-operator/prometheus-operator, then you also need to replace
zerbytes-live-proj-monitoring
with the Namespace your Prometheus instance is running in,
in this file /gitlab-ci/monitoring/service-monitor.yaml
.
You then also want to kubectl
create/apply the file to your Kubernetes cluster during creation/apply process for the manifests in gitlab-ci/
.
You also need to create a "Docker Login" Secret which contains your GitLab Registry access data (e.g. Username and Access token with registry access) named whatever your want in the Namespace presentation-gitlab-k8s
.
A guide for that can be found here: Kubernetes.io - Pull an Image from a Private Registry.
Instead of using the imagePullSecrets
, we'll be using the default
ServiceAccount
in the Namespace to automatically use the created Docker login Secret
, see Kubernetes - Configure Service Accounts for Pods - Add ImagePullSecrets to a service account.
The Namespace manifest is in the gitlab-ci/
directory.
Then you can just import the repository into your GitLab instance and are ready to go.
For information on how to use these files and setup GitLab Kubernetes cluster/integration, see the above blog post and in specific this post GitLab + Kubernetes: Perfect Match for Continuous Delivery with Container.
- GitLab Kubernetes Integration Docs: https://docs.gitlab.com/ce/user/project/integrations/kubernetes.html
- GitLab Kubernetes Integration Docs Environment variables: https://docs.gitlab.com/ce/user/project/integrations/kubernetes.html#deployment-variables
As of GitLab 10.3
the Kubernetes Integration is marked as deprecated and with 10.4
it is now disabled, the following docs show the new feature called Clusters:
- GitLab 10.3 release - Kubernetes integration service: https://about.gitlab.com/2017/12/22/gitlab-10-3-released/#kubernetes-integration-service
- GitLab Clusters Feature Docs: https://docs.gitlab.com/ce/user/project/clusters/index.html
main.go
- The Golang example application code.go.mod
andgo.sum
- Golang modules files.
gitlab-ci/
monitoring/
service-monitor.yaml
- Contains a prometheus-operator/prometheus-operator ServiceMonitor manifest to automatically monitor the application(s).
namespace.yaml
- Namespace in which the GitLab CI will deploy the application.rbac.yaml
- Contains GitLab CI RBAC Role, RoleBinding and ServiceAccount.secret.yaml
- Contains a TLS wildcard certificate for the application Ingress.
Dockerfile
- Contains the Docker image build instructions..gitlab-ci.yml
- Contains the GitLab CI instructions.
manifests/
- Kubernetes manifests used to deploy the Docker image built in the CI pipeline.deployment.yaml
- Deployment for the Docker image.ingress.yaml
- Ingress for the application.service.yaml
- Service for the application.
Thanks to @shadycuz - GitHub for his comments with improvements for the code in this repository!
The files in this repo can be used under the MIT license, see LICENSE file.