External Load Balancer for Kubernetes - HAProxy

10 Jun, 2017

You need:

  • Cluster Kubernetes
  • New node for HAProxy

Sources:

Instalation in node HAProxy

Install basic sowftware

yum install epel-release
yum install haproxy git socat python-pip
pip install jinja2
pip install deepdiff

Clone repository in / or other route for dinamic configuration of HAProxy

git clone https://github.com/Tedezed/Celtic-Kubernetes.git

Create errors html for service HAProxy

mkdir /etc/haproxy/errors/
cp /Celtic-Kubernetes/external_loadbalancer_hap/errors/* /etc/haproxy/errors/
cp /Celtic-Kubernetes/external_loadbalancer_hap/system/haproxy.cfg /etc/haproxy/

Create state global

mkdir -p /var/state/haproxy/
touch  /var/state/haproxy/global

Enable Haproxy

systemctl enable haproxy

Test

python hap_manager_daemon.py start
python hap_manager_daemon.py stop
sh haproxy_reload

 

HAP Manager

You need the repository https://github.com/Tedezed/Celtic-Kubernetes.git

Modify configuration.json for hap_manager

{
"kube_api": "morrigan:8080",
"version": "v1",
"file_conf": "template.cfg",
"stats": true,
"sleep": 3
}
  • Kube API master

      "kube_api": "ip_kube_api_server:port_http"
    

Unit for systemd of hap_manager

Copy file hap_manager.service

cp /Celtic-Kubernetes/external_loadbalancer_hap/system/hap_manager.service /lib/systemd/system/hap_manager.service

Modify permissions for hap_manager

chmod 644 /lib/systemd/system/hap_manager.service

Reload daemon systemctl for reload configuration of units

systemctl daemon-reload

Start hap_manager.service

systemctl start hap_manager.service

systemctl enable hap_manager.service

See settings

cat /etc/haproxy/haproxy.cfg | grep acl

 

Define services

Example rc

apiVersion: v1
kind: ReplicationController
metadata:
 name: nginx-controller
spec:
 replicas: 2
 selector:
   name: nginx
 template:
   metadata:
     labels:
       name: nginx
   spec:
     containers:
       - name: nginx
         image: nginx
         ports:
           - containerPort: 80

Example svc, you need NodePort

apiVersion: v1
kind: Service
metadata:
  name: nginx-service-domain
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    name: http
  selector:
    name: nginx

Enter with http://IP-SERVER-HAP/NAME-SERVICE/

You need domain for the service, no problem, you can use the label “domain”

Example svc with domain

apiVersion: v1
kind: Service
metadata:
  name: nginx-service-domain
  labels:
    app: nginx
    domain: www.test-domain.com
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    name: http
  selector:
    name: nginx

 

Not repeat the domain name

You can use manager_tools.py (function constraint_domain) for not to repeat the domain name. If return True domain name is in use.

Example

constraint_domain("morrigan:8080","v1","www.test-domain.com")

Galera Cluster on Debian 8

5 May, 2017

In this stage you need two nodes with Debian OS for deploy Galera Cluster Maria DB. The next entry add other two nodes with HAProxy and VIP for load balancer to Cluster.

The first step is add the repository of mariadb to Debian (Node1 and node2):

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386] http://mariadb.kisiek.net/repo/10.0/debian jessie main'
sudo apt-get update
sudo apt-get upgrade

When is done, install the software for Galera cluster (Node1 and node2):

apt-get install -y rsync galera mariadb-galera-server

The next step is configure the file of configuration of Galera:

For node01:

echo '[mysqld]
# MySQL Configuration
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://192.168.30.11:4567,192.168.30.12:4567"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
wsrep_node_address="192.168.30.11"
wsrep_node_name="node01"' > /etc/mysql/conf.d/galera.cnf ; chmod 770 /etc/mysql/conf.d/galera.cnf

For node02:

echo '[mysqld]
# MySQL Configuration
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://192.168.30.11:4567,192.168.30.12:4567"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
wsrep_node_address="192.168.30.12"
wsrep_node_name="node02"' > /etc/mysql/conf.d/galera.cnf ; chmod 770 /etc/mysql/conf.d/galera.cnf

BONUS configuration

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Configure the file /etc/hosts (Node1 and node2):

192.168.30.11 node01
192.168.30.12 node02

Copy file /etc/mysql/debian.cnf to the node01 to node02

Stop the service MySQL (Node1 and node2):

service mysql stop

Execute the next command for create new cluster (Node1):

service mysql start --wsrep-new-cluster

ERROR: WSREP: gcs connect failed: Connection timed out SOLUTION: Execute:

service mysql bootstrap

Restart all services of MySQL and Galera (Node1 and node2).

The next query response the number of nodes of cluster Galera:

mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"' -p

Finish the first part.

Creación, publicación y firma de claves PGP

5 Feb, 2017

En esta entrada vamos a ver los pasos básicos para construir un anillo de confianza con PGP, certificando la identidad y firmando claves.

Generar par de claves

Para comenzar generamos un par de claves propio, con nuestro nombre real y correo electronico:

~/.gnupg$ gpg --gen-key

  1. Seleccionamos la opción 4 solo RSA para firmar.
  2. Tamaño de 4096 bits.
  3. En mi caso la clave nunca caduca, opción 0.
  4. Introducimos nuestro nombre real, correo electrónico y un comentario.

Una vez introducido las siguientes opciones, nos saldrá el siguiente mensaje. Es necesario generar muchos bytes aleatorios. Es una buena idea realizar alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar la red y los discos) durante la generación de números primos. Esto da al generador de números aleatorios mayor oportunidad de recoger suficiente entropía. Lo que tendremos que hacer es ejecutar tareas pesadas, como ejecutar una maquina virtual, para generar bytes aleatorios.

Para terminar nos pasara la siguiente información con el ID de nuestra clave:

gpg: clave **E0000000** marcada como de confianza absoluta
claves pública y secreta creadas y firmadas.
gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesaria(s), 1 completa(s) necesaria(s),
modelo de confianza PGP
gpg: nivel: 0 validez: 1 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 1u
pub 40000/E0000000 2015-11-19
Huella de clave = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
uid Nuestro_nombre (Comentario) nuestro_correo@gmail.com;

También nos informara que la clave como configuramos anteriormente solo sirve para firmar, para cifrar tendremos que crear una subclave:

Tenga en cuenta que esta clave no puede ser usada para cifrar. Puede usar la orden “–edit-key” para crear una subclave con este propósito.

Agregar una subclave para encriptación

~/.gnupg$ gpg --edit-key nuestro_correo@gmail.com

Ejecutamos:

gpg: addkey
  1. Introducimos nuestra contraseña de la clave anterior.
  2. Seleccionamos la opción 6 RSA solo para cifrar.
  3. Tamaño de 4096 bits.
  4. Introducimos la validez.
  5. De nuevo tendremos que generar bytes aleatorios con la actividad de nuestra maquina.

Guardamos y salimos: gpg: save

Para ver nuestra clave:

~/.gnupg$ gpg -k

Exportar e importar clave sin firmar

Exportar clave a archivo:

gpg --output TclavePublica.gpg --export E0000000

Exportar clave a http://pgp.mit.edu/

gpg --send-keys --keyserver pgp.mit.edu E0000000

Importar clave de archivo:

gpg --import clavePublica.gpg

Importar clave de http://pgp.mit.edu/

gpg --keyserver pgp.mit.edu --recv-keys A0000000F

Firma de claves PGP e importación

Después podemos firmar las claves de otras personas para ampliar nuestra zona de confianza, también ellos firmaran la nuestra. En primer lugar hacemos acto de notario y confirmamos la identidad de las personas con su clave y correo.

Una vez echo esto firmamos su clave subida al servidor:

~/.gnupg$ gpg --edit-key A0000000F

Firmamos con:

gpg: sign

Introducimos nuestra contraseña para firmar la clave ajena.

Guardamos y salimos:

gpg: save

Enviamos clave firmada al servidor pgp.mit.edu con:

gpg --keyserver pgp.mit.edu --send-keys A0000000F

Eliminar clave privada:

gpg --keyserver pgp.mit.edu --delete-secret-key E0000000

Eliminar clave publica:

gpg --keyserver pgp.mit.edu --delete-keys E0000000