Tutoriel graphique de déploiement et de construction de clusters Kubernetes (K8S) (le plus complet)

Préparation préliminaire

Étape 1: Construction du routage
logiciel du routeur Étape 2: installez 5 centos7 (installez vous-même)
Lien: https://pan.baidu.com/s/1WIMdpo1TPYLwwLiu6Bk5-w
Code d'extraction: p7go
copiez ce contenu et ouvrez le disque réseau Baidu Application mobile, l'opération est plus pratique
Insérez la description de l'image ici

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

 

Installation de cluster

 

initialisation du système

Définissez le nom d'hôte du système et le fichier hôte

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

Installer les dépendances

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

Définissez le pare-feu sur Iptables et définissez des règles vides

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

Désactivez SELINUX
car K8s détectera si la partition d'échange est fermée lors de son installation. Si elle est activée, le pod peut fonctionner en mémoire virtuelle, ce qui réduit considérablement l'efficacité du travail. (Il peut également être exclu via –ingress)

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

Ajuster les paramètres du noyau, pour les 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

Erreur 1: Afficher / proc / sys / net / bridge / bridge-nf-call-iptables: aucun fichier ou répertoire de ce type

modprobe br_netfilter

Erreur 2: Afficher sysctl: impossible de statuer / proc / sys / net / netfilter / nf_conntrack_max: il n'y a pas de tel fichier ou répertoire

modprobe ip_conntrack

Ajuster le fuseau horaire du système

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

Désactivez les services dont le système n'a pas besoin

systemctl stop postfix && systemctl disable postfix

Définissez rsyslogd et systemd journald pour
permettre à journald de contrôler le transfert

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

Modifiez le noyau système en 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

Modifier 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 ouvre la condition préalable d'
ipvs kube-proxy résout principalement la méthode de planification du pod, l'ouverture de cette condition peut augmenter l'efficacité de l'accès

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

Installez le logiciel 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

Installez Kubeadm (configuration maître-esclave) et
laissez kubeadm démarrer dans 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

L'initialisation du nœud maître
kubeadm extraira certaines images requises du serveur cloud gce lors de l'initialisation du cluster k8s, et cette image est très volumineuse et lente.

S'il y a xxr, vous pouvez créer la machine du cluster K8s
sans xxr via la configuration de routage logiciel , extraire directement Kubeadm-basic.images.tar.gz , le tirer dans le cluster k8s et l'importer.

vim load-images.sh, car il y a trop d'images à importer, utilisez directement le script.

#!/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

Adhésion

# 显示默认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

Insérez la description de l'image ici
Insérez la description de l'image ici

Une fois l'installation terminée, vous devez définir les paramètres suivants

在当前家目录下创建.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

Vérifiez quels nœuds sont actuellement disponibles, kubectl get node
Insérez la description de l'image ici

Pourquoi l'état de NotReady, parce que k8s nécessite un réseau plat pour exister et que le plug-in réseau Flannel n'a pas encore été construit, il est donc toujours NotReady

Déployez le réseau

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

Insérez la description de l'image ici
Rejoignez le nœud maître et d'autres nœuds de travail

Exécutez la commande join dans le journal d'installation du nœud maître sur les nœuds de travail restants (la déclaration se trouve à la fin de l'installation)
kubeadm join 10.0.100.10:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256: fc19a598cb245d762bce819a7777664e664e664e664e764e664e764e764e664e664e764e664e6d764e6a6a6a7a6d8a6a6a6a6a6a6a6a6a3a7a6a6a6a6a3a6a3a6a3d3d3d3d3d3d3d3d3d6d7f0d6
Insérez la description de l'image ici

kubectl get node View
Insérez la description de l'image ici

Harbour adopte un entrepôt privé pour refléter et utiliser

Système Centos7 et installer Docker, comme avec l'installation ci-dessus docker
installer 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 redémarrage docker
Insérez la description de l'image ici

Tirez dans le docker-compose au port

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

Tirez dans le package d'installation du port

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

Créer un certificat https et configurer les répertoires associés

创建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

Insérez la description de l'image ici

Exécutez le script d'installation

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

harbor目录下 ./install.sh

Insérez la description de l'image ici

(1) Problème de réseau, modifiez le nom d'hôte en 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).

Solution : hostnamectl set-hostname hub.atguigu.com
supprimez directement le conteneur et l'image précédents, et réexécutez install.sh

(2) a des points de terminaison actifs

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

résoudre

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

Exécutez à nouveau install.sh

(3) Expiration du délai

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).

résoudre

解决思路:把 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) Reconstruisez le conteneur

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.

résoudre

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

Finalement réussi, toutes sortes d'erreurs ont été rapportées, étape par étape, enfin guéries! ! !
Insérez la description de l'image ici

Insérez la description de l'image ici

W10 hôte réel
C: \ Windows \ System32 \ drivers \ etc \ hosts
10.0.100.13
accès au navigateur hub.atguigu.comhub.atguigu.com

Dans le fichier /usr/local/harbor/harbor.cfg, le
nom d'utilisateur par défaut est admin et le
mot de passe par défaut est Harbor12345
Insérez la description de l'image ici

Détection de cluster

Vérifiez si l'entrepôt du port peut être utilisé par les k8, puis docker doit pouvoir l'utiliser avant que les k8 puissent être utilisés

1. L'
erreur de détection de docker sur node01 peut être due au format json.
Vérifiez si /etc/docker/daemon.json est au format suivant

{
    
    
  "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

Ré-étiqueter, car l'image push doit être nommée hub.atguigu.com pour le
Insérez la description de l'image ici
processus complet
Insérez la description de l'image ici

2. Testez si le cluster k8s est disponible et la connexion à l'entrepôt miroir.
Démarrez le pod dans k8s pour voir si tout va bien.
Insérez la description de l'image ici

Exécution 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

Insérez la description de l'image ici

Ensuite, allez à node01 pour voir s'il y a nginx
docker ps -a | grep nginx
tant que vous exécutez un pod, il y aura une pause
Insérez la description de l'image ici

Si le maître veut accéder à node01, curl directement l'IP, car il s'agit d'un réseau plat
curl 10.244.2.2
curl 10.244.2.2/hostname.html pour obtenir le nom du pod De
Insérez la description de l'image ici
cette manière, l'entrepôt privé est connecté avec succès. Réduisez la pression sur les ressources réseau externes

3. Vue de l'entrepôt du port, temps de téléchargement miroir 1
Insérez la description de l'image ici

Démonstration de la fonction de cluster

kubectl get pod obtient le pod
kubectl delete pod Name supprime le pod
kubectl get pod obtient le pod, je trouve qu'il y en a un autre, qui est différent du nom précédent
Insérez la description de l'image ici

Étant donné que la copie réplicas = 1 a été spécifiée lors de la précédente exécution de kubectl, elle restera à 1.

 
S'il y a trop de pression un jour, peut-elle être augmentée?
kubectl get pod
kubectl scale --replicas = 3 deployment / nginx-deployment
kubectl get pod
kubectl get pod -o wide
Insérez la description de l'image ici
Insérez la description de l'image ici

 
accès au chargement nginx via SVC
kubectl expose --help
kubectl expose le déploiement nginx-deployment --port = 30000 --target-port = 80 pour
accéder au port 30000 du serveur et au port 80 du conteneur

kubectl obtenir svc
Insérez la description de l'image ici

Le test d'accès curl est un mécanisme d'interrogation
Insérez la description de l'image ici

ipvsadm -Ln | grep 10.105.236.174
Insérez la description de l'image ici

kubectl get pod -pod -o wide a
Insérez la description de l'image ici
constaté que le mécanisme SVC consiste à planifier le module LVS pour réaliser l'équilibrage de charge. Il s'agit de l'adresse interne.

Et si des étrangers veulent visiter? Type de modification
kubectl get svc
kubectl edit svc nginx-deployment
type: NodePort
Insérez la description de l'image ici
kubectl get svc
Insérez la description de l'image ici

netstat -anpt | grep 30000
netstat -anpt | grep 32651
expose un tel port sur tous les nœuds, puis le navigateur peut accéder directement au port 32651
Insérez la description de l'image ici

10.0.100.10:32651
10.0.100.11:32651
10.0.100.12:32651 De
cette façon, en passant au type NodePort, vous pouvez accéder aux services dans k8s sur le Web.

Insérez la description de l'image ici

Enfin vous avez terminé! ! ! ! ! ! ! ! ! !

Je suppose que tu aimes

Origine blog.csdn.net/qq_39578545/article/details/108861006
conseillé
Classement