1. Preparación del entorno
1. Condiciones previas del entorno de la máquina
La demostración actual prepara 3 entornos de máquina virtual o 3 servidores en la nube de Alibaba
k8s-master01: Esta máquina se utiliza para instalar el entorno operativo de k8s-master
k8s-node01: Esta máquina El entorno utilizado para instalar el nodo k8s node
k8s-node02: esta máquina se utiliza para instalar el entorno del nodo k8s node
Modifique la configuración de la red para asegurarse de que la red de la máquina virtual esté conectada, y la cantidad de núcleos de CPU del
nodo de conexión Xshell debe ser: >= 2 núcleos; de lo contrario, k8s no puede iniciar la
red DNS: es mejor configurarlo en el DNS conectado a la red local, de lo contrario, la red se bloquea y algunas imágenes espejo no se pueden descargar
. Kernel: el kernel de Linux debe tener la versión 4 o superior, por lo que se debe actualizar el kernel de Linux.
La preparación del entorno previo está completa
2. Instalación y configuración del entorno dependiente
Nota: Cada máquina debe instalar este entorno dependiente
1. Establezca el nombre de host para cada máquina
hostnamectl conjunto-nombre de host k8s-master01
hostnamectl conjunto-nombre de host k8s-node01
hostnamectl conjunto-nombre de host k8s-node02
Ver nombre de host
nombre de host
Configurar la relación de asignación de host de IP
vi /etc/hosts
192.168.66.10 k8s-master01
192.168.66.11 k8s-node01
192.168.66.12 k8s-node02
2. La instalación depende del entorno
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat
libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge-
utils unzip bind-utils gcc
3. Instale iptables, inicie iptables, configure el inicio automáticamente, borre las reglas de iptables, guarde las reglas actuales en las reglas predeterminadas, cierre el firewall y configure el inicio para deshabilitar el firewall
systemctl detener firewalld && systemctl deshabilitar firewalld
iptables vacias
yum -y install iptables-services && systemctl start iptables && systemctl enable
iptables && iptables -F && service iptables save
4. Cierre selinux,
cierre la partición de intercambio [memoria virtual] y cierre permanentemente la memoria virtual
intercambio -a && sed -i '/ intercambio / s/^(.*)$/#\1/g' /etc/fstab
cerrar selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=deshabilitado/' /etc/selinux/config
5. Actualice el kernel de Linux a la versión 4.44
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
instalar núcleo
yum --enablerepo=elrepo-kernel install -y kernel-lt
Consulta de núcleos instalados
rpm-qa | núcleo grep
Ver elementos de inicio predeterminados
awk -F' '$1=="menuentry" {imprimir $2}' /etc/grub2.cfg
Encuentre el nombre del nuevo kernel en el comando anterior, ejecute el siguiente comando después del reemplazo, para que el arranque comience desde el nuevo kernel
grub2-set-default 'CentOS Linux (4.4.230-1.el7.elrepo.x86_64) 7 (Núcleo)'
Reinicie la máquina. Nota: después de configurar el kernel, debe reiniciar el servidor para que surta efecto.
reiniciar
Consultar el kernel después de reiniciar
uname -r
6. Ajuste los parámetros del kernel, para k8s
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
máquina virtual. swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
Copie el archivo del kernel optimizado en la carpeta /etc/sysctl.d/, de modo que se pueda llamar al archivo optimizado al arrancar
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
Actualizar manualmente para que el archivo optimizado surta efecto inmediatamente
sysctl -p /etc/sysctl.d/kubernetes.conf
La actualización manual anterior tendrá esta excepción, simplemente ignórela, porque un componente no está cargado
sysctl: no se puede stat /proc/sys/net/netfilter/nf_conntrack_max: No existe tal archivo o
directorio
7. Ajuste el área temporal del sistema (omítala si se ha configurado)
y configure la zona horaria del sistema en China/Shanghai
timedatectl set-timezone Asia/Shanghái
Escriba la hora UTC actual en el reloj del hardware
timedatectl set-local-rtc 0
Reiniciar servicios que dependen de la hora del sistema
systemctl reiniciar rsyslog
systemctl reiniciar crond
8. Apague los servicios innecesarios del sistema
systemctl detener postfijo && systemctl deshabilitar postfijo
9. Configure el método de almacenamiento de registros
y cree un directorio para guardar registros
mkdir /var/log/diario
Crear directorio de almacenamiento de archivos de configuración
mkdir /etc/systemd/journald.conf.d
Crear archivo de configuración
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Diario]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog= sin
FEO
Reiniciar la configuración de systemd journald
systemctl reiniciar systemd-journald
10. Ajuste el número de archivos abiertos (se puede ignorar, no ejecutar)
echo “* nofile suave 65536” >> /etc/security/limits.conf
echo “* nofile duro 65536” >> /etc/security/limits.conf
11. kube-proxy abre las condiciones previas de ipvs
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
modprobe – nf_conntrack_ipv4
EOF
Use el comando lsmod para ver si estos archivos se inician
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e
nf_conntrack_ipv4
3. implementación de docker
1. dependencias de instalación
yum install -y yum-utils mapeador de dispositivos-datos persistentes lvm2
Agregue la fuente del software yum
(configure un almacén estable y la configuración del almacén se mantendrá en el archivo /etc/yum.repos.d/docker-ce.repo) y elija uno de los dos siguientes
administrador de configuración de yum --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum- config -manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Actualice los paquetes de Docke relacionados instalados por Yum e instale Docker CE
yum actualizar -y && yum instalar ventana acoplable-ce
Probar si la instalación es exitosa
ventana acoplable -v
Ejemplo de solución de falla de descarga de yum
Si hay un problema de falla de descarga, como el siguiente
Error al descargar paquetes:
3:docker-ce-19.03.12-3.el7.x86_64: [Errno 256] No hay más espejos para probar.
containerd.io-1.2.13-3.2.el7.x86_64: [Errno 256] No más espejos para probar
borrar yum caché
ñam limpiar todo
Ejecute el comando anterior para agregar la fuente del software yum para cambiar la fuente
y verificar si la configuración del almacén se modifica para que surta efecto.
vi /etc/yum.repos.d/docker-ce.repo
Vuelva a ejecutar el siguiente comando de descarga de actualización
yum actualizar -y && yum instalar ventana acoplable-ce
2. Configure el archivo daemon de docker
y cree el directorio /etc/docker
mkdir /etc/docker
Actualice el archivo daemon.json + configure el servicio de duplicación de contenedores en la nube de Alibaba
cat > /etc/docker/daemon.json <<EOF
{ “exec-opts”: [“native.cgroupdriver=systemd”], “registry-mirrors”: [“https://tda5gnvq.mirror.aliyuncs.com” ], "controlador de registro": "archivo json", "opciones de registro": {"tamaño máximo": "100 m"} } EOF
Nota: asegúrese de prestar atención al problema de codificación, si hay un error: verifique el comando: journalctl -amu docker para encontrar el error
Cree y almacene el archivo de configuración de docker
mkdir -p /etc/systemd/system/docker.service.d
3. Reinicie el servicio Docker y configure Docker para que se inicie automáticamente al arrancar
systemctl daemon-reload && systemctl reiniciar docker && systemctl habilitar docker
Pruébelo con imágenes acoplables, Nota: si no se inicia, hay un problema con el archivo de configuración
4. kubeadm [instalación de una tecla k8s]
Al instalar kubernetes, debe instalar kubelet, kubeadm y otros paquetes, pero la fuente de yum proporcionada por el sitio web oficial de k8s es
packages.cloud.google.com, a la que no se puede acceder a nivel nacional. En este momento, podemos usar el espejo del almacén yum de Alibaba Cloud
1. Configure la imagen del almacén yum de Alibaba Cloud
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
nombre=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
habilitado=1
gpgcheck=0
repo_gpgcheck =0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2. Instale kubeadm, kubelet, kubectl
yum install -y kubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
Configure kubelet para que se inicie automáticamente al arrancar e inicie kubelet
systemctl habilitar kubelet && systemctl iniciar kubelet
2. Instalación del clúster
1. Instalar la imagen básica en cada nodo
Mostrar qué imágenes básicas se requieren para instalar k8s
lista de imágenes de configuración de kubeadm
Cuando kubeadm inicialice el clúster k8s, descargará (extraerá) la imagen correspondiente de la nube gce de Google.
Por supuesto, puede elegir ejecutar docker pull. De acuerdo con la imagen que muestra el comando anterior, la imagen se extrae una por una ,
pero la imagen es relativamente grande y la descarga puede fallar. Por lo tanto, importe el paquete de imágenes descargado al almacén de imágenes de la ventana
acoplable
local
. la imagen
tar -zxvf kubeadm-basic.images.tar.gz
Después de la descompresión, como se muestra en la figura, por supuesto, también puede usar docker load -i xxx.tar para importar las imágenes de los paquetes tar al almacén local uno por uno. 2. Escriba el archivo de script, importe el paquete de
imágenes en el almacén espejo de la ventana acoplable local y
cree un archivo de script sh en cualquier directorio
toque image-load.sh
vi image-load.sh importa el siguiente código de secuencia de comandos
Tenga en cuenta que /root/kubeadm-basic.images es la ubicación del directorio donde se descomprime su imagen local
#!/bin/bash
ls /root/kubeadm-basic.images > /tmp/images-list.txt
cd /root/kubeadm-basic.images
for i in $(cat /tmp/images-list.txt)
do
docker load -i $i
done
rm -rf /tmp/images-list.txt
Modificar permisos, permisos ejecutables
chmod 755 carga-imagen.sh
Ejecute el archivo de script para iniciar la importación de imágenes
./image-load.sh
Ver la imagen del almacén local
Imágenes de docker
3. Transfiera archivos e imágenes espejo a otros nodos
Nota: Otras máquinas también necesitan instalar el entorno K8S, así que transfiera paquetes tar espejo y archivos de secuencias de comandos a otros nodos
Nota: Ejecute en el host maestro actual y
transfiera al nodo node01
scp -r image-load.sh kubeadm-basic.images root@k8s-node01:/root/
Pasar al nodo node02
scp -r image-load.sh kubeadm-basic.images root@k8s-node02:/root/
Otros nodos ejecutan el script sh a su vez para importar la imagen
./image-load.sh
2. Implemente Kubernetes
Implementación con un solo clic mediante la implementación de archivos yaml
Nota: Los siguientes pasos se pueden ejecutar en el host principal
1. Extraiga el archivo de configuración de recursos yaml
kubeadm config print init-defaults > kubeadm-config.yaml
2. Modifique el archivo de recursos yaml.
Nota: la parte que debe modificarse se muestra en la siguiente figura.
localAPIEndpoint:
advertiseAddress: 192.168.52.105 # 注意:修改配置文件的IP地址
kubernetesVersion: v1.15.1 #注意:修改版本号,必须和kubectl版本保持一致
networking:
# 指定flannel模型通信 pod网段地址,此网段和flannel网段一致,不用变
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
#添加如下内容指定使用ipvs网络进行通信,注意缩进
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: kubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
3. Inicialice el nodo principal y comience la implementación
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee
kubeadm-init.log
Nota: Para ejecutar este comando, la cantidad de núcleos de CPU debe ser superior a 1 núcleo, de lo contrario, no se puede ejecutar con éxito.
Después de que el nodo maestro de Kubernetes se haya inicializado con éxito, es el siguiente:
4. Ejecute los siguientes comandos de acuerdo con el mensaje de K8S
para crear un directorio, guardar el caché de configuración de conexión y autenticar el archivo
mkdir -p $INICIO/.kube
Copie el archivo de configuración de administración del clúster
cp -i /etc/kubernetes/admin.conf $INICIO/.kube/config
Autorizar al perfil
chown ( id − u ) : (id -u):( yo _−tu ): (id -g) $INICIO/.kube/config
nodo de nodo de consulta
nodo de obtención de kubectl
Se encuentra que la información del nodo se puede consultar con éxito, pero el estado del nodo es No listo, no en ejecución. El motivo es que usamos ipvs+frannel para la comunicación de red en este momento, pero el complemento de red de franela no se ha implementado, por lo que el estado del nodo es NotReady en este momento.
3. Implemente el complemento de red de franela
De manera similar, extraer espejos externos es lento y propenso a fallar, así que use el espejo de franela descargado localmente y cargue el paquete flannel.tar Nota: tanto los
nodos maestro como los esclavos deben cargar y realizar una importación posterior y etiquetado operan
Importe el paquete tar del espejo al repositorio espejo local
docker load -i flannel.tar
Etiquete la imagen y genere una nueva imagen de versión v1 en el almacén local
etiqueta acoplable quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64 franela:v1
Nota: las imágenes de la ventana acoplable ven máquinas maestras y esclavas
Nota: Los siguientes pasos se pueden ejecutar en el host maestro para
pasar el archivo yml local (modificado a la versión flannel:v1)
franela de despliegue yml
kubectl create -f kube-flannel.yml
Después de que la ejecución sea exitosa, verifique con kubectl get node, es posible que aún esté en el estado NotReady, y llevará algún tiempo verificar si la franela en el pod del sistema que se ha estado ejecutando en kubectl-system se está ejecutando a través de kubectl get pod -n
sistema kube-
Si está en el estado Listo cuando se ve, significa que los componentes de la red se implementaron correctamente.
Apéndice: kubectl get pod -n kube-system explica que
todos los recursos de k8s se implementan a través de la duplicación y el modo de ejecución se refleja a través de los pods. Estos pods son recursos del sistema k8s. Pod -n significa espacio de nombres significa kube- La información del pod debajo del sistema
se puede agregar el espacio de nombres -o wide para ver los detalles del pod
cubectl get pod -n sistema-cubo -o ancho
Apéndice: se encuentra que los pods implementados a través de la franela tienen problemas similares de pendiente e ImagePullBackOff.Consulte
la información de registro detallada de un pod para encontrar la causa del error (generalmente la falla al extraer la imagen)
kubectl describe pod kube-flannel-ds-amd64-jd67h -n kube-system
Si se modificó el archivo kube-flannel.yml, use el siguiente comando para actualizar e implementar
kubectl apply -f kube-flannel.yml
4. Otros nodos se unen
Después de construir el nodo maestro de kubernetes con éxito, se generará un archivo de registro kubeadm-init.log, cuyo contenido se muestra en la siguiente figura: (El
archivo de salida de registro "tee kubeadm-init.log" se especifica en el comando)
únase al nodo maestro y Para otros nodos de trabajo, ejecute el comando en el registro de instalación para
ver el archivo de registro
gato kubeadm-init.log
El comando dado en la parte roja de la figura a continuación es el comando para agregar otros nodos
Simplemente copie el comando a varios otros nodos de nodo para su ejecución (tenga en cuenta que se ejecuta en otros servidores esclavos).
Después de la ejecución, puede verificar kubectl get node en el host maestro
y encontrar que todavía hay nodos en el estado NotReady, porque el Los contenedores de pod de estos nodos todavía están en el estado de inicialización lleva tiempo.Cuando
otros nodos se unen y están en el estado Listo, el clúster K8S se construye correctamente.