文章目录
- 部署kubernetes
- 单master的K8S集群
- Linux初始化
- 部署etcd
- 证书环境
- etcd软件
- 备份还原etcd
- 部署master组件
- 部署apiserver
- 部署controller-manager
- 部署scheduler
- 部署kubectl
- 部署node组件
- 部署docker
- node01节点
- node02节点
- 部署kube-proxy
- K8S 二进制搭建总结
部署kubernetes
-
常见的K8S安装部署方式:
- Minikube
- Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。
- 部署地址:https://kubernetes.io/docs/setup/minikube
- Kubeadm
- Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相对简单。
- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
- 二进制安装部署
- 生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐。
- https://github.com/kubernetes/kubernetes/releases
- Minikube
-
k8s部署 二进制与高可用的区别
- 二进制部署
- 部署难,管理方便,集群伸展性能好
- 更稳定,集群规模到达一定的规模(几百个节点、上万个Pod),二进制稳定性是要高于kubeadm部署
- 遇到故障,宿主机起来了,进程也会起来
- kubeadm部署
- 部署简单,管理难
- 是以一种容器管理容器的方式允许的组件及服务,故障恢复时间比二进制慢
- 遇到故障,启动宿主机,再启动进程,最后去启动容器,集群才能恢复,速度比二进制慢
- 二进制部署
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-liV6yrxx-1691041858712)(E:\Typora\images\image-20230802121024683.png)]
单master的K8S集群
master01:192.168.242.66etcd集权节点01:192.168.242.66
etcd集权节点02:192.168.242.67
etcd集权节点03:192.168.242.68node01:192.168.242.67
node01:192.168.242.68
Linux初始化
#关闭防火墙systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#关闭selinuxsetenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭swapswapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#根据规划设置主机名hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#在master添加hostscat >> /etc/hosts << EOF
192.168.242.66 master01
192.168.242.67 node01
192.168.242.68 node02
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
EOFcat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOFsysctl --system
#时间同步yum install ntpdate -y
ntpdate ntp.aliyun.comcrontab -e
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com &> /dev/null
部署etcd
- etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
- etcd 作为服务发现系统,有以下的特点:
- 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
- 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 证书, - 它支持签三种类型的证书:
- client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
- server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
- peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。
- 这里全部都使用同一套证书认证。
##在 master01 节点中操作##在 opt 目录中创建目录mkdir /opt/k8s ##用来存放k8s的各种文件的
cd /opt/k8s
##上传 etcd.sh 文件##创建 存放证书文件的目录
mkdir /opt/k8s/etcd-cert##上传文件 etcd-cert.sh 到 /opt/k8s/etcd-cert 中
etcd-cert.sh :用来生成证书的文件
etcd.sh :做etcd配置和启动etcd进程的文件##同时上传三个工具
cfssl
cfssl-certinfo
cfssljson##为两个目录中的所有文件添加执行权限
chmod +x *##将 cfssl的文件添加到系统目录中
mv cfssl* /usr/local/bin
##通过脚本生成证书##通过这个脚本文件可以生成9个文件
ca-config.json : 证书生成策略文件
ca-csr.json : 生成CA证书和私钥的配置文件
server-csr.json : 服务器证书和私钥生成的配置文件#ca-key.pem:根证书私钥
#ca.pem:根证书
#ca.csr:根证书签发请求文件
#server.csr:服务器的证书请求文件
#server-key.pem:服务器的私钥
#server.pem:服务器的数字签名证书##修改 etcd-cert.sh 脚本文件
vim etcd-cert.sh修改 etcd的IP地址"hosts": ["192.168.242.66","192.168.242.67","192.168.242.68"],
etcd软件
##上传 etcd 软件包 到 /opt/k8s
etcd-v3.4.26-linux-amd64.tar.gz##解压文件
tar xf etcd-v3.4.26-linux-amd64.tar.gzcd etcd-v3.4.26-linux-amd64/ 中有两文件
etcd :etcd 服务进程的启动文件
etcdctl : etcdctl客户端工具
###创建etcd 的一些目录mkdir -p /opt/etcd/{cfg,bin,ssl}
cfg:存放etcd配置文件
bin:存放etcd可执行文件
ssl:存放etcd的证书##移动可执行文件
cd /opt/k8s/etcd-v3.4.26-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/##复制私钥和证书文件
cd /opt/k8s/etcd-cert/
cp *.pem /opt/etcd/ssl/
##通过脚本文件启动 etcd
cd /opt/k8s
./etcd.sh etcd01 192.168.242.66 etcd02=https://192.168.242.67:2380,etcd03=https://192.168.242.68:2380##会做三件事
生成etcd的配置文件
生成etcd.service的服务管理文件
启动etcd
###etcd02节点复制etcd01的配置文件到etcd02和etcd03
scp -r /opt/etcd 192.168.242.67:/opt/
scp -r /opt/etcd 192.168.242.68:/opt/复制服务管理文件到etcd02和etcd03
scp /usr/lib/systemd/system/etcd.service 192.168.242.67:/usr/lib/systemd/system/scp /usr/lib/systemd/system/etcd.service 192.168.242.68:/usr/lib/systemd/system/
##etcd02和etcd03中修改配置文件vim /opt/etcd/cfg/etcd修改IP地址和名字#[Member]
ETCD_NAME="etcd02" ##名字唯一
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.242.67:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.242.67:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.242.67:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.242.67:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.242.66:2380,etcd02=https://192.168.242.67:2380,etcd03=https://192.168.242.68:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
##启动 etcd服务systemctl enable --now etcd.service##查看etcd集群的状态
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.242.66:2379,https://192.168.242.67:2379,https://192.168.242.68:2379" endpoint health --write-out=table--cert-file:识别HTTPS端使用SSL证书文件
--key-file:使用此SSL密钥文件标识HTTPS客户端
--ca-file:使用此CA证书验证启用https的服务器的证书
--endpoints:集群中以逗号分隔的机器地址列表
cluster-health:检查etcd集群的运行状况
#查看etcd集群成员列表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.242.66:2379,https://192.168.80.242:67,https://192.168.242.68:2379" --write-out=table member list
###查看etcd群集的健康状态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.242.66:2379,https://192.168.242.67:2379,https://192.168.242.68:2379" endpoint status --write-out=table
备份还原etcd
###备份etcdETCDCTL_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.242.66:2379" snapshot save /data/backup/etcd-snapshot.db
###查看etcd备份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.242.66:2379" snapshot status /data/backup/etcd-snapshot.db
###还原etcdETCDCTL_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.242.66:2379" snapshot restore /data/backup/etcd-snapshot.db
部署master组件
部署apiserver
###在master01节点上部署##上传 master.zip和 k8s-cert.sh 文件到 /opt/k8s中master.zip:包含master组件运行所需的脚本k8s-cert.sh:master组件上传证书用的##解压 master.zip
unzip master.zipchmod +x *.sh
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
##创建 k8s证书目录mkdir /opt/k8s/k8s-cert##运行证书脚本,生成证书和私钥
##修改里面的IP地址vim k8s-cert.sh"10.0.0.1",
"127.0.0.1",
"192.168.80.10", #master01
"192.168.80.20", #master02
"192.168.80.100", #vip,后面 keepalived 使用
"192.168.80.14", #load balancer01(master)
"192.168.80.15", #load balancer02(backup)##运行脚本文件
./k8s-cert.sh
##复制私钥和证书到 k8s 的配置目录中cp ca*.pem apiserver*.pem /opt/kubernetes/ssl/
###上传 kubernetes的软件包kubernetes-server-linux-amd64.tar.gz
tar xf kubernetes-server-linux-amd64.tar.gz##复制运行文件到 kubernetes 中cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kube-controller-manager kube-scheduler kubectl /opt/kubernetes/bin/##做运行文件软连接到系统目录中
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权cd /opt/k8svim 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"
EOFchmod +x token.sh
./token.sh
###启动 apiservercd /opt/k8s./apiserver.sh 192.168.242.66 https://192.168.242.66:2379,https://192.168.242.67:2379,https://192.168.242.68:2379netstat -lntp | grep api
部署controller-manager
cd /opt/k8svim controller-manager.sh
---59行---
KUBE_APISERVER="https://192.168.242.66:6443"./controller-manager.shps aux | grep controller
部署scheduler
cd /opt/k8svim scheduler.sh
---48行---
KUBE_APISERVER="https://192.168.242.66:6443"./scheduler.shps aux | grep scheduler
部署kubectl
cd /opt/k8svim admin.sh
---4行---
KUBE_APISERVER="https://192.168.242.66:6443"./admin.sh##kubectl的目录
cd /root/.kube
##查看master状态kubectl get cs
部署node组件
部署docker
###安装依赖包
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.iosystemctl start docker.service
systemctl enable docker.service
##修改配置文件和镜像加速mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://ysmprsek.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "500m", "max-file": "3"}
}
EOFsystemctl daemon-reload
systemctl restart docker
node01节点
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
##创建 k8s目录mkdir /opt/k8s
mv /opt/node.zip /opt/k8s#上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh
cd /opt/k8s
unzip node.zip
chmod +x kubelet.sh proxy.sh
###在 master01节点中,发送 kubelet和kube-proxy 二进制文件cd /opt/k8s/kubernetes/server/bin/scp kubelet kube-proxy 192.168.242.67:/opt/kubernetes/bin/
scp kubelet kube-proxy 192.168.242.68:/opt/kubernetes/bin/
###在master01
##创建 opt/k8s/kubeconfig目录mkdir /opt/k8s/kubeconfig##上传kubeconfig.sh
运行脚本chmod +x kubeconfig.sh./kubeconfig.sh 192.168.242.66 /opt/k8s/k8s-cert/
##创建kubelet首次 访问apiserver加入集群的引导文件
##发送引导文件的到 node节点
scp bootstrap.kubeconfig kube-proxy.kubeconfig 192.168.242.67:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig 192.168.242.68:/opt/kubernetes/cfg/
##在master01节点
#RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
##node01节点#启动 kubelet 服务
cd /opt/k8s
./kubelet.sh 192.168.242.67ps aux | grep kubelet
#检查到 master01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
kubectl get csr
###master01节点#通过 CSR 请求
kubectl certificate approve node-csr-mX0Cz0tISS5ISKGVyzuwefiQgshqyBtS-AswKkuA8Fk
##查看node节点kubectl get node
###自动批准CSR请求
##master01节点运行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
node02节点
###运行
cd /opt/k8s
./kubelet.sh 192.168.242.68ps aux | grep kubelet
###查看 自动生成私钥文件cd /opt/kubernetes/ssl/
ls
部署kube-proxy
###查看ipvs模块cd /usr/lib/modules/3.10.0-1160.el7.x86_64/kernel/net/netfilter/ipvs/##加载 ipvs 模块for i in $(ls | grep -o "^[^.]*"); do modprobe $i; donecat /proc/net/ip_vs
##运行 脚本 ,创建 proxy模块cd /opt/k8s ./proxy.sh 192.168.242.68ps aux | grep kube-proxy
K8S 二进制搭建总结
- etcd集群
- 使用cfssl签发证书和私钥
- 解压etcd软件包,获取二进制文件 etcd etcdctl
- 准备etcd配置文件
- 启动etcd服务进程,加入到etcd集群
- master
- 使用cfssl签发证书和私钥
- 准备bootstrap-token认证文件
- 解压服务端软件包,获取二进制文件 kube-apiserver kube-controller-manager kubectl kube-scheduler
- 准备apiserver、controller-manager、scheduler的服务配置文件
- 准备controller-manager、scheduler、kubectl的 kubeconfig集群配置文件(加入K8S集群的引导文件)
- 依次启动apiserver、controller-manager、scheduler服务进程
- node
- 获取二进制文件 kubelet kube-proxy
- 准备 kube-proxy.kubeconfig bootstrap.kubeconfig(kubelet初次访问apiserver加入集群的引导文件)
- 准备 kubelet、kube-proxy 的服务配置文件
- 启动 kubelet 进程,发起 csr 请求证书,master 通过 csr 请求,颁发证书给 kubelet
- 加载 ipvs 模块,启动 kube-proxy 进程
- 安装 CNI 网络插件(flannel、calico等),CoreDNS
- 多 master 高可用
- 复制 master 的 k8s 相关的 证书、配置文件、二进制文件 和 etcd 的证书
- 修改 配置文件启动参数 启动 master 组件(apiserver、controller-manager、scheduler)的服务进程
- 部署 负载均衡器 和 keepalived 高可用
- 修改 node 组件(kubelet、kube-proxy)和 kubectl 的 kubeconfig 配置文件中的 server 参数地址为 VIP