Kubernetes – como instalar e configurar o Kubernetes – K8S – Gerência de containers Docker

Tutorial Kubernetes – como instalar e configurar o Kubernetes, criação de cluster e Pods com Kubernetes.

1. Introdução

Kubernetes é um sistema Open Source desenvolvido pelo Google para o gerenciamento de cluster de containeres tendo como características auto-scaling de serviços e containeres, auto-monitoração de containeres, permite o deploy de containers e serviços, load balancer, orquestração de containers, e orquestração de volumes de armazenamento ‘storages’.

O Kubernetes amigávelmente pode ser chamado de K8S, inventaram isto no Google, eu li em um dos Docs do Kubernetes e seria algo como K[eight-characters]S, o que faz todo sentido.

Mais uma pequena curiosidade, Kubernetes é derivado de uma palavra grega Kuvernetes, que significa timoneiro, aquele cara que pilota o Navio, por isto que o logo do Kuvernetes é um timão de navio.

Minions – São todos os hosts que fazem parte do cluster gerenciado pelo Kubernetes.
Serviços rodando nos Minios: kube-proxy kubelet docker e flannel

Flannel – É uma rede virtual que vai provisionar uma sub-rede para cada host do cluster, esta sub-rede será utilizada para alocar um ip para cada container e fazer a comunicação entre os containers.

Etcd – É um sistema distribuído de armazenamento do tipo key valor ou key=valor, utilizado pelo Kubernetes para armazenar todas informações sobre os Pods, containers, serviços, redes, nós do cluster, localização dos containeres, Cpus, Memória, versões de aplicativos e metados no geral.

Pod – É um grupo de um ou mais containers rodando dentro de um host/minion do cluster.

Replication Controller “RC” – Vai garantir que um determinado número de Pods estejam sempre rodando, ele monitora o cluster e em caso de algum Pod falhar, ficar off-line e etc, o replication controller tratará de subir um novo container ao Pod, mantendo o cluster funcional.

2. Pré-requisitos e Infraestrutura

Pré-requisitos
Sistema Operacional Centos 7 x86_64 instalação mínima.

Hosts – Infraestrutura
Vou utilizar um host para ser o Kubernetes e 3 Minions. Minions podem ser a quantidade que você quiser.

10.0.2.30 kubernetes-master1.devopslab.com.br
10.0.2.31 kubernetes-minion1.devopslab.com.br
10.0.2.32 kubernetes-minion2.devopslab.com.br
10.0.2.33 kubernetes-minion3.devopslab.com.br

3. DNS – Configuração do DNS

Configure o /etc/hosts de todos os nós do cluster “minions” para ter os apontamentos de DNS. Basicamente copie as informações de dns acima para todos os hosts.

4. Configuração do repositório para a instalação de pacotes

Crie o repositório em todos os hosts MASTER e MINIONS.

#vi /etc/yum.repos.d/virt7-docker-common-release.repo

[virt7-docker-common-release]
name=virt7-docker-common-release
baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0

5. Instalação do Kubernetes e Docker

MASTER
#yum install kubernetes flannel etcd
O pacote kubernetes também vai instalar o Docker entre outras dependências.

#yum install kubernetes flannel etcd
...
Dependencies Resolved

==============================================================================================================================================================================================
 Package                                             Arch                               Version                                                      Repository                          Size
==============================================================================================================================================================================================
Installing:
 etcd                                                x86_64                             2.2.5-1.el7                                                  extras                             5.3 M
 flannel                                             x86_64                             0.5.3-9.el7                                                  extras                             1.7 M
 kubernetes                                          x86_64                             1.2.0-0.9.alpha1.gitb57e8bd.el7                              extras                              34 k
Installing for dependencies:
 audit-libs-python                                   x86_64                             2.4.1-5.el7                                                  base                                69 k
 checkpolicy                                         x86_64                             2.1.12-6.el7                                                 base                               247 k
 docker                                              x86_64                             1.9.1-25.el7.centos                                          extras                              13 M
 docker-forward-journald                             x86_64                             1.9.1-25.el7.centos                                          extras                             824 k
 docker-selinux                                      x86_64                             1.9.1-25.el7.centos                                          extras                              70 k
 kubernetes-client                                   x86_64                             1.2.0-0.9.alpha1.gitb57e8bd.el7                              extras                             9.3 M
 kubernetes-master                                   x86_64                             1.2.0-0.9.alpha1.gitb57e8bd.el7                              extras                              15 M
 kubernetes-node                                     x86_64                             1.2.0-0.9.alpha1.gitb57e8bd.el7                              extras                             9.3 M
 libcgroup                                           x86_64                             0.41-8.el7                                                   base                                64 k
 libsemanage-python                                  x86_64                             2.1.10-18.el7                                                base                                94 k
 policycoreutils-python                              x86_64                             2.2.5-20.el7                                                 base                               435 k
 python-IPy                                          noarch                             0.75-6.el7                                                   base                                32 k
 setools-libs                                        x86_64                             3.3.7-46.el7                                                 base                               485 k
 socat                                               x86_64                             1.7.2.2-5.el7                                                base                               255 k

Transaction Summary
==============================================================================================================================================================================================
Install  3 Packages (+14 Dependent packages)

MINIONS

#yum install kubernetes flannel

6. Configuração do Kubernetes MASTER e os MINIONS

MASTER – Kubernetes Master.
MINIONS – Hosts Minions.

Desative o Firewall e Selinux em todos os hosts MASTER e MINIONS do cluster.

#systemctl stop firewalld.service
#systemctl disable firewalld.service
#sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
#setenforce 0

6.1 – Configuração do Kubernetes Master

MASTER – Kubernetes Config

#vi /etc/kubernetes/config
Configure a linha KUBE_MASTER para apontar para o ip MASTER.

# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://kubernetes-master1.devopslab.com.br:8080"

MASTER – Apiserserver
Comente a linha KUBE_ADMISSION_CONTROL.
#vi /etc/kubernetes/apiserver

# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"

# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"

# Port minions listen on
KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
#KUBE_ADMISSION_CONTROL="--admission-#control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""

MASTER – ETCD
Verifique se a porta do Etcd é 2379.
Configure o bind para 0.0.0.0:2379.
#vi /etc/etcd/etcd.conf

ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"

MASTER – Restart dos serviços e habilitação do start no boot.

[root@kubernetes-master1 ~]# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do 
        systemctl restart $SERVICES
        systemctl enable $SERVICES
        systemctl status $SERVICES 
done

MASTER – Definição de uma rede FLANNEL
Vamos criar uma rede para que seja alocada para cada novo container do cluster.
Normalmente é uma rede 172.17.0.0/16, porém vou mudar para uma do meu interesse.
Então vamos criar uma chave valor no Etcd.

Crie um arquivo .json em qualquer pasta do servidor Master e defina a rede.

#vi flannel-config.json

{
    "Network": "10.0.10.0/16",
    "SubnetLen": 24,
    "Backend": {
        "Type": "vxlan",
        "VNI": 1
     }
}

Agora faça a criação a Key no Etcd.

#etcdctl set /atomic.io/network/config < flannel-config.json

Verificando se a key foi criada com o comando
#etcdctl get /atomic.io/network/config

#etcdctl get /atomic.io/network/config
{
    "Network": "10.0.10.0/16",
    "SubnetLen": 24,
    "Backend": {
        "Type": "vxlan",
        "VNI": 1
     }
}

6.2 – Configuração dos Minions (Nodes)

Configuração dos hosts Minions.
Cada passo descrito abaixo deve ser feito em todos os hosts Minions da sua rede.

MINIONS – Kubernetes Config
Altere apenas a linha KUBE_MASTER e informe o servidor do Kubernetes.
#vi /etc/kubernetes/config

# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://kubernetes-master1.devopslab.com.br:8080"

MINIONS – KUBERLET
Aqui você vai informar qual é o servidor da Api, setar o hostname e bind do kuberlet.
#vi /etc/kubernetes/kubelet

###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
# KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=kubernetes-minion1.devopslab.com.br"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://kubernetes-master1.devopslab.com.br:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""

MINIONS – rede FLANNEL
Será alterado apenas a linha que informa o ip do ETCD rodando no servidor MASTER.

#vi /etc/sysconfig/flanneld

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD="http://kubernetes-master1.devopslab.com.br:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

Observe a linha: ‘FLANNEL_ETCD_KEY=”/atomic.io/network”
Esta key “/atomic.io/network” foi criada anteriormente no ETCD do Kubernetes Master.

MINIONS – Restart dos serviços e habilitação do start no boot

[root@kubernetes-minion1 ~]# for SERVICES in kube-proxy kubelet docker flanneld; do 
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES 
done

6.3 – Validação do MASTER e MINIONS

MINIONS
Verificação da rede.
Verifique se foram criadas as redes para o docker e flannel.

[root@kubernetes-minion1 ~]# ip -4 a|grep inet
    inet 127.0.0.1/8 scope host lo
    inet 10.0.2.31/24 brd 10.0.2.255 scope global enp0s3
    inet 10.0.10.1/24 scope global docker0
    inet 10.0.10.0/16 scope global flannel.1

Teste de consulta ao Etcd
#curl -s http://kubernetes-master1.devopslab.com.br:2379/v2/keys/atomic.io/network/subnets | python -mjson.tool

[root@kubernetes-minion1 ~]#curl -s http://kubernetes-master1.devopslab.com.br:2379/v2/keys/atomic.io/network/subnets | python -mjson.tool
{
    "action": "get",
    "node": {
        "createdIndex": 32,
        "dir": true,
        "key": "/atomic.io/network/subnets",
        "modifiedIndex": 32,
        "nodes": [
            {
                "createdIndex": 133,
                "expiration": "2016-04-03T01:08:09.060073648Z",
                "key": "/atomic.io/network/subnets/10.0.10.0-24",
                "modifiedIndex": 133,
                "ttl": 84138,
                "value": "{\"PublicIP\":\"10.0.2.31\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"8e:28:15:ca:cd:3b\"}}"
            },
            {
                "createdIndex": 374,
                "expiration": "2016-04-03T01:42:01.861701761Z",
                "key": "/atomic.io/network/subnets/10.0.14.0-24",
                "modifiedIndex": 374,
                "ttl": 86171,
                "value": "{\"PublicIP\":\"10.0.2.32\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"b6:1b:ee:eb:ce:ef\"}}"
            },
            {
                "createdIndex": 434,
                "expiration": "2016-04-03T01:45:36.592848197Z",
                "key": "/atomic.io/network/subnets/10.0.91.0-24",
                "modifiedIndex": 434,
                "ttl": 86385,
                "value": "{\"PublicIP\":\"10.0.2.33\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"4e:84:7d:78:21:00\"}}"
            }
        ]
    }
}

MASTER
No servidor Master faça um “kubectl get nodes” para verificar todos os nós do cluster.

#kubectl get nodes

[root@kubernetes-master1 ~]# kubectl get nodes
NAME                                  LABELS                                                       STATUS    AGE
kubernetes-minion1.devopslab.com.br   kubernetes.io/hostname=kubernetes-minion1.devopslab.com.br   Ready     53m
kubernetes-minion2.devopslab.com.br   kubernetes.io/hostname=kubernetes-minion2.devopslab.com.br   Ready     6m
kubernetes-minion3.devopslab.com.br   kubernetes.io/hostname=kubernetes-minion3.devopslab.com.br   Ready     2m

7. Criação de Pods com o Kubernets

Vamos criar 3 containeres com a imagem nginx e com a porta 80 exposta e um replication controller nomeado como webserver-nginx.

#kubectl run webserver-nginx –image=nginx –replicas=3 –port=80

[root@kubernetes-master1 ~]# kubectl run webserver-nginx --image=nginx --replicas=3 --port=80
replicationcontroller "webserver-nginx" created

Listando os Pods do cluster
#kubectl get pods

[root@kubernetes-master1 ~]# kubectl get pods
NAME                    READY     STATUS    RESTARTS   AGE
webserver-nginx-2th95   0/1       Pending   0          33m
webserver-nginx-v4404   0/1       Pending   0          33m
webserver-nginx-za52c   0/1       Pending   0          33m

Este status pending é normal, pois o Kubernetes está provisionando os Pods, pode demorar alguns minutos dependendo do tamanho da imagem.

No final você terá todos os Pods rodando.
#kubectl get pods

[root@kubernetes-master1 ~]#  kubectl get pods 
NAME                    READY     STATUS    RESTARTS   AGE
webserver-nginx-2th95   1/1       Running   0          54m
webserver-nginx-v4404   1/1       Running   0          54m
webserver-nginx-za52c   1/1       Running   1          54m

Verificando o Replication controller
#kubectl get rc

[root@kubernetes-master1 ~]# kubectl get rc
CONTROLLER        CONTAINER(S)      IMAGE(S)   SELECTOR              REPLICAS   AGE
webserver-nginx   webserver-nginx   nginx      run=webserver-nginx   3          59m

Verificando informações sobre um Pod.
Você criou um Pod pelo Kubernetes mas você não sabe muita coisa sobre ele, como os Ips.
#kubectl describe pod webserver-nginx-2th95

[root@kubernetes-master1 ~]# kubectl describe pod  webserver-nginx-2th95
Name:				webserver-nginx-2th95
Namespace:			default
Image(s):			nginx
Node:				kubernetes-minion2.devopslab.com.br/10.0.2.32
Start Time:			Sat, 02 Apr 2016 00:05:49 -0300
Labels:				run=webserver-nginx
Status:				Running
Reason:				
Message:			
IP:				10.0.14.2
Replication Controllers:	webserver-nginx (3/3 replicas created)
Containers:
  webserver-nginx:
    Container ID:	docker://a08a160b25fb141a8546028b09349c50adf4442b93e19a15e6500fc789ad695b
    Image:		nginx
    Image ID:		docker://6f62f48c4e55d700cf3eb1b5e33fa051802986b77b874cc351cce539e5163707
    QoS Tier:
      cpu:		BestEffort
      memory:		BestEffort
    State:		Running
      Started:		Sat, 02 Apr 2016 00:59:18 -0300
    Ready:		True
    Restart Count:	0
    Environment Variables:
Conditions:
  Type		Status
  Ready 	True 
No volumes.
Events:
  FirstSeen	LastSeen	Count	From						SubobjectPath				Reason	Message
  ─────────	────────	─────	────						─────────────				──────	───────
  38m		38m		1	{kubelet kubernetes-minion2.devopslab.com.br}	implicitly required container POD	Pulled	Successfully pulled image "registry.access.redhat.com/rhel7/pod-infrastructure:latest"
  38m		38m		1	{kubelet kubernetes-minion2.devopslab.com.br}	implicitly required container POD	Created	Created with docker id f7add7ef632a

Consultando os Ips de todos os Pods de um específico Replication Controller.
#kubectl get pods -l run=webserver-nginx -o yaml | grep podIP

[root@kubernetes-master1 ~]# kubectl get pods -l run=webserver-nginx -o yaml | grep podIP
    podIP: 10.0.14.2
    podIP: 10.0.10.2
    podIP: 10.0.91.2

8. Criando um serviço e acessando os serviços dos Pods

Até o momento nós temos o Kubernetes rodando, Pods criados, porta 80 exposta nos containeres, e Nginx instalado, tudo bonito.

Mas como você vai acessar os serviço http do Nginx? Qual é a Url? Qual é o Ip?.
Veja quando nós temos um cluster auto gerenciável como nós criamos aqui, a ideia é que todos os Pods estejam rodando e quando algum deles cair o próprio cluster se encarregará de subir um novo container, e este container com um novo IP.

Então não adianta eu saber os Ips do containers, se um deles morrer, será criado um outro, com um novo Ip, Id e etc.

Aí que entra a ideia de Serviço, vamos criar um serviço que atuará como Loadbalancer do cluster, este serviço vai me disponibilizar um IP do cluster, eu vou acessar meus serviços por este Ip, para mim tanto faz quais são os containeres, Ips, onde estão e etc, eu quero apenas o ip do cluster, e que este responda pelos meus containers.

Vamos ver como isto funciona.
Consultando o RC.
#kubectl get rc

[root@kubernetes-master1 ~]# kubectl get rc
CONTROLLER        CONTAINER(S)      IMAGE(S)   SELECTOR              REPLICAS   AGE
webserver-nginx   webserver-nginx   nginx      run=webserver-nginx   3          1h

Criando um serviço.
#kubectl expose rc webserver-nginx –port=80

[root@kubernetes-master1 ~]# kubectl expose rc webserver-nginx --port=80
service "webserver-nginx" exposed

Consultando o IP do cluster.
#kubectl get service webserver-nginx

[root@kubernetes-master1 ~]# kubectl get service webserver-nginx
NAME              CLUSTER_IP      EXTERNAL_IP   PORT(S)   SELECTOR              AGE
webserver-nginx   10.254.174.71   <none>        80/TCP    run=webserver-nginx   1m

Consultando os Ips dos Pods do Cluster.
kubectl describe service webserver-nginx

[root@kubernetes-master1 ~]# kubectl describe service webserver-nginx
Name:			webserver-nginx
Namespace:		default
Labels:			run=webserver-nginx
Selector:		run=webserver-nginx
Type:			ClusterIP
IP:			10.254.174.71
Port:			<unnamed>	80/TCP
Endpoints:		10.0.10.2:80,10.0.14.2:80,10.0.91.2:80
Session Affinity:	None
No events.

[root@kubernetes-master1 ~]# kubectl get ep webserver-nginx
NAME              ENDPOINTS                                AGE
webserver-nginx   10.0.10.2:80,10.0.14.2:80,10.0.91.2:80   3m

Nosso CLUSTER_IP é 10.254.174.71 e este IP é acessível apenas de dentro da nossa Infraestrutura, ou seja apenas os hosts Minions tem acesso a este ip.

Então a partir de qualquer host Minion você pode fazer um curl para validar se os serviços de Nginx estão respondendo.
#curl 10.254.174.71

[root@kubernetes-minion1 ~]# curl 10.254.174.71
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@kubernetes-minion1 ~]# 

Agora se você quer acessar o cluster externamente, torná-lo público ou disponível para outras redes vamos utilizar algumas das opções como Loadbalancer, EXTERNAL_IP ou NodePort. NodePort é o conhecido expose do Docker, você vai criar um Pod e expor a porta do host Docker/Minion, podendo acessar o serviço do container através do Ip do host Docker/Minion.

Lembrando CLUSTER_IP é acessível apenas dentro da rede dos hosts Minions.

Eu vou criar novos tópicos abordando o acesso público, que na verdade o que vale mesmo é você criar um cluster e poder acessá-lo externamente. Mas veja bem, um cluster interno pode ser muito útil, pode existir serviços que você não queira que seja público como por exemplo um pool de servidores de cache ou algum pool de NoSQL como Cassandra. Nós temos que saber trabalhar com os 2 casos, Cluster Interno e Cluster externo.

Referências.
http://kubernetes.io/docs/getting-started-guides/centos/centos_manual_config/
http://kubernetes.io/docs/getting-started-guides/fedora/fedora_manual_config/
http://kubernetes.io/docs/getting-started-guides/fedora/flannel_multi_node_cluster/#master-setup
http://kubernetes.io/docs/user-guide/simple-nginx/
http://kubernetes.io/docs/user-guide/replication-controller/
http://kubernetes.io/docs/user-guide/deploying-applications/

Obrigado

Leonardo Macedo

The Foreman – Instalação de hosts EC2 Amazon Web Services via Foreman – parte 3/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Vamos fazer a instalação de um host na Amazon Web Services utilizando o The Foreman.

Parte 1 – Como instalar e configurar o the foreman
Parte 2 – The Foreman instalacao de hosts via pxe bootstrap bare metal vms parte2

Compute Resources suportados pelo The Foreman
http://theforeman.org/manuals/1.10/index.html#5.2ComputeResources

Plugins
http://projects.theforeman.org/projects/foreman/wiki/List_of_Plugins

1. Usuário Amazon WS

A primeira coisa a se fazer é ter um usuário na Amazon WS com permissões administrativas no EC2 e com as chaves de acesso (Access Key ID e Secret Access Key).
Você pode criar um usuário gratuito na AmazonWS. Sendo assim tenha o Access Key ID e Secret Access Key em mãos.

2. Instalação do Compute Resource Foreman-ec2

Logado no servidor do Foreman instale o compute resource EC2 para habilitar o suporte a AmazonWS EC2.

#yum install foreman-ec2
#systemctl reload httpd

foreman-ec2.noarch : Foreman Amazon Web Services (AWS) EC2 support

3. Configuração do EC2 AmazonWS no Foreman

Em Home-The-Foreman -> Infrastructure -> Compute Resources -> New Compute Resurce
Preencha os dados de configuração informando Access Key, Secret Key e Provider EC2.
theforeman-rec-ec1

Faça um teste de conexão e escolha a região. São Paulo a região é sa-east-1.
Clique em “Submit”.

O Foreman vai gerar um para de chaves para comunicação com o EC2. Para verificar a chave logue no console da AmazonWS: http://console.aws.amazon.com -> EC2 -> Network & Security -> Key Pairs.

4. Criação de um Sistema Operacional genérico

Nós precisamos criar um Sistema Operacional no Foreman, da mesma forma que na instalação Bare Metal no tópico parte2.

É um Sistema Operacional genérico pois de fato ele não será usado, o que vai ser usado serão as imagens da Amazon do tipo ami-xxxxx, ami-27b3094b e etc.
theforeman-ami-27b3094b

4.1. Associar o template user data ao novo Sistema Operacional

Associe o template “Kickstart default user data” ao novo Sistema Operacional. Este é um template do tipo user data, em resumo ele é um script que vai instalar e configurar o Puppet e alterar a senha do usuário ec2-user e root.
theforeman-template1

theforeman-template2

Observação:
No template “Kickstart default user data” eu adicionei as linhas:

- RedHat 6
- RedHat 7
#
#Enable password on ssh
/bin/echo ec2-user:senha123456 | chpasswd
/bin/echo root:senha123456 | chpasswd
/bin/sed -i s/PasswordAuthentication\ no/PasswordAuthentication\ yes/g /etc/ssh/sshd_config
/bin/systemctl reload sshd

Template “Kickstart default user data” na íntegra:

<%#
kind: user_data
name: Kickstart default user data
oses:
- CentOS 4
- CentOS 5
- CentOS 6
- CentOS 7
- Fedora 16
- Fedora 17
- Fedora 18
- Fedora 19
- Fedora 20
- RedHat 6
- RedHat 7
-%>
#!/bin/bash

<%# Cloud instances frequently have incorrect hosts data %>
<%= snippet 'fix_hosts' %>

<%
  # safemode renderer does not support unary negation
  pm_set = @host.puppetmaster.empty? ? false : true
  puppet_enabled = pm_set || @host.params['force-puppet'] && @host.params['force-puppet'] == 'true'
%>
<% if puppet_enabled %>
yum install -y puppet
cat > /etc/puppet/puppet.conf << EOF
<%= snippet 'puppet.conf' %>
EOF

# Setup puppet to run on system reboot
/sbin/chkconfig --level 345 puppet on

/usr/bin/puppet agent --config /etc/puppet/puppet.conf --onetime --tags no_such_tag <%= @host.puppetmaster.blank? ? '' : "--server #{@host.puppetmaster}" %> --no-daemonize
<% end -%>

# UserData still needs wget to mark as finished
/usr/bin/wget --quiet --output-document=/dev/null --no-check-certificate <%= foreman_url('built') %>

# Enable password on ssh
/bin/echo ec2-user:senha123456 | chpasswd
/bin/echo root:senha123456 | chpasswd
/bin/sed -i s/PasswordAuthentication\ no/PasswordAuthentication\ yes/g /etc/ssh/sshd_config
/bin/systemctl reload sshd

5. Definição de imagens EC2

Antes de fazer a instalação de um novo host, você precisa antes definir quais imagens estarão habilitadas para o uso.
Em Home-The-Foreman -> Infrastructure -> Compute Resources -> *EC2-AmazonWS-SaoPaulo -> New image

Você precisa ter uma imagem criada na AmazonWS, pode ser uma própria sua, da comunidade, ou uma da AmazonWS.
Eu vou utilizar uma padrão que a própria AmazonWS fornece.
Imagem Amazon: ami-27b3094b
thefoerman-Amazonimagem1

No Foreman a imagem ficou assim:
theforeman-imagemec2-2
Perceba a referência a imagem ami-27b3094b.

*EC2-AmazonWS-SaoPaulo é o nome que eu dei para a zona de instalação de hosts. No seu caso coloque um nome de sua preferência

6. Deploy na Amazon via Foreman

Agora basta iniciar a criação de um servidor na Amazon via Foreman, então entre em
Home-The-Foreman -> Hosts -> New Hosts e crie uma nova instalação.
A minha instância se chama servidorec2aws-1.devopslab.com.br.

Então preencha os campos Host, Puppet Classes, Interfaces e Operating System, Virtual Machine (tipo de instância, neste caso vamos usar a t2.micro) e clique em Submit.

Host
theforeman-aws1

Interface
theforeman-aws2

Operating System
theforeman-aw3

Virtual Machine
theforeman-aw4

Submit – Processo de instalação
theforeman-aws5

theforeman-aws6

Consulte no EC2 AmazonWS a nova instância
theforeman-amazonec2-a

Consulte no Foreman a nova instância (clique em All hosts)
theforeman-amazonec2-b

theforeman-amazonec2-c

Pronto, provisionado um servidor na AmazonWS EC2 via Foreman.

The Foreman – Instalação de hosts via PXE – Bootstrap – Bare Metal – VMs – parte 2/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Instalação de hosts via PXE – BootStrap. O intuito é provisionar um novo host já integrado com o Puppet.
Você pode instalar tanto VMs como hosts físicos “Bare Metal”.
Assumo que você já tenha a aplicação The Foreman instalada e configurada conforme a parte 1 http://devopslab.com.br/como-instalar-e-configurar-o-the-foreman/

1. Criação do Sistema Operacional

Vamos instalar o CentOS 7.
Em Home-The-Foreman -> Hosts -> Operating Systems -> New Operating System
Operating System preencha os dados do Sistema Operacional.
Name: CentOS7
Major version: 7
Description: CentOS 7
Family: RedHat
Architectures: X86_64
theforeman-OSCentos1

Partition Table
Você vai definir particionamento do Sistema Operacional.
Selecione: Kickstart Default
theforeman-ptables1

Installation Media
Selecione: CentOS Mirror
theforeman-centosmirror1
Você pode ter um mirror local via NFS ou Http, neste caso, por facilidade optamos por instalar utilizando o mirror CentOS público.
Se você optar por criar seu próprio repositório de imagens (recomendado) pode seguir este tutorial:
http://devopslab.com.br/como-criar-e-configurar-um-repositorio-local-centos/

2. Templates de instalação

Home-The-Foreman -> Hosts -> Provisioning Templates
Clique nos templates abaixo e associe ao Sistema Operacional CentOS7.
Template—————————–Tipo
Kickstart default PXELinux———–PXELinux
Kickstart RHEL default—————provision
Kickstart default finish————-Finish

theforeman-templates1
Clique em Submit.

3. Criação do Sistema Operacional – parte 2 final

Vá para Home-The-Foreman -> Hosts -> Operating Systems -> Centos 7.0 -> Templates
Associe os templates ao Sistema Operacional.
theforeman-template2
Clique em Submit.

4. Configuração do Servidor de Provisionamento – SmartProxys DHCP, DNS e FTP

Antes de fazer a instalação via rede, precisamos preparar o servidor do Foreman ativando os serviços de DHCP, DNS e TFTP.
O TFTP já foi instalado quando executamos o “Foreman-installer”.

Set up Provisioning
Vá para Home-The-Foreman -> Infrastructure -> Provisioning setup -> Set up Provisioning
Em “Pre-requisites” selecione sua rede.
theforeman-prov1

Network Config
Em “Network Config” preencha os dados da sua rede conforme exemplo do print e clique em Submit.
theforeman-prov2

Você terá um resultado como este:

foreman-installer \
  --enable-foreman-proxy \
  --foreman-proxy-tftp=true \
  --foreman-proxy-tftp-servername=10.0.0.170 \
  --foreman-proxy-dhcp=true \
  --foreman-proxy-dhcp-interface=enp0s3 \
  --foreman-proxy-dhcp-gateway=10.0.0.110 \
  --foreman-proxy-dhcp-range=" " \
  --foreman-proxy-dhcp-nameservers="10.0.0.170" \
  --foreman-proxy-dns=true \
  --foreman-proxy-dns-interface=enp0s3 \
  --foreman-proxy-dns-zone=devopslab.com.br \
  --foreman-proxy-dns-reverse=0.0.10.in-addr.arpa \
  --foreman-proxy-dns-forwarders=8.8.8.8 \
  --foreman-proxy-dns-forwarders=208.67.222.222 \
  --foreman-proxy-dns-forwarders=200.221.11.100 \
  --foreman-proxy-foreman-base-url=https://theforeman01.devopslab.com.br \
  --foreman-proxy-oauth-consumer-key=PYUixcJi5EQwFKqR9nHDTLe7AVjV \
  --foreman-proxy-oauth-consumer-secret=AobRoR8RqHi6kPTj7qwQKV9uQxwv

theforeman-priv4

Execute este trecho de código no servidor do Foreman

[root@theforeman01 ~]# foreman-installer \
>   --enable-foreman-proxy \
>   --foreman-proxy-tftp=true \
>   --foreman-proxy-tftp-servername=10.0.0.170 \
>   --foreman-proxy-dhcp=true \
>   --foreman-proxy-dhcp-interface=enp0s3 \
>   --foreman-proxy-dhcp-gateway=10.0.0.110 \
>   --foreman-proxy-dhcp-range=" " \
>   --foreman-proxy-dhcp-nameservers="10.0.0.170" \
>   --foreman-proxy-dns=true \
>   --foreman-proxy-dns-interface=enp0s3 \
>   --foreman-proxy-dns-zone=devopslab.com.br \
>   --foreman-proxy-dns-reverse=0.0.10.in-addr.arpa \
>   --foreman-proxy-dns-forwarders=8.8.8.8 \
>   --foreman-proxy-dns-forwarders=208.67.222.222 \
>   --foreman-proxy-dns-forwarders=200.221.11.100 \
>   --foreman-proxy-foreman-base-url=https://theforeman01.devopslab.com.br \
>   --foreman-proxy-oauth-consumer-key= PYUixcJi5EQwFKqR9nHDTLe7AVjV \
>   --foreman-proxy-oauth-consumer-secret= AobRoR8RqHi6kPTj7qwQKV9uQxwv
Installing  Done  [100%] [............................]
  Success!
  * Foreman is running at https://theforeman01.devopslab.com.br
      Initial credentials are admin / LcuFswt8wjGLAn7wK
  * Foreman Proxy is running at https://theforeman01.devopslab.com.br:8443
  * Puppetmaster is running at port 8140
  The full log is at /var/log/foreman-installer/foreman-installer.log
[root@theforeman01 ~]#

Installation Media
Na próxima aba “Installation Media” selecione CentOS Mirror.
theforeman-priv3
Agora basta finalizar a configuração.

5. Instalação de um servidor via PXE

Vamos para a parte de instalação propriamente dita, então clique em New Host e siga os passos abaixo.

Nós vamos utilizar o recurso Bare Metal. Bare Metal é um Compute Resource.
Compute Resourses são serviços que podem gerar um host pode exemplo AmazonWS, Docker, OpenStack, Google Compute Engine, Rackspace e etc.

Home-The-Foreman -> Hosts -> New Host

Host
Preencha os campos:
Name: nome-do-servidor
Host Group:
Deploy on: Bare Metal
Environment: production
Puppet CA: theforeman01.devopslab.com.br
Puppet Master: theforeman01.devopslab.com.br
theforeman-host1

Puppet classes
Selecione as classes do Puppet.
theforeman-ntpclass1

Interfaces
Preencha os dados de rede, você precisa ter o MAC Address do servidor alvo da instalação.
O campo “identifier” é referente a placa de rede (eth0, enp0s3 …).
theforeman-interfaces1

Operationg System
Preencha os campos:
Architecture
Operating system
Build mode: Enable this host for provisioning
Media
Partition table
Root password
theforeman-so2

Adittional information
Escolha do tipo de Hardware.
theforeman-addinfo1

Após configurado Host, Puppet Classes, Interfaces, Operating System, Parameters, e Additional Information clique em Submit.
theforeman-end1

Agora ligue a VM ou host físico, selecione o boot via rede (PXE) que a instalação vai começar.
theforeman-redeboot1
theforeman-redeboot2

Pronto, host provisionado e integrado ao Puppet.

The Foreman – Como instalar e configurar o Foreman – Parte 1/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Parte 1 de 3.

The Foreman é uma ferramenta para gerenciamento do ciclo de vida de servidores físicos e virtuais, ele te permite instalar VMs em Clouds como AmazonWS, Google Compute Engine, OpenStack, VMWare e também a instalação de servidores físicos e VMs via PXE (Bootstrap), tudo integrado com a gestão de configuração como Puppet, Ansible, Salt e Chef.

Também tem suporte ao container Docker.

Eu acho um problema quando uma empresa tem vários tipos de Cloud, por exemplo VMware e AmazonWS, sem uma ferramenta de gerência como The Foreman, existirão duas interfaces para gestão, gerencia descentralizada de VMs, é difícil ter uma visão global do ambiente, e o The Foreman centraliza tudo isto, todos os servidores em uma única ferramenta e isto é agilidade.

Com ferramentas como esta, você tem um forte aliado para colocar em prática a cultura DevOps, pois você vai integrar os times em uma única ferramenta, todo mundo vai falar a mesma língua, o time de desenvolvimento vai poder fazer seus deploys e integrações tranquilamente de forma autônoma, o time de Administração estará vendo e controlando tudo que acontece no ambiente, todo mundo vai poder ver e administrar o ambiente, e os ganhos todos sabem, times mais próximos, problemas resolvidos mais rápidos e entregas com mais rapidez e qualidade.

E sem falar que com times mais próximos aumenta a grana para poder rachar o churrasco no fim de semana.

Dê uma lida na introdução sobre o The Foreman:
http://theforeman.org/introduction.html

Entre no site do projeto:
http://theforeman.org/

Github
https://github.com/theforeman/foreman

Parte 1 – Instalação e configuração do The Foreman

1. Pré requisitos
Sistema Operacional Centos 7 X64 – instalação mínima.

Para facilitar desative o Selinux e Firewall mas considere utilizar ambas opções no seu ambiente.

#sed -i "s/enforcing/disabled/g" /etc/selinux/config
#setenforce 0

#systemctl stop firewalld
#systemctl disable firewalld

2. Hostname fqdn
Configure o fqdn do servidor conforme exemplo:

#vi /etc/hosts
10.0.0.170	theforeman01.devopslab.com.br	 theforeman01

#hostname -f
theforeman01.devopslab.com.br

3. Instalação dos repositórios

#rpm -hiv http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
#rpm -hiv http://yum.theforeman.org/releases/1.10/el7/x86_64/foreman-release.rpm
#yum install epel-release

4.Instalação do foreman-installer

#yum install foreman-installer

5.Execução do instalador
Execute o “foreman-installer”. O instalador por padrão vai executar de forma não interativa, mas você pode adicionar o “–i” para uma instalação interativa.

#foreman-installer

Após terminar a execução do foreman-installer você terá um resultado como este:

[root@theforeman01 ~]# foreman-installer 
Installing  Done  [100%] [............................]
  Success!
  * Foreman is running at https://theforeman01.devopslab.com.br
      Initial credentials are admin / LfcuPwtw7jCLAn8wK
  * Foreman Proxy is running at https://theforeman01.devopslab.com.br:8443
  * Puppetmaster is running at port 8140
  The full log is at /var/log/foreman-installer/foreman-installer.log

Agora você já pode logar na interface do The Foreman com as credenciais fornecidas. Entre no The Foreman e altere sua senha.
foremanlogin1

6. Puppet
Execute o puppet agent para a finalização da instalação. O puppet vai aplicar algumas configurações.

#puppet agent -t

Após o término da execução do puppet faça o login no The Foreman e vá para a aba “Hosts”, vai aparecer o próprio servidor do The Foreman, com o status, versão do S.O e etc.
theforemanhome1

theforemanhost1-b
6.1. Gerenciamento do Puppet – instalação do módulo Ntp
É muito importante manter o horário do servidor Foreman e clientes sincronizados portanto instale um módulo ntp no puppet e configure com os servidores ntp da sua localidade.

#puppet module install -i /etc/puppet/environments/production/modules saz/ntp

Após a instalação do módulo ntp faça o login no The Foreman e vá para: Home-The-Foreman –> Configure –> Classes e importe a classe ntp.
theforeman-ntp1-b

Configure o classe Ntp com os servidores de sua preferência.
Home-The-Foreman –> Configure –> Classes –> Ntp –> Smart Class Parameter –> Server List

Para facilitar segue a lista de servidores Ntp Brasileiros: http://www.pool.ntp.org/zone/br
Após a alteração clique no final em “Submit”. Faça o mesmo para a classe “ntp::ntpdate”.

6.2. Inclusão da classe Ntp com o Servidor The Foreman
Após configurado as classes ntp e ntp::update inclua as mesmas ao host The Foreman.

Vá para Home-The-Foreman –> Hosts –> selecione o servidor do Foreman –> clique em Edit

Em Edit –> Puppet Classes –> +NTP (adicione a classe NTP ao host the Foreman) –> Submit
theforeman-ntp3
Por fim rode do comando “puppet agent –t” no Servidor do Foreman para concluir a instalação e configuração do Ntp.

Lembre-se, o processo de instalar um módulo no Puppet, modificar os parâmetros da classe e associar aos hosts é algo que vai acontecer sempre.

Parte 1 – Instalação e configuração finalizada.

Parte 2 – The Foreman – Instalação de hosts via PXE – Bootstrap
Parte 3 – The Foreman – instalação de hosts em Cloud – Amazon Web Services

Abraços

Leonardo Macedo Cerqueira