【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master

文章目录

  • 前言
    • 单master集群架构图
  • 一、实验环境
  • 二、部署etcd集群
    • 2.1 操作系统初始化配置
    • 2.2 部署 etcd 集群(分布式键值对数据库)
      • 1)在 etcd01 节点上操作
      • 2)在 etcd02 和 etcd03 节点上操作
      • 在 etcd02 节点上操作(42主机):
      • 在 etcd03 节点上操作(43主机):
      • 检查etcd群集状态:
  • 三、部署 Master 组件
  • 总结
    • etcd数据库:
    • etcd安装步骤:
    • master组件安装步骤:
      • 1.先安装apiserver
      • 2.再启动controller-manager 和scheduler
      • 3.检查集群组件状态


前言

本文将带大家一起通过二进制搭建Kubernetes v1.20,因为实验内容较多,故分成上、中、下三篇文章进行展示。

单master集群架构图

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第1张图片

目前Kubernetes最新版本是v1.24,但大部分公司一般不会使用最新版本。

目前公司使用比较多的:老版本是v1.15,因为v1.16改变了很多API接口版本,新版本使用比较多的是v1.18、v1.20。


一、实验环境

注意:生产环境中,etcd集群和master、node节点都应该部署在不同的机器上,此处为了实验方便,将三台etcd节点分别部署在了master和node节点上了。

 k8s集群master01:192.168.192.11,kube-apiserver、kube-controller-manager、kube-scheduler、etcd
 k8s集群master02:192.168.192.12
 ​
 k8s集群node01:192.168.192.13   kubelet、kube-proxy、docker 
 k8s集群node02:192.168.192.14
 ​
 etcd集群节点1192.168.192.11   etcd
 etcd集群节点2192.168.192.13
 etcd集群节点3192.168.192.14
 ​
 负载均衡nginx+keepalive01(master):192.168.192.15
 负载均衡nginx+keepalive02(backup):192.168.192.16

二、部署etcd集群

2.1 操作系统初始化配置

所有节点进行操作。

 #关闭防火墙,清除防火墙规则
 systemctl stop firewalld
 systemctl disable firewalld
 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
 #-X可以清除一些自定义的链表规则
 ​
 #关闭selinux
 setenforce 0
 sed -i 's/enforcing/disabled/' /etc/selinux/config
 ​
 #--------关闭swap-------------
 swapoff -a                             #临时关闭交换分区
 sed -ri 's/.*swap.*/#&/' /etc/fstab    #永久关闭交换分区   
 ​
 #------根据规划设置主机名------
 hostnamectl set-hostname master01 && su
 hostnamectl set-hostname master02 && su
 hostnamectl set-hostname node01 && su
 hostnamectl set-hostname node02 && su
 ​
 #--------修改/etc/hosts文件------
 #添加主机名和IP的映射关系
 vim /etc/hosts
 192.168.192.11 master01
 192.168.192.12 master02
 192.168.192.13 node01
 192.168.192.14 node02
 ​
 #-----------调整内核参数--------------
 vim /etc/sysctl.d/k8s.conf
 #开启网桥模式,可将网桥的流量传递给iptables链
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 #关闭ipv6协议
 net.ipv6.conf.all.disable_ipv6=1
 #开启路由转发功能
 ​
 sysctl --system   #加载系统的内核参数
 ​
 #-----------时间同步-------------------
 yum install ntpdate -y
 ntpdate time.windows.com
 #将时间同步加入计划性任务,每30分钟执行一次
 crontab -e
 */30 * * * * /usr/sbin/ntpdate time.windows.com

在这里插入图片描述

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第2张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第3张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第4张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第5张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第6张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第7张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第8张图片

2.2 部署 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和api-server通信使用2379端口,etcd之间使用2380通信)

etcd在生产环境中一般推荐集群方式部署。由于etcd的leader选举机制,要求至少为3台或以上的奇数台。

准备签发证书环境:

CFSSL是CloudFlare公司开源的一款PKI/TLS 工具。CFSSL包含一个命令行工具和一个用于签名、验证和捆绑TLS证书的HTTP API服务。使用Go语言编写。

CFSSL使用配置文件生成证书,因此自签之前,需要生成它识别的json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。

CFSSL用来为etcd提供TLS证书,它支持签三种类型的证书:

  1. client证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如kubeapiserver 访问etcd;
  2. server证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如etcd对外提供服务;
  3. peer证书,相互之间连接时使用的证书,如etcd节点之间进行验证和通信。

这里全部都使用同一套证书认证。

1)在 etcd01 节点上操作

 #-----------------------准备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
 #-O:指定下载目录
 #Linux命令行两种下载方式:
 #wget 源URL地址 [-O 下载到指定路径]
 #curl 源URL地址 [-o 下载到指定路径]
 ​
 chmod +x /usr/local/bin/cfssl*
 
 --------------------- 虚线内注释 ------------------------------------------------
 cfssl:证书签发的工具命令。
 cfssljson:将cfssl生成的证书(json格式)变为文件承载式证书。
 cfssl-certinfo:验证证书的信息。
 cfssl-certinfo -cert <证书名称>   #查看证书的信息
 -------------------------------------------------------------------------------
 ​
 ​
 #------------------------生成Etcd证书-----------------------
 #k8s目录用于存放生成证书的脚本文件
 mkdir /opt/k8s/
 cd /opt/k8s/
 ​
 #上传 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中,为两个文件增加执行权限
 chmod +x etcd-cert.sh etcd.sh
 ​
 #创建用于生成CA证书、etcd 服务器证书以及私钥的目录
 mkdir /opt/k8s/etcd-cert/
 mv etcd-cert.sh etcd-cert/    #将etcd-cert.sh移动到该目录
 cd /opt/k8s/etcd-cert/   #切换到该目录
 ./etcd-cert.sh        #运行脚本生成CA证书、etcd 服务器证书以及私钥
 ​
 #查看etcd-cert目录,以.json和.csr结尾的文件都是请求生成证书的文件,以pem结尾的文件都是最终生成的证书文件。
 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-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,启动etcd服务
 #下载地址https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-1inux-amd64.tar.gz
 cd /opt/k8s/
 tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
 ​
 #查看安装包解压后的目录,该目录包含了etcd的启动文件etcd和etcd的管理文件etcdctl
 cd /opt/k8s/etcd-v3.4.9-linux-amd64/
 ls
 --------------------------------------------------------------------------------
 etcd:就是etcd服务的启动命令,后面可跟各种启动参数
 etcdctl:主要为etcd服务提供了命令行操作
 --------------------------------------------------------------------------------
 ​
 #创建/opt/etcd目录,并创建三个子目录cfg、bin、ssl。cfg用于存放配置文件,bin用于存放执行文件,ssl用于存放证书文件
 mkdir -p /opt/etcd/{cfg,bin,ssl}
 ​
 #将etcd和etcdctl两个文件移动到/opt/etcd/bin目录
 mv etcd etcdctl /opt/etcd/bin/
 #将证书文件复制到etcd01节点的/opt/etcd/ssl/目录
 cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
 ​
 cd /opt/k8s/
 #运行脚本,会卡在前台
 ./etcd.sh etcd01 192.168.192.11 etcd02=https://192.168.192.13:2380,etcd03=https://192.168.192.14:2380
 #另开一台终端,查看进程信息
 ps -ef | grep etcd
 ​
 #将etcd目录中的所有文件发送给etcd02和etcd03节点
 scp -r /opt/etcd/ [email protected]:/opt/
 scp -r /opt/etcd/ [email protected]:/opt/
 #传输etcd的系统服务管理文件
 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/

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第9张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第10张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第11张图片

在这里插入图片描述

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第12张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第13张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第14张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第15张图片

在这里插入图片描述

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第16张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第17张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第18张图片

2)在 etcd02 和 etcd03 节点上操作

 #-------------1、在 etcd02 节点上操作(42主机)------------------
 vim /opt/etcd/cfg/etcd
 #[Member]
 ETCD_NAME="etcd02"                                          #修改
 ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
 ETCD_LISTEN_PEER_URLS="https://192.168.192.13:2380"          #修改
 ETCD_LISTEN_CLIENT_URLS="https://192.168.192.13:2379"        #修改
 ​
 #[Clustering]
 ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.192.13:2380"     #修改
 ETCD_ADVERTISE_CLIENT_URLS="https://192.168.192.13:2379"           #修改
 ETCD_INITIAL_CLUSTER="etcd01=https://192.168.192.11:2380,etcd02=https://192.168.192.13:2380,etcd03=https://192.168.192.14:2380"
 ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
 ETCD_INITIAL_CLUSTER_STATE="new"
 ​
 systemctl start etcd
 systemctl enable etcd
 systemctl status etcd
 ​
 #-----------2、在 etcd03 节点上操作(43主机)-----------------------
 vim /opt/etcd/cfg/etcd
 #[Member]
 ETCD_NAME="etcd03"                                          #修改
 ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
 ETCD_LISTEN_PEER_URLS="https://192.168.192.14:2380"          #修改
 ETCD_LISTEN_CLIENT_URLS="https://192.168.192.14:2379"        #修改
 ​
 #[Clustering]
 ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.192.14:2380"     #修改
 ETCD_ADVERTISE_CLIENT_URLS="https://192.168.192.14:2379"           #修改
 ETCD_INITIAL_CLUSTER="etcd01=https://192.168.192.11:2380,etcd02=https://192.168.192.13:2380,etcd03=https://192.168.192.14:2380"
 ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
 ETCD_INITIAL_CLUSTER_STATE="new"
 ​
 systemctl start etcd
 systemctl enable etcd
 systemctl status etcd
 ​
 #-------------3、检查etcd群集状态-------------------------------
 #三个etcd节点都可用查看
 #切换到/opt/etcd/ssl目录,证书可使用相对路径。如果不在该目录下,证书要使用绝对路径。
 #查看etcd集群每个节点的健康状态,true表示健康
 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.192.11:2379,https://192.168.192.13:2379,https://192.168.192.14:2379" endpoint health --write-out=table
 ​
 #查看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.192.11:2379,https://192.168.192.13:2379,https://192.168.192.14:2379" --write-out=table member list
 ​
 #查看etcd集群中哪个节点是leader,true表示leader
 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.192.11:2379,https://192.168.192.13:2379,https://192.168.192.14:2379" endpoint status --write-out=table
 
 #------------------注释---------------------------------------
--cert-file:识别HTTPS端使用SSL证书文件
--key-file:使用此SSL密钥文件标识HTTPS客户端
--ca-file:使用此CA证书验证启用https的服务器的证书
--endpoints:集群中以逗号分隔的机器地址列表
cluster-health:检查etcd集群的运行状况
#-------------------------------------------------------------
 ​
 #因为是通过客户端的方式进行访问,所以用2379端口,检查每个节点的状态

在 etcd02 节点上操作(42主机):

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第19张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第20张图片

在 etcd03 节点上操作(43主机):

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第21张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第22张图片

检查etcd群集状态:

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第23张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第24张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第25张图片

三、部署 Master 组件

master01:192.168.192.11

 #在 master01 节点上操作,因为master01和etcd01部署在同一台机器上,所以/opt/k8s/目录已存在。
 #上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包
 cd /opt/k8s/
 unzip master.zip
 chmod +x *.sh    #为所有脚本文件加上执行权限
 ​
 #创建kubernetes工作目录
 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
 ​
 #创建用于生成CA证书、相关组件的证书和私钥的目录
 mkdir /opt/k8s/k8s-cert/
 mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert/    #将k8s-cert.sh脚本移动到该目录
 cd /opt/k8s/k8s-cert/                         #切换到该目录
 ./k8s-cert.sh   #运行脚本,生成CA证书、相关组件的证书和私钥
 ​
 #查看生成的证书文件
 ls *pem
 admin-key.pem  apiserver-key.pem  ca-key.pem  kube-proxy-key.pem  
 admin.pem      apiserver.pem      ca.pem      kube-proxy.pem
 ​
 #复制CA证书、apiserver相关证书和私钥到kubernetes工作目录的ssl子目录中
 cp ca*pem apiserver*pem /opt/kubernetes/ssl/
 ​
 #上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包。
 #下载地址: https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.nd
 #注:打开链接你会发现里面有很多包,下载一个server包就够了,包含了Master和Worker Node二进制文件。
 cd /opt/k8s/
 tar zxvf kubernetes-server-linux-amd64.tar.gz
 ​
 #复制master组件的关键命令文件到kubernetes工作目录的bin子目录中
 cd /opt/k8s/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/k8s/
 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 <

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第26张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第27张图片

修改k8s-cert.sh脚本,之后运行脚本,生成CA证书、相关组件的证书和私钥:

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第28张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第29张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第30张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第31张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第32张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第33张图片

修改apiserver.sh脚本,之后执行脚本开启apiserver服务:

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第34张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第35张图片

修改scheduler.sh脚本,之后执行脚本开启scheduler服务:

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第36张图片

修改controller-manager.sh脚本,之后执行脚本开启controller-manager服务:

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第37张图片

修改admin.sh脚本,之后执行脚本,使kubectl对接apiserver:

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第38张图片

【云原生Kubernetes】二进制搭建Kubernetes集群(上)——部署etcd集群和单master_第39张图片


总结

etcd数据库:

  • 分布式键值对型的数据库,服务发现系统(之前的docker-consul 就是服务发现)
  • go语言开发的,使用raft-a致性算法
  • 部署集群时需要3台或以上的奇数台
  • 2379 对外(客户端)通信的端口
  • 2380 对内(集群内部节点间)通信的端口

etcd安装步骤:

  1. 使用CFSSL工具,生成ca证书和私钥文件,再使用ca签发服务端证书和私钥文件
  2. 使用ca证书、服务端证书和私钥文件加上etcd集群配置文件,去启动etcd服务
  3. 解压etcd软件包
  4. 复制etcd工作目录和服务管理文件到另外几个节点上,修改etcd集群配置文件并启动etcd服务
  5. 使用v3版本的接口执行etcdctl +证书选项+ (endpoint health | endpoint status | member list) 查看etcd 集群和节点状态

正常情况etcd应该生成三套证书:客户端证书,服务端证书,对等体证书(内部)。初学者可以先只生成两套。

master组件安装步骤:

1.先安装apiserver

  • 准备组件的相关证书和私钥文件
  • 准备bootstraptoken认证文件(给kubelet启动时签发证书时使用)
  • 准备组件的启动配置文件
  • 启动apiserver 服务、端口号、6443、https

2.再启动controller-manager 和scheduler

  • 准备启动配置文件
  • 准备证书和私钥文件生成kubeconfig 文件(用于指定对接哪个apiserver,使用什么证书认证)
  • 启动服务

3.检查集群组件状态

  • 需要准备kubeconfig 文件,把kubectl 加入到集群中( 指定对接哪个apiserver,使用什么证书认证)
  • kubectl get cs

你可能感兴趣的:(linux,docker,kubernetes,云原生,云计算)