Installation du cluster Kubernetes
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
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
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
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
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
kubectl get node View
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
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
Exécutez le script d'installation
每个节点
echo "10.0.100.13 hub.atguigu.com" >> /etc/hosts
harbor目录下 ./install.sh
(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! ! !
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
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
processus complet
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.
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
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
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
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
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
É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
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
Le test d'accès curl est un mécanisme d'interrogation
ipvsadm -Ln | grep 10.105.236.174
kubectl get pod -pod -o wide a
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
kubectl get svc
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
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.
Enfin vous avez terminé! ! ! ! ! ! ! ! ! !