Instalación del clúster de Kubernetes
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.
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
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
¿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
Ú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
kubectl obtener vista de nodo
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
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
Ejecute el script de instalación
每个节点
echo "10.0.100.13 hub.atguigu.com" >> /etc/hosts
harbor目录下 ./install.sh
(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! ! !
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
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
proceso completo
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
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
Luego vaya a node01 para ver si hay nginx
docker ps -a | grep nginx
siempre que ejecute un pod, habrá una pausa
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
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
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
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
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
La prueba de acceso curl es un mecanismo de sondeo
ipvsadm -Ln | grep 10.105.236.174
kubectl get pod -pod -o wide
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
kubectl get svc
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
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.
¡Finalmente has terminado! ! ! ! ! ! ! ! ! !