二进制部署k8s集群之master节点和etcd数据库集群(上)

目录

1.操作系统初始化配置

2.升级Linux内核

3.部署docker引擎

4.部署etcd集群

[4.1 了解etcdctl工具对etcd做增删改查](#4.1 了解etcdctl工具对etcd做增删改查)

[4.2 通过etcdctl工具实现数据库的备份和恢复](#4.2 通过etcdctl工具实现数据库的备份和恢复)

5.部署Master组件

[6.部署 Worker Node 组件](#6.部署 Worker Node 组件)


二进制搭建 Kubernetes v1.20

k8s集群master01:192.168.9.112	kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群master02:192.168.9.116

k8s集群node01:192.168.9.113	kubelet kube-proxy docker 
k8s集群node02:192.168.9.111

etcd集群节点1:192.168.80.112	etcd
etcd集群节点2:192.168.80.113
etcd集群节点3:192.168.80.111

负载均衡nginx+keepalive01(master):192.168.9.114
负载均衡nginx+keepalive02(backup):192.168.9.115

1.操作系统初始化配置

所有服务器操作
192.168.9.112 master01
192.168.9.116 master02
192.168.9.113 node01
192.168.9.111 node02


#关闭防火墙、关闭selinux
systemctl disable --now firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
setenforce 0
vim /etc/selinux/config
SELINUX=disabled


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

#根据规划设置主机名
hostnamectl set-hostname master01
hostnamectl set-hostname master02
hostnamectl set-hostname node01
hostnamectl set-hostname node02

在master添加hosts
192.168.9.112 master01
192.168.9.116 master02
192.168.9.113 node01
192.168.9.111 node02
#调整内核参数   所有服务器操作
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   #加载

#时间同步   所有服务器操作
vim /etc/chrony.conf
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
systemctl restart chronyd.service
chronyc -a makestep


2.升级Linux内核

vim /etc/yum.repos.d/elrepo.repo   所有服务器操作
[elrepo]
name=elrepo
baseurl=https://mirrors.aliyun.com/elrepo/archive/kernel/el7/x86_64
gpgcheck=0
enabled=1


cd /etc/yum.repos.d/
mv local.repo repo.bak/
导入阿里云在线源

yum clean all  所有服务器操作
yum install -y kernel-lt kernel-lt-devel  集群升级内核
#查看内核序号
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

#设置默认启动内核
grub2-set-default 0

#重启操作系统
reboot

#查看生效版本
hostnamectl


3.部署docker引擎

所有 node 节点部署docker引擎
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

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [镜像加速器地址],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m", "max-file": "3"
  }
}
EOF

systemctl enable --now docker
docker info

4.部署etcd集群

etcd是一个分布式键值存储系统,用于在分布式系统中保存配置信息、元数据以及关键的共享状态。它是一个开源项目,最初由CoreOS开发并维护,现在由CNCF托管。etcd的设计目标是提供可靠的分布式存储,以支持分布式系统的一致性和高可用性。

关键特性:
●分布式存储:etcd的数据存储是分布式的,可以跨多个节点进行分布,确保高可用性和可扩展性。
●强致性:etcd提供强一致性的保证,确保在集群中的所有节点都能看到相同的数据视图。
●轻量级:etcd采用轻量级的Raft一致性算法,以确保集群中的节点之间达成一致,同时保持相对较低的性能开销。
●API支持:etcd提供简单而强大的HTTP+JSON API,使得开发人员可以轻松地与其进行交互,并集成到各种应用和工具中。
●Watch机制:etcd支持Watch机制,允许客户端监视特定键的变化,并在数据发生变更时得到通知。
●安全性:etcd支持SSL/TLS加密,以保障数据在传输过程中的安全性,并提供基于角色的访问控制。

应用场景:
●配置管理: etcd常用于存储应用程序和系统的配置信息,允许动态地更新配置而无需重启应用。
●服务发现: etcd可以用作服务发现的后端存储,帮助服务在动态环境中找到彼此。
●分布式锁: 通过etcd的分布式锁机制,可以实现分布式系统中的协同工作和资源同步。
●集群协调: etcd在构建分布式系统中,作为集群协调的关键组件,确保系统的一致性和稳定性。

总体而言,etcd在云原生应用和分布式系统中发挥着重要作用,提供了可靠的分布式存储和协调服务,为应用程序提供一致性、可靠性和高可用性的基础设施支持。

etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信(这两个端口已经被IANA(互联网数字分配机构)官方预留给etcd)。 即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯。
etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。

准备签发证书环境
CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。 CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。
CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:
1、client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
2、server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
3、peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。
这里全部都使用同一套证书认证。

在 master01 节点上操作

cd /usr/local/bin
上传所需软件包
chmod +x *

生成etcd证书

mkdir /opt/k8s
cd /opt/k8s/

#上传 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中
#上传 etcd-v3.4.26-linux-amd64.tar.gz 到 /opt/k8s 目录中,
chmod +x etcd-cert.sh etcd.sh


#创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
vim etcd-cert.sh  #修改其中通信地址为本地
./etcd-cert.sh			#生成CA证书、etcd 服务器证书以及私钥



cd /opt/k8s/
tar xf etcd-v3.4.26-linux-amd64.tar.gz

cd /opt
mkdir etcd
cd etcd
mkdir cfg bin ssl
cd /opt/k8s/etcd-v3.4.26-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cd ..
cd etcd-cert/
cp *.pem /opt/etcd/ssl/
cd /opt/k8s
./etcd.sh etcd01 192.168.9.112 etcd02=https://192.168.9.113:2380,etcd03=https://192.168.9.111:2380
#进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况

#可另外打开一个窗口查看etcd进程是否正常
ps -ef | grep etcd


#把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root@192.168.9.113:/opt/
scp -r /opt/etcd/ root@192.168.9.111:/opt/
cd /usr/lib/systemd/system
scp etcd.service root@192.168.9.113:`pwd`
scp etcd.service root@192.168.9.111:`pwd`


在 node02 节点上操作

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

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

在 node03 节点上操作

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

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.9.111:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.9.111:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.9.112:2380,etcd02=https://192.168.9.113:2380,etcd03=https://192.168.9.111:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
systemctl enable --now etcd.service    #分别启动node2、node3两个节点etcd
三个node节点查看etcd状态
systemctl status etcd.service


4.1 了解etcdctl工具对etcd做增删改查

添加、查看

#检查etcd群集健康状态
cd /opt/etcd/ssl
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.168.9.111:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem -wtable endpoint health   
#注: --cacert=ca.pem --cert=server.pem --key=server-key.pem 需要提前进去文件所在目录,或指定绝对路径,才可执行命令
#检查etcd群集状态信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.1=ca.pem --cert=server.pem --key=server-key.pem -wtable endpoint status
#检查etcd群集成员列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.168.9.111:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem -wtable member list
插入、查询键值
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.168.9.111:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem put myname 'zhangsan'

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.168.9.111:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem get myname

删除

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.168.9.111:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem del myname

4.2 通过etcdctl工具实现数据库的备份和恢复

备份数据库

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem snapshot save /root/etcd_backup-20240729
ls /root

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem snapshot status /root/etcd_backup-20240729 -wtable  #查看备份文件信息

还原数据库

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.9.112:2379" --cacert=ca.pem --cert=server.pem --key=server-key.pem snapshot restore /root/etcd_backup-20240729 -wtable

5.部署Master组件

在 master01 节点上操作

#上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包
cd /opt/k8s/
上传 master.zip 和 k8s-cert.sh 
mkdir k8s-cert
mv k8s-cert.sh k8s-cert
cd k8s-cert/
chmod +x k8s-cert.sh
vim k8s-cert.sh
修改其中ip信息
cat > apiserver-csr.json <<EOF
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.9.112",   master01
      "192.168.9.116",    master02
      "192.168.9.100",    vip
      "192.168.9.114",    负载均衡nginx+keepalive01(master)
      "192.168.9.115",    负载均衡nginx+keepalive02(backup)
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],


./k8s-cert.sh				#生成CA证书、相关组件的证书和私钥
ls *pem



#上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
#下载地址:https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.md
#注:打开链接你会发现里面有很多包,下载一个server包就够了,包含了Master和Worker Node二进制文件。

cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz

cd /opt
mkdir kubernetes/
cd kubernetes/
mkdir bin cfg ssl logs
cd /opt/k8s/kubernetes/server/bin/
cp kube-apiserver kube-controller-manager kube-scheduler /opt/kubernetes/bin/
cd /opt/k8s/k8s-cert/
cp apiserver-key.pem apiserver.pem ca-key.pem ca.pem /opt/kubernetes/ssl/
#创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权

head -c 16 /dev/urandom | od -An -t x | tr -d ' '   创建一个16位随机数
cd /opt/kubernetes/cfg
vim token.csv
08f0b9973957c471b0ff12dc5cc2e45a,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
cd /opt/k8s/
unzip master.zip
chmod +x *.sh
开启 apiserver 服务
./apiserver.sh 192.168.9.112 https://192.168.9.112:2379,https://192.168.9.113:2379,https://192.168.9.111:2379
systemctl status kube-apiserver.service
vbnet 复制代码
#启动 controller-manager 服务

cd /opt/k8s/kubernetes/server/bin
cp kubectl /usr/local/bin/
cd /opt/k8s/
vim controller-manager.sh 
#修改60行,设置为本机IP
KUBE_APISERVER="https://192.168.9.112:6443"

./controller-manager.sh
vbnet 复制代码
#启动 scheduler 服务

vim scheduler.sh
#48行修改为本机ip 
KUBE_APISERVER="https://192.168.9.112:6443"

./scheduler.sh
systemctl status kube-scheduler.service
vbnet 复制代码
#生成kubectl连接集群的kubeconfig文件
vim admin.sh
#4行修改ip为本机 
KUBE_APISERVER="https://192.168.9.112:6443"

./admin.sh
ls /root/.kube/

#通过kubectl工具查看当前集群组件状态
kubectl get cs 
#查看版本信息
kubectl version

#查看当前的 leader
kubectl -n kube-system get leases kube-scheduler
kubectl -n kube-system get leases kube-controller-manager


6.部署 Worker Node 组件

vbnet 复制代码
//node01 节点上操作
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
cd /opt
mkdir k8s
cd k8s/
#上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh
chmod +x *.sh
vbnet 复制代码
//在 master01 节点上操作
#把 kubelet、kube-proxy 拷贝到 node01 节点
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.9.113:/opt/kubernetes/bin/

cd /opt/k8s/
#上传kubeconfig.sh文件,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件
mkdir kubeconfig
mv kubeconfig.sh kubeconfig/
cd kubeconfig/
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.9.112 /opt/k8s/k8s-cert/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.9.113:/opt/kubernetes/cfg/


#RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap



vbnet 复制代码
node01节点
cd /opt/k8s
vim kubelet.sh 
#11行修改
--hostname-override=node01 \\

./kubelet.sh 192.168.9.113
systemctl status kubelet.service 
vbnet 复制代码
//在 master01 节点上操作,通过 CSR 请求
#检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
kubectl get csr
kubectl certificat approve node-csr-_gqqiNmxKDoV0sJmwSZlaVt0lx2-0MqRYol93PGjSvI
kubectl get csr
#查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady
kubectl get node

#自动批准 CSR 请求
kubectl create clusterrolebinding node-autoapprove-bootstrap --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap 

kubectl create clusterrolebinding node-autoapprove-certificate-rotation --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --user=kubelet-bootstrap


vbnet 复制代码
部署node02节点
node01节点操作
cd /opt/
scp -r k8s/ kubernetes/ root@192.168.9.111:/opt

node02节点操作
cd /opt/
cd kubernetes/
rm -rf ssl/*
rm -rf logs/*

cd /opt/k8s/
vim kubelet.sh 
#11行修改
--hostname-override=node02 \\

./kubelet.sh 192.168.9.111
ls /opt/kubernetes/ssl/




master01节点查看

vbnet 复制代码
kubectl get csr
kubectl get nodes
vbnet 复制代码
启动kube-proxy
#node01、node02两个节点加载内核模块
cd /usr/lib/modules/5.4.278-1.el7.elrepo.x86_64/kernel/net/netfilter/ipvs
for i in $(ls | awk -F. '{print $1}'); do echo $i; modprobe $i; done

lsmod | grep ip_vs  #查看


vbnet 复制代码
node01节点
cd /opt/k8s/
vim proxy.sh
#10行 修改
--hostname-override=node01 \\

./proxy.sh 192.168.9.113
systemctl status kube-proxy.service

node02节点
cd /opt/k8s/
vim proxy.sh
#10行 修改
--hostname-override=node02 \\

./proxy.sh 192.168.9.111
systemctl status kube-proxy.service


master01节点查看验证

vbnet 复制代码
kubectl get cs
kubectl get nodes
相关推荐
元气满满的热码式2 小时前
K8S中Service详解(一)
云原生·容器·kubernetes
元气满满的热码式6 小时前
K8S中ingress详解
云原生·容器·kubernetes
jcrose25807 小时前
Ubuntu二进制部署K8S 1.29.2
linux·ubuntu·kubernetes
lozhyf7 小时前
基于 JFinal 的国产微服务框架
微服务·云原生·架构
matrixlzp7 小时前
K8S 启动探测、就绪探测、存活探测
云原生·容器·kubernetes
Dusk_橙子7 小时前
在K8S中,如何使用EFK实现日志的统一管理?
云原生·容器·kubernetes
Tony11547 小时前
Kubernetes v1.28.0安装dashboard v2.6.1(k8s图形化操作界面)
云原生·容器·kubernetes
龙胖不下锅7 小时前
k8s资源预留
云原生·容器·kubernetes
超级阿飞7 小时前
利用Kubespray安装生产环境的k8s集群-排错篇
docker·容器·kubernetes
喝醉酒的小白7 小时前
在 Kubernetes 上快速安装 KubeSphere v4.1.2
云原生·容器·kubernetes