blob: 98d2242c4615b8b280557e046288807bfc68f394 [file] [view]
# Running Gerrit on Kubernetes using Minikube
To test Gerrit on Kubernetes locally, a one-node cluster can be set up using
Minikube. Minikube provides basic Kubernetes functionality and allows to quickly
deploy and evaluate a Kubernetes deployment.
This tutorial will guide through setting up Minikube to deploy the gerrit-
master and gerrit-slave helm charts to it. Note, that due to limited compute
resources on a single local machine and the restricted functionality of Minikube,
the full functionality of the charts might not be usable.
## Installing Kubectl and Minikube
To use Minikube, a hypervisor is needed. A good non-commercial solution is HyperKit.
The Minikube project provides binaries to install the driver:
```sh
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit \
&& sudo install -o root -g wheel -m 4755 docker-machine-driver-hyperkit /usr/local/bin/
```
To manage Kubernetes clusters, the Kubectl CLI tool will be needed. A detailed
guide how to do that for all supported OSs can be found
[here](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-with-homebrew-on-macos).
On OSX hombrew can be used for installation:
```sh
brew install kubernetes-cli
```
Finally, Minikube can be installed. Download the latest binary
[here](https://github.com/kubernetes/minikube/releases). To install it on OSX, run:
```sh
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.30.0/minikube-darwin-amd64 && \
chmod +x minikube && \
sudo cp minikube /usr/local/bin/ && \
rm minikube
```
## Starting a Minikube cluster
For a more detailed overview over the features of Minikube refer to the
[official documentation](https://kubernetes.io/docs/setup/minikube/). If a
hypervisor driver other than virtual box (e.g. hyperkit) is used, set the
`--vm-driver` option accordingly:
```sh
minikube config set vm-driver hyperkit
```
The gerrit-master and gerrit-slave charts are configured to work with the default
resource limits configured for minikube (2 cpus and 2Gi RAM). If more resources
are desired (e.g. to speed up deployment startup or for more resource intensive
tests), configure the resource limits using:
```sh
minikube config set memory 4096
minikube config set cpus 4
```
To install a full Gerrit master and Gerrit slave setup with reasonable startup
times, Minikube will need about 9.5 GB of RAM and 3-4 CPUs! But the more the
better.
To start a Minikube cluster simply run:
```sh
minikube start
```
Starting up the cluster will take a while. The installation should automatically
configure kubectl to connect to the Minikube cluster. Run the following command
to test whether the cluster is up:
```sh
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 1h v1.10.0
```
The helm-charts use ingresses, which can be used in Minikube by enabling the
ingress addon:
```sh
minikube addons enable ingress
```
Since for testing there will probably no usable host names configured to point
to the minikube installation, the traffic to the hostnames configured in the
Ingress definition needs to be redirected to Minikube by editing the `/etc/hosts`-
file, adding a line containing the Minikube IP and a whitespace-delimited list
of all the hostnames:
```sh
echo "$(minikube ip) master.gerrit backend.gerrit slave.gerrit" | sudo tee -a /etc/hosts
```
The host names (e.g. `master.gerrit`) are the defaults, when using the values.yaml
files provided as and example for minikube. Change them accordingly, if a different
one is chosen.
This will only redirect traffic from the computer running Minikube.
To see whether all cluster components are ready, run:
```sh
kubectl get pos --all-namespaces
```
The status of all components should be `Ready`. The kubernetes dashboard giving
an overview over all cluster components, can be opened by executing:
```sh
minikube dashboard
```
## Install helm
Helm is needed to install and manage the helm charts. To install the helm client
on your local machine (running OSX), run:
```sh
brew install kubernetes-helm
```
A guide for all suported OSs can be found [here](https://docs.helm.sh/using_helm/#installing-helm).
For helm being able to install charts on a Kubernetes cluster, it needs Tiller
installed. To do that, run:
```sh
helm init
```
## Start an NFS-server
The helm-charts need a volume with ReadWriteMany access mode to store
git-repositories. This guide will use the nfs-server-provisioner chart to provide
NFS-volumes directly in the cluster. A basic configuration file for the nfs-server-
provisioner-chart is provided in the supplements-directory. It can be installed
by running:
```sh
helm install stable/nfs-server-provisioner \
--name nfs \
-f ./supplements/nfs.minikube.values.yaml
```
## Installing the gerrit-master helm chart
A configuration file to configure the gerrit-master chart is provided at
`./supplements/gerrit-master.minikube.values.yaml`. To install the gerrit-master
chart on Minikube, run:
```sh
helm install ./helm-charts/gerrit-master \
-f ./supplements/gerrit-master.minikube.values.yaml \
--dep-up \
-n gerrit-master
```
Startup may take some time, especially when allowing only a small amount of
resources to the containers. Check progress with `kubectl get pods -w` until
it says that the pod `gerrit-master-gerrit-master-deployment-<id>` is `Running`.
Then use `kubectl logs -f gerrit-master-gerrit-master-deployment-<id>` to follow
the startup process of Gerrit until a line like this shows that Gerrit is ready:
```sh
[2018-11-27 09:58:52,066] [main] INFO com.google.gerrit.pgm.Daemon : Gerrit Code Review 2.16-18-ge42b76d4ba ready
```
***note
The `gerrit.sh start` command may return `FAILED`. Nevertheless, when testing the
setup, Gerrit started up anyway after some time. This happens, if due to low
resources Gerrit needs too long to start up and the `gerrit.sh`-scripts runs into
a timeout.
***
To open Gerrit's UI, run:
```sh
open http://master.gerrit
```
## Installing the gerrit-slave helm chart
Before installing the gerrit-slave chart, some information and configuration is
needed from the master's database. First find out the name of the pod running
the mysql database of the master. It can be looked up by running:
```sh
kubectl get pods
```
It should have the format `gerrit-master-mysql-<id>`. Then exec the pod and log
into the database by executing:
```sh
kubectl exec -it gerrit-master-mysql-<id> bash
mysql -u root -pbig_secret
```
Create a user for the database replication:
```sql
CREATE USER 'repl' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'
IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
```
Get the current position of the transaction logs by executing the following SQL
statement:
```sql
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 4918 | | | |
+------------------+----------+--------------+------------------+-------------------+
```
Further, a dump of the reviewdb is needed. Exit mysql by typing `quit` and run:
```sh
mysqldump -u root -p --databases reviewdb > master_dump.sql
```
To get the dump to the host, exit the pod and run:
```sh
kubectl cp gerrit-master-mysql-<id>:/master_dump.sql master_dump.sql
```
A custom configuration file to configure the gerrit-slave chart is provided at
`./supplements/gerrit-slave.minikube.values.yaml`. Change the values of
`database.replication.mysql.config.masterLogFile` and
`database.replication.mysql.config.masterLogPos` to the values retrieved beforehand.
Then, the gerrit-slave chart can be started:
```sh
helm install ./helm-charts/gerrit-slave \
-f ./supplements/gerrit-slave.minikube.values.yaml \
--dep-up \
-n gerrit-slave
```
When the `gerrit-slave-mysql-<id>`-pod and the `gerrit-slave-mysql-replication-init-<id>`-
pod are ready, provide the database dump to the database by executing:
```sh
kubectl cp master_dump.sql gerrit-slave-mysql-replication-init-<id>:/var/data/db/master_dump.sql
```
The status of database initialization can be followed by running:
```sh
kubectl logs -f gerrit-slave-mysql-replication-init-<id>
```
As soon as the status of the database slave is displayed, the database should be
ready.
As a next step the `All-Projects` and `All-Users` repositories have to be created
on the slave by running:
```sh
curl -L -u git http://backend.gerrit/new/All-Projects.git
curl -L -u git http://backend.gerrit/new/All-Users.git
```
Afterwards, the slave will start up, which can be followed by running:
```sh
kubectl logs -f gerrit-slave-gerrit-slave-deployment-<id>
```
Replication of repositories has to be started on the Gerrit master, e.g. by making
a change in the respective repositories. Only then previous changes to the
repositories will be available on the slave.
## Cleanup
Shut down minikube:
```sh
minikube stop
```
Delete the minikube cluster:
```sh
minikube delete
```
Remove the line added to `/etc/hosts`. If Minikube is restarted, the cluster will
get a new IP and the `/etc/hosts`-entry has to be adjusted.