【k8s】多节点master部署k8s集群详解、步骤带图、配置文件带注释


前言

本博客内容仅为记录博主思路,仅供参考,一切以自己实践结果为准。


一、部署详解

1.1 架构

正文

1.2 初始化环境(所有节点)

#所有节点操作,关闭防火墙、selinux、swap交换、添加本地域名解析、调整内核参数、开启时间同步
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 

cat >> /etc/hosts << EOF
192.168.13.10 master01
192.168.13.20 node01
192.168.13.30 node02
192.168.13.40 master02
192.168.13.50 nginx01
192.168.13.60 nginx02
EOF

cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

sysctl --system

yum install ntpdate -y
ntpdate time.windows.com

1.3 部署etcd集群(命令)

#在 master01 节点上操作
hostnamectl set-hostname master01
su

#准备cfssl证书生成工具(从官网下载,也可以提前下载后直接上传,我采用下载后上传)
#wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
#wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
#wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
#若出现:无法建立 SSL 连接。这个报错,则将https换为http即可!
cd /usr/local/bin/
#上传证书到/usr/local/bin/目录中
chmod +x /usr/local/bin/cfssl*

#通过脚本生成CA证书、etcd 服务器证书以及私钥
mkdir -p /opt/etcd/etcd-cert
cd /opt/etcd/etcd-cert/

#上传 etcd-cert.sh和etcd.sh脚本(需修改脚本IP地址)
chmod +x etcd-cert.sh etcd.sh
./etcd-cert.sh

#若证书生成成功,则会多出以下文件(ls查看)
#ca-config.json  ca-csr.json  ca.pem        server.csr       server-key.pem
#ca.csr          ca-key.pem   etcd-cert.sh  server-csr.json  server.pem

#准备启动etcd服务的相关文件
mkdir -p /opt/etcd/{
    
    cfg,bin,ssl}
cd /opt/etcd/
#上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/etcd 目录中,启动etcd服务
tar xf etcd-v3.4.9-linux-amd64.tar.gz

mv /opt/etcd/etcd-v3.4.9-linux-amd64/etcd* /opt/etcd/bin/
mv /opt/etcd/etcd-cert/*.pem /opt/etcd/ssl/

cd /opt/etcd/etcd-cert/
./etcd.sh etcd01 192.168.13.10 etcd02=https://192.168.13.20:2380,etcd03=https://192.168.13.30:2380
#若你的脚本和我的不一样,最后加了:systemctl restart etcd启动etcd服务,则会报错,但是不会影响程序
ps -ef | grep etcd

scp -r /opt/etcd/ [email protected]:/opt/
scp -r /opt/etcd/ [email protected]:/opt/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/


#在所有node节点操作,修改配置文件为对应的节点
hostnamectl set-hostname node01
su

vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.13.20:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.13.20:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.13.20:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.13.20:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.13.10:2380,etcd02=https://192.168.13.20:2380,etcd03=https://192.168.13.30:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

systemctl start etcd
systemctl enable etcd
systemctl status etcd

#回到master01节点,启动etcd服务
systemctl restart etcd
#检查etcd群集状态(两条命令,哪个都行,启动成功则会出现3个true或3个started)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.13.10:2379,https://192.168.13.20:2379,https://192.168.13.30:2379" endpoint health --write-out=table

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.13.10:2379,https://192.168.13.20:2379,https://192.168.13.30:2379" --write-out=table member list
#至此,etcd集群部署完毕

1.3 部署etcd集群(图解)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.4 master01节点部署相关组件(命令)

#在 master01节点上操作,生成证书

mkdir -p /opt/kubernetes/{
    
    bin,cfg,ssl,logs,k8s-cert}
cd /opt/kubernetes/
#上传k8s-cert.sh,master.zip,kubernetes-server-linux-amd64.tar.gz到/opt/kubernetes目录
#五个脚本,涉及路径指向,若是修改路径,则需要将路径对应上(报错会显示多少行)
unzip master.zip
tar xf kubernetes-server-linux-amd64.tar.gz
chmod +x *.sh

#创建用于生成CA证书、相关组件的证书和私钥的目录
mv /opt/kubernetes/k8s-cert.sh /opt/kubernetes/k8s-cert
cd /opt/kubernetes/k8s-cert/
./k8s-cert.sh

#若证书生成成功,则会多出以下文件(ls *.pem查看)
#admin-key.pem  apiserver-key.pem  ca-key.pem  kube-proxy-key.pem  
#admin.pem      apiserver.pem      ca.pem      kube-proxy.pem
cp ca*pem apiserver*pem /opt/kubernetes/ssl/

cd /opt/kubernetes/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/

#创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权
cd /opt/kubernetes/
vim token.sh
#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

chmod +x token.sh
./token.sh

#查看roken.csv是否生成成功
cat /opt/kubernetes/cfg/token.csv

cd /opt/kubernetes/
#启动kube-apiserver、scheduler、controller-manager三项服务
./apiserver.sh 192.168.13.10 https://192.168.13.10:2379,https://192.168.13.20:2379,https://192.168.13.30:2379
./scheduler.sh
./controller-manager.sh
./admin.sh

#可通过ps过滤查看程序是否启动成功
#ps aux | grep kube-apiserver
#ps aux | grep kube-scheduler
#ps aux | grep kube-controller-manager

#生成kubectl连接集群的证书
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

#通过kubectl工具查看当前集群组件状态(成功会显示manager、scheduler为ok)
kubectl get cs

1.4 master01节点组件部署(截图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5 work node节点组件部署(命令)

#在所有node节点上安装docker引擎(必须先创建docker,否则会出现:No resources found报错)
yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker.service
systemctl enable docker.service 

#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{
    
    bin,cfg,ssl,logs}
cd /opt/
#上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh

unzip node.zip
chmod +x kubelet.sh proxy.sh

#在 master01 节点上操作,把 kubelet、kube-proxy 拷贝到 node 节点
cd /opt/kubernetes/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.13.20:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.13.30:/opt/kubernetes/bin/

mkdir -p /opt/kubernetes/kubeconfig
cd /opt/kubernetes/kubeconfig
#上传 kubeconfig.sh 文件到 /opt/kubernetes/kubeconfig 目录中,生成 kubeconfig 的配置文件

chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.13.10 /opt/kubernetes/k8s-cert/

scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.13.20:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.13.30:/opt/kubernetes/cfg/

#RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
#以上皆为master01节点操作

#在 node01 节点上操作,启动 kubelet 服务
cd /opt
/opt/kubelet.sh 192.168.13.20
ps aux | grep kubelet


#在 master01 节点上操作,通过 CSR 请求,通过命令获取节点名称(NAME列)
kubectl get csr
#通过对应命令为节点签发证书
kubectl certificate approve 节点名称(NAME列)
#Approved,Issued 表示已授权 CSR 请求并签发证书(Approved,Issued状态表示已签发)
kubectl get csr
#查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady
kubectl get node
#以上皆为master01节点操作


#在所有node节点上操作,加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*")
do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;
done

#启动proxy服务
/opt/proxy.sh 192.168.13.20
ps aux | grep kube-proxy

1.5 work node节点组件部署(截图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.6 部署flannel网络组件(命令)

cd /opt
#上传cni-plugins-linux-amd64-v0.8.6.tgz和flannel.tar到/opt目录中
docker load -i flannel.tar

mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin

#在master01节点上操作上传kube-flannel.yml文件到/opt/kubernetes目录中,部署CNI网络(39-44行可能需要改)
cd /opt/kubernetes
#此时可能需要等待几秒钟,才会出现ready
kubectl apply -f kube-flannel.yml 
kubectl get nodes
#单节点master部署k8s至此结束

1.6 部署flannel网络组件(截图)

在这里插入图片描述
在这里插入图片描述


1.7 部署master02节点(命令)

#多节点部署
#在master01节点上操作,复制文件给master02
scp -r /opt/etcd/ root@192.168.13.40:/opt/
scp -r /opt/kubernetes/ root@192.168.13.40:/opt/
cd /usr/lib/systemd/system
scp kube-apiserver.service kube-controller-manager.service kube-scheduler.service root@192.168.13.40:`pwd`
cd ~
scp -r .kube/ 192.168.13.40:/root

#在master02上操作,进行配置文件部署
hostnamectl set-hostname master02
su
vim /opt/kubernetes/cfg/kube-apiserver
	第5行:地址修改为master02地址
	第7行:地址修改为master02地址

#创建命令链接
ln -s /opt/kubernetes/bin/* /usr/local/bin
#启动kube-apiserver、scheduler、controller-manager三项服务
systemctl enable --now kube-apiserver.service 
systemctl enable --now kube-controller-manager.service 
systemctl enable --now kube-scheduler.service 

#查看服务是否启动
systemctl status kube-apiserver.service 
systemctl status kube-controller-manager.service 
systemctl status kube-scheduler.service 

1.7 部署master02节点(截图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.8 部署nginx负载均衡节点(命令)

#所有nginx负载均衡节点
cat > /etc/yum.repos.d/nginx.repo << EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/\$basearch/
gpgcheck=0
EOF
yum install -y nginx

vim /etc/nginx/nginx.conf
#添加如下内容(http模块同级别)
stream {
    
    
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
 
    access_log  /var/log/nginx/k8s-access.log  main;
 
    upstream k8s-apiservers {
    
    
        server 192.168.13.10:6443;
        server 192.168.13.40:6443;
    }
    server {
    
    
        listen 6443;
        proxy_pass k8s-apiservers;
    }
}
#添加内容到此结束

nginx -t
systemctl enable --now nginx

yum install -y keepalived
vim /etc/keepalived/keepalived.conf
	10行:smtp_server 127.0.0.1
	12行:router_id NGINX_01
	13-16行:删除
	14行:插入周期性执行脚本
	vrrp_script check_nginx {
    
    
    script "/etc/nginx/check_nginx.sh"
	}

	21行:interface ens33
	30行:192.168.13.100/32
	31-32:ip地址删除
	33行:留两个大括号,下面全部删除
	倒数第二行:最后一个大括号上方插入
    track_script {
    
    
        check_nginx
    }

#编写nginx检查脚本
vim /etc/nginx/check_nginx.sh
#!/bin/bash
#egrep -cv "grep|$$"用于过滤掉包含grep或者$$表示的当前shell进程ID
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
    systemctl stop keepalived
fi

chmod +x /etc/nginx/check_nginx.sh
scp /etc/nginx/check_nginx.sh root@192.168.13.60:/etc/nginx/check_nginx.sh

systemctl enable --now keepalived.service
systemctl status keepalived.service
ip addr

#在node节点上操作
vim /opt/kubernetes/cfg/bootstrap.kubeconfig
vim /opt/kubernetes/cfg/kubelet.kubeconfig
vim /opt/kubernetes/cfg/kube-proxy.kubeconfig
	都是第5行:server: https://192.168.13.100:6443

#或者用sed命令,可以免交互修改
#sed -i 's!    server: https://192.168.13.10:6443!    server: https://192.168.13.100:6443!' /opt/kubernetes/cfg/bootstrap.kubeconfig
#sed -i 's!    server: https://192.168.13.10:6443!    server: https://192.168.13.100:6443!' /opt/kubernetes/cfg/kubelet.kubeconfig
#sed -i 's!    server: https://192.168.13.10:6443!    server: https://192.168.13.100:6443!' /opt/kubernetes/cfg/kube-proxy.kubeconfig

#重启kubele、proxy服务
systemctl restart kubelet.service
systemctl restart kube-proxy.service

#master02节点执行下方命令检查是否部署成功
kubectl get nodes
kubectl run nginx --image=nginx
#此时大概需要等待十来秒(下载镜像,下载好后ready1/1)
kubectl get pods -o wide
#多节点部署至此结束

1.8 部署nginx负载均衡节点(截图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、结语

  • 按照脚本刷,指定没问题,唯一要注意的就是步骤太多,需要细心
  • 要多做几遍,错了就排障,排不出来就重做,只有多做几遍,才能知道每一步骤是干嘛的
  • 错误1:单节点master01找不到node节点:报错是No resources found(解决:node节点没安装docker引擎,安装即可),当然我的报错是因为这个,如果你配置文件写错了,也可能会出现这种情况
  • 错误2:etcd启动不起来,无报错(原因:etcd脚本之前有错误,却直接执行了,形成了缓存;解决:删除缓存rm -rf /var/lib/etcd/*),当然,也可能是你证书文件生成失败、证书不匹配之类的
  • 小技巧:利用:kubectl describe pod定位异常问题的具体信息

猜你喜欢

转载自blog.csdn.net/H875035681/article/details/125810340