Podemos ejecutar Kubernetes en una máquina local usando los siguientes métodos,
1. MinKube – Un clúster de Kubernetes de un solo nodo para desarrollo y pruebas.
2. Kubeadm-dind (Kuberadm) – Un clúster de Kubernetes de varios nodos
Aquí, implementaremos un clúster de Kubernetes de múltiples nodos usando el kubeadm. En esta configuración de varios nodos, tendremos un nodo maestro y varios nodos trabajadores (subordinados).
Nodo | Nombre de host | Dirección IP | SO | CPU | RAM |
Nodo maestro | maestro.itzgeek.local | 192.168.1.10 | CentOS 7/RHEL 7 | 2 | 2 GB |
Nodo Minion 1 | nodo1.itzgeek.local | 192.168.1.20 | Ubuntu 18.04/16.04 | 2 | 2GB |
Nodo Minion 2 | nodo2.itzgeek.local | 192.168.1.30 | Debian 9 | 2 | 2 GB |
Debe deshabilitar el intercambio para que Kubernetes funcione correctamente
Aquí, estoy usando un entorno mixto para esta demostración. Sin embargo, le solicito que use un sistema operativo similar solo para facilitar la resolución de problemas.
Requisitos
Conviértase en el usuario root.
su -
O
sudo su -
Establecer nombre de host
Establezca un nombre de host único para todos sus nodos. Ejemplo:
hostnamectl set-hostname master.itzgeek.local
Haga una entrada de host o DNS registro para resolver el nombre de host para todos los nodos.
vi /etc/hosts
Entrada:
192.168.1.10 master.itzgeek.local master
192.168.1.20 node1.itzgeek.local node1
192.168.1.30 node2.itzgeek.local node2
Cortafuegos
Configure Firewall para Kubernetes para que funcione correctamente.
En el nodo maestro
FirewallD:
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload
UFW:
ufw allow 6443/tcp
ufw allow 2379tcp
ufw allow 2380/tcp
ufw allow 10250/tcp
ufw allow 10251/tcp
ufw allow 10252/tcp
ufw allow 10255/tcp
ufw reload
En nodos trabajadores
FirewallD:
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload
UFW:
ufw allow 10251/tcp
ufw allow 10255/tcp
ufw reload
SELinux
Considere deshabilitar SELinux en CentOS 7 / RHEL 7 nodos.
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
Configuración del núcleo
En RHEL 7/CentOS 7 , establezca net.bridge.bridge-nf-call-iptables en 1 en su configuración de sysctl.
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p
Instalar Docker
Instale Docker en todos sus nodos (Master y Minions). Se recomienda la versión 18.06 de Docker, pero las versiones 1.11, 1.12, 1.13 y 17.03 también funcionan bien con Kubernetes.
CentOS 7/RHEL 7
### Install Docker from CentOS/RHEL repository ###
yum install -y docker
systemctl enable docker
systemctl start docker
OR
### Install Docker CE 18.06 from Docker's CentOS repositories ###
# Install Prerequisites
yum install -y yum-utils device-mapper-persistent-data lvm2
# Add Docker repository
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker
yum update
yum install -y docker-ce-18.06.1.ce
# Create Docker Directory
mkdir /etc/docker
# Setup Docker Daemon
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker Daemon
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
Ubuntu 18.04/Ubuntu 16.04
### Install Docker from Ubuntu's repositories ###
apt-get update
apt-get install -y docker.io
OR
### Install Docker CE 18.06 from Docker's repositories for Ubuntu ###
# Install Prerequisites
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Download GPG Key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# Add Docker's Repository
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# Install Docker
apt-get update
apt-get install -y docker-ce=18.06.0~ce~3-0~ubuntu
# Setup Daemon
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker Daemon
systemctl daemon-reload
systemctl restart docker
Debian 9
### Install Docker from Debian's repositories ###
apt-get update
apt-get install -y docker.io
OR
### Install Docker CE 18.06 from Docker's repositories for Debian ###
# Install Prerequisites
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Download GPG Key
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
# Add Docker's Repository
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
# Install Docker
apt-get update
apt-get install -y docker-ce=18.06.0~ce~3-0~debian
# Setup Daemon
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker Daemon
systemctl daemon-reload
systemctl restart docker
Configurar el repositorio de Kubernetes
Kubernetes Los paquetes no están disponibles en los repositorios del sistema operativo, por lo que debe seguir los pasos a continuación para configurar su repositorio en todos sus nodos.
### CentOS 7 / RHEL 7 ###
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
### Ubuntu 18.04 / 16.05 & Debian 9 ###
apt-get update
apt-get install -y curl apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
Instalar kubeadm, kubelet y kubectl
En todos sus nodos, ejecute los siguientes comandos para instalar los paquetes necesarios.
kubeadm:el comando para crear el clúster.
kubelet:se ejecuta en todas las máquinas de su clúster y hace cosas como iniciar pods y contenedores.
kubectl:la utilidad de línea de comandos para administrar su clúster.
### CentOS 7 / RHEL 7 ###
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
systemctl start kubelet
### Ubuntu 16.04 / Debian 9 ###
apt-get update
apt-get install -y kubelet kubeadm kubectl
Inicializar maestro de Kubernetes
En el nodo maestro, ejecute el comando kubeadm init en la terminal para inicializar el clúster.
Según el complemento de red utiliza, es posible que deba configurar el --pod-network-cidr
a un valor específico. Aquí, estoy usando la red Wave pod que no requiere argumentos adicionales. kubeadm init
Salida:
[init] Using Kubernetes version: v1.13.0
[preflight] Running pre-flight checks
[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Activating the kubelet service
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver-kubelet-client" certificate and key
. . .
. . .
. . .
[bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.1.10:6443 --token d1dyaj.31zxywbg93s1ywjy --discovery-token-ca-cert-hash sha256:71a91721595fde66b6382908d801266602a14de8e16bdb7a3cede21509427009
Administrar clúster
Ejecute estos comandos en la terminal para administrar y trabajar en el clúster como un usuario normal.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Ejecute el comando kubectl get pods –all-namespaces para comprobar el estado del clúster.
kubectl get pods --all-namespaces
Salida:
Puedes ver que coredns pod está en estado pendiente y el estado debería cambiar una vez que instale la red de pod.
Configurar la red de pods
Necesitamos configurar un complemento de red de pod en el clúster para que los pods puedan comunicarse entre sí. Hay varios proyectos que proporcionan redes de pods de Kubernetes a saber, calicó, canal, franela, etc.
Aquí, usaremos la red Wave pod para esta demostración.
export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
Salida:
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.extensions/weave-net created
Compruebe el estado del clúster una vez más. El pod de corens ahora debería estar en estado de ejecución.
kubectl get pods --all-namespaces
Salida:
Unir los nodos trabajadores al clúster de Kuberenete
Si recuerda, había un token en la salida del comando kubeadm init para unir nodos. Usa el token y únete a todos tus nodos trabajadores.
kubeadm join 192.168.1.10:6443 --token d1dyaj.31zxywbg93s1ywjy --discovery-token-ca-cert-hash sha256:71a91721595fde66b6382908d801266602a14de8e16bdb7a3cede21509427009
7
Salida:
[preflight] Running pre-flight checks
[discovery] Trying to connect to API Server "192.168.1.10:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.1.10:6443"
[discovery] Requesting info from "https://192.168.1.10:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.1.10:6443"
[discovery] Successfully established connection with API Server "192.168.1.10:6443"
[join] Reading configuration from the cluster...
[join] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "node1.itzgeek.local" as an annotation
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the master to see this node join the cluster.
El resultado anterior confirma que el nodo se ha agregado correctamente al clúster.
Ahora, verifique el estado de los nodos trabajadores en el nodo maestro usando el siguiente comando.
kubectl get nodes
Salida:
Debería ver que los nodos trabajadores están listos.
En nuestro próximo artículo, implementaremos pods, servicios y controladores de replicación en Kubernetes.
Eso es todo.