Tutorial gráfico de implementación y construcción de clústeres de Kubernetes (K8S) (el más completo)

Preparación preliminar

Paso 1: Construcción de enrutamiento suave del enrutador
Paso 2: instale 5 centos7 (instálelo usted mismo)
Enlace: https://pan.baidu.com/s/1WIMdpo1TPYLwwLiu6Bk5-w
Código de extracción: p7go
copie este contenido y abra el disco de red de Baidu Aplicación móvil, la operación es más conveniente.
Inserte la descripción de la imagen aquí

1、安装k8s的节点必须是大于1核心的CPU
2、安装节点的网络信息
master
BOOTPROTO=static
IPADDR=10.0.100.10
NETMASK=255.255.255.0
GATEWAY=10.0.100.8  #指定到koolshare的软路由上

node1
BOOTPROTO=static
IPADDR=10.0.100.11
NETMASK=255.255.255.0
GATEWAY=10.0.100.8

node2
BOOTPROTO=static
IPADDR=10.0.100.12
NETMASK=255.255.255.0
GATEWAY=10.0.100.8

3、koolshare 软路由的默认面是koolshare

 

Instalación de clúster

 

inicialización del sistema

Establecer el nombre de host del sistema y el archivo de host

hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

Instalar dependencias

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

Establezca el firewall en Iptables y establezca reglas vacías

systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

Apague SELINUX
porque K8s detectará si la partición de intercambio está cerrada cuando se instala. Si está encendida, el pod puede ejecutarse en la memoria virtual, lo que reduce en gran medida la eficiencia del trabajo. (También se puede excluir mediante –ingress)

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

Ajustar los parámetros del kernel, para K8

必备三调参数:开启bridge网桥模式,关闭ipv6协议
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
vm.swappiness=0 # 禁止使用swap空间,只有当系统OOM时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启OOM
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
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

Error 1: Mostrar / proc / sys / net / bridge / bridge-nf-call-iptables: no existe tal archivo o directorio

modprobe br_netfilter

Error 2: Mostrar sysctl: no se puede stat / proc / sys / net / netfilter / nf_conntrack_max: no existe tal archivo o directorio

modprobe ip_conntrack

Ajustar la zona horaria del sistema

# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

Apague los servicios que no requiera el sistema

systemctl stop postfix && systemctl disable postfix

Configure rsyslogd y systemd journald para
permitir que journald controle el reenvío

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d # 配置文件存放目录
# 创建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 10G
SystemMaxUse=10G

# 单日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存时间2周
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald

Modifique el kernel del sistema a 4.44

CentOS 7.x系统自带的3.10x内核存在一些Bugs,导致运行的Docker、Kubernetes不稳定。
rpm -Uvh http://mirror.ventraip.net.au/elrepo/elrepo/el7/x86_64/RPMS/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"


检测:
[root@k8s-master01 ~]# uname -r
4.4.237-1.el7.elrepo.x86_64

Modificar DNS

vim /etc/hosts
10.0.100.10 k8s-master01
10.0.100.11 k8s-node01
10.0.100.12 k8s-node02

scp /etc/hosts root@k8s-node01:/etc/hosts
scp /etc/hosts root@k8s-node02:/etc/hosts

kube-proxy abre la condición previa de
ipvs kube-proxy resuelve principalmente el método de programación del pod, abrir esta condición puede aumentar la eficiencia del acceso

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

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_contrack_ipv4

Instalar el software Docker

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager \
 --add-repo \
 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum update -y && yum install -y docker-ce

## 创建/etc/docker目录
mkdir /etc/docker

# 配置daemon
cat > /etc/docker/daemon.json << EOF
{
	"exec-opts":["native.cgroupdriver=systemd"],
	"log-driver":"json-file",
	"log-opts":{
		"max-size":"100m"
	}
}
EOF

# 创建存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d

# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

Instale Kubeadm (configuración maestro-esclavo) y
deje que kubeadm arranque en k8s

cat <<EOF >/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=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

yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1

# kubelet是与容器接口进行交互,而k8s通过kubeadm安装以后都是以Pod方式存在,底层是以容器的方式运行。所以一定要开机自启,不然的话启动不了k8s集群
systemctl enable kubelet.service

La inicialización del nodo maestro
kubeadm extraerá algunas imágenes necesarias del servidor en la nube de gce al inicializar el clúster k8s, y esta imagen es muy grande y lenta.

Si hay xxr, puede hacer que la máquina del clúster K8s
sin xxr a través de la configuración de enrutamiento suave , extraer directamente Kubeadm-basic.images.tar.gz , extraerlo al clúster k8s e importarlo.

vim load-images.sh, debido a que hay demasiadas imágenes para importar, use el script directamente.

#!/bin/bash
# 默认会解压到/root/kubeadm-basic.imageswe文件下
tar -zxvf /root/kubeadm-basic.images.tar.gz
ls /root/kubeadm-basic.images > /tmp/image-list.txt
cd /root/kubeadm-basic.images

for i in $( cat /tmp/image-list.txt )
do
	docker load -i $i
done

rm -rf /tmp/image-list.txt

Adhesión

# 显示默认init初始化文件打印到 yaml文件中。从而得到默认的初始化模板
kubeadm config print init-defaults > kubeadm-config.yaml

vim kubeadm-config.yaml
修改为(默认的调度方式是ipvs):
advertiseAddress: 10.0.100.10
kubernetesVersion: v1.15.1
添加覆盖: 
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {
    
    }
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

然后
kubeadm init --config=kubeadm-config.yaml | tee kubeadm-init.log

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Una vez completada la instalación, también se requieren los siguientes ajustes

在当前家目录下创建.kube文件,这里会保存连接配置
kubectl和kubeapi交互,采取HTTPS协议,所以需要些缓存和认证文件都会保存到.kube文件
然后拷贝管理配置文件到.kube目录下

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Compruebe qué nodos están disponibles actualmente, kubectl get node
Inserte la descripción de la imagen aquí

¿Por qué el estado de NotReady? Porque k8s requiere una red plana para existir y el complemento de red Flannel aún no se ha creado, por lo que todavía no está listo.

Implementar la red

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master01 ~]# mkdir install-k8s
mv kubeadm-init.log kubeadm-config.yaml install-k8s/
cd install-k8s/
mkdir core
mv * core/
mkdir plugin
cd plugin
mkdir flannel
cd flannel/
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl create -f kube-flannel.yml

查看组件运行,发现flannel已经在运行
kubectl get pod -n kube-system

发现已经ready了
kubectl get node

原理:kubectl是命令行管理工具,get获取pod状态,-n是指定名称空间为kube-system。因为所有的系统组件都被安装在kube-system
如果不加-n指定,默认是default

Inserte la descripción de la imagen aquí
Únase al nodo maestro y otros nodos de trabajo

Ejecute el comando de unión en el registro de instalación del nodo maestro en los nodos de trabajo restantes (la declaración se encuentra al final de la instalación)
kubeadm join 10.0.100.10:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256: fc19a598cb245d740edb58ca9756e71986
Inserte la descripción de la imagen aquí

kubectl obtener vista de nodo
Inserte la descripción de la imagen aquí

Harbour adopta un almacén privado para reflejar y usar

Centos7 e instale Docker, como con la ventana acoplable de instalación anterior
install docker

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager \
 --add-repo \
 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum update -y && yum install -y docker-ce

## 创建/etc/docker目录
mkdir /etc/docker

# 配置daemon
cat > /etc/docker/daemon.json << EOF
{
	"exec-opts":["native.cgroupdriver=systemd"],
	"log-driver":"json-file",
	"log-opts":{
		"max-size":"100m"
	}
}
EOF

# 创建存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d

# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

vim /etc/docker/daemon.json

为了让k8s集群信任这个自己制作的证书
每个节点,包括harbor都需要加这么一句话

"insecure-registries": ["https://hub.atguigu.com"]

systemctl reiniciar ventana acoplable
Inserte la descripción de la imagen aquí

Tire de docker-compose al puerto

mv docker-compose /usr/local/bin/
chmod a+x /usr/local/bin/docker-compose

Tire del paquete de instalación del puerto

tar -zxvf harbor-offline-installer-v1.2.0.tgz 
mv harbor /usr/local/
cd /usr/local/harbor/
vim harbor.cfg
修改:
hostname = hub.atguigu.com
ui_url_protocol = https

Cree un certificado https y configure directorios relacionados

创建https证书的目录,在harbor.cfg对应
mkdir -p /data/cert
cd /data/cert

# 创建私钥密码
openssl genrsa -des3 -out server.key 2048 
# ssl请求
# 国家名 CN
# 省 GD
# 组织 atguigu
# 域名 hub.atguigu.com
# Common Name (eg, your name or your server's hostname) []:hub.atguigu.com
openssl req -new -key server.key -out server.csr
# 备份私钥 
cp server.key server.key.org 
# 转换成证书,让私钥的密码退掉,因为docker启动时私钥的证书有密码,会启动不成功
openssl rsa -in server.key.org -out server.key 
# 证书签名
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 
# 证书赋予权限 
chmod -R 777 /data/cert

Inserte la descripción de la imagen aquí

Ejecute el script de instalación

每个节点
echo "10.0.100.13 hub.atguigu.com" >> /etc/hosts

harbor目录下 ./install.sh

Inserte la descripción de la imagen aquí

(1) Problema de red, cambie el nombre de host a hub.atguigu.com

ERROR: for harbor-ui  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70)

ERROR: for ui  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70)
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).

Solución : hostnamectl set-hostname hub.atguigu.com
elimine directamente el contenedor y la imagen anteriores, y vuelva a ejecutar install.sh

(2) tiene puntos finales activos

ERROR: error while removing network: network harbor_harbor id 91ec97d7a1f661e4d687b7d69c3060144de77df113f0205590f07fb39843f44b has active endpoints

resolver

docker network inspect harbor_harbor
//断开网络,这里有两个Name参数 ,分别是上面标记的参数一和参数二
docker network disconnect -f harbor_harbor harbor-ui
//然后执行
docker-compose up -d

Ejecute install.sh nuevamente

(3) Se agotó el tiempo

ERROR: for jobservice  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).

resolver

解决思路:把 COMPOSE_HTTP_TIMEOUT 的值调大,并转为环境变量即可。

解决步骤:
先进入/etc/profile配置文件,执行命令:

vi /etc/profile
然后在尾部添加上下面代码:
export COMPOSE_HTTP_TIMEOUT=500
export DOCKER_CLIENT_TIMEOUT=500
接着使/etc/profile配置文件生效,执行命令:

source /etc/profile
最后重新执行命令 docker-compose up 即可。

(4) Reconstruir el contenedor

ERROR: for 30a708d1ccb1_harbor-ui  b'You cannot remove a running container 30a708d1ccb166cb63885c4aa66e73a4b1c0e5b815185d990eb5190e16463da7. Stop the container before attempting removal or force remove'

ERROR: for ui  b'You cannot remove a running container 30a708d1ccb166cb63885c4aa66e73a4b1c0e5b815185d990eb5190e16463da7. Stop the container before attempting removal or force remove'
ERROR: Encountered errors while bringing up the project.

resolver

删除不掉容器文件占用,其实是网络问题。
解决办法如下
1、docker stop 容器ID\容器名   先暂停
2、docker network disconnect --force bridge 容器ID\容器名   清除网络
3、docker rm -f 容器ID\容器名  再强制删除

Finalmente tuvo éxito, se informaron todo tipo de errores, paso a paso, ¡finalmente se curaron! ! !
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

W10 host real
C: \ Windows \ System32 \ drivers \ etc \ hosts
10.0.100.13
acceso al navegador hub.atguigu.comhub.atguigu.com

En el archivo /usr/local/harbor/harbor.cfg, el
nombre de usuario predeterminado es admin y la
contraseña predeterminada es Harbor12345
Inserte la descripción de la imagen aquí

Detección de conglomerados

Verifique si el almacén del puerto puede ser utilizado por k8s, luego Docker debe poder usarlo antes de que k8s pueda usarse

1. El
error de detectar la ventana acoplable en el nodo01 puede deberse al formato json.
Verifique si /etc/docker/daemon.json tiene el siguiente formato

{
    
    
  "exec-opts":["native.cgroupdriver=systemd"],
  "log-driver":"json-file",
  "log-opts":{
    
    
  "max-size":"100m"
  },
  "insecure-registries": ["https://hub.atguigu.com"]
}

然后重启一下docker:
systemctl daemon-reload 
systemctl restart docker
docker login https://hub.atguigu.com
docker pull wangyanglinux/myapp:v1  在公共docker hub拉取

重新打标签,因为推送镜像必须要命名成hub.atguigu.com
docker tag wangyanglinux/myapp:v1 hub.atguigu.com/library/myapp:v1
docker push hub.atguigu.com/library/myapp:v1

刷新查看镜像情况
docker images

然后删除镜像,为了后面验证k8s集群是否可下载
docker rmi -f hub.atguigu.com/library/myapp:v1
docker rmi -f wangyanglinux/myapp:v1

Vuelva a etiquetar, porque la imagen de inserción debe llamarse hub.atguigu.com para el
Inserte la descripción de la imagen aquí
proceso completo
Inserte la descripción de la imagen aquí

2. Pruebe si el clúster k8s está disponible y la conexión al almacén espejo.
Inicie el módulo en k8s para ver si está bien
Inserte la descripción de la imagen aquí

Ejecución de k8s-master01:

暴露端口80和docker的80是不一样的,不写也可以访问的,因为是扁平化网络
kubectl run nginx-deployment --image=hub.atguigu.com/library/myapp:v1 --port=80 --replicas=1
kubectl get deployment
kubectl get rs
kubectl get pod
kubectl get pod -o wide

Inserte la descripción de la imagen aquí

Luego vaya a node01 para ver si hay nginx
docker ps -a | grep nginx
siempre que ejecute un pod, habrá una pausa
Inserte la descripción de la imagen aquí

Si el maestro quiere acceder a node01, curl directamente la IP, porque es una red plana
curl 10.244.2.2
curl 10.244.2.2/hostname.html para obtener el nombre del pod. De
Inserte la descripción de la imagen aquí
esta manera, el almacén privado se conecta correctamente. Reducir la presión sobre los recursos de red externos

3. Vista del almacén del puerto, tiempos de descarga duplicados 1
Inserte la descripción de la imagen aquí

Demostración de la función de clúster

kubectl get pod obtiene el pod
kubectl delete pod Name elimina el pod
kubectl get pod obtiene el pod, encuentro que hay otro, que es diferente del nombre anterior
Inserte la descripción de la imagen aquí

Debido a que la copia réplicas = 1 se ha especificado en la ejecución anterior de kubectl, permanecerá en 1.

 
Si hay demasiada presión un día, ¿se puede expandir?
kubectl get pod
kubectl scale --replicas = 3 deployment / nginx-deployment
kubectl get pod
kubectl get pod -o wide
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

 
acceso de carga nginx a través de SVC
kubectl expose --help
kubectl expose deployment nginx-deployment --port = 30000 --target-port = 80 para
acceder al puerto 30000 del servidor y al puerto 80 del contenedor

kubectl obtener svc
Inserte la descripción de la imagen aquí

La prueba de acceso curl es un mecanismo de sondeo
Inserte la descripción de la imagen aquí

ipvsadm -Ln | grep 10.105.236.174
Inserte la descripción de la imagen aquí

kubectl get pod -pod -o wide
Inserte la descripción de la imagen aquí
descubrió que el mecanismo SVC es programar el módulo LVS para lograr el equilibrio de carga Esta es la dirección interna.

¿Qué pasa si los forasteros quieren visitar? Tipo de modificación
kubectl get svc
kubectl edit svc nginx-deployment
type: NodePort
Inserte la descripción de la imagen aquí
kubectl get svc
Inserte la descripción de la imagen aquí

netstat -anpt | grep 30000
netstat -anpt | grep 32651
expone dicho puerto en todos los nodos, y luego el navegador puede acceder directamente al puerto 32651
Inserte la descripción de la imagen aquí

10.0.100.10:32651
10.0.100.11:32651
10.0.100.12:32651 De
esta manera, al cambiar al tipo NodePort, puede acceder a los servicios dentro de k8s en la web.

Inserte la descripción de la imagen aquí

¡Finalmente has terminado! ! ! ! ! ! ! ! ! !

Supongo que te gusta

Origin blog.csdn.net/qq_39578545/article/details/108861006
Recomendado
Clasificación