二进制搭建docker19.03+kubernetes1.21版本高可用集群
- 环境准备
- 安装docker
- 安装etcd集群
- 安装k8s组件与证书
-
- k8s离线安装包
- master节点准备
- 生成kube-apiserver 证书
- 生成front-proxy证书
- 生成front-proxy-client证书
- 生成controller-manage证书与配置
- 生成scheduler证书与配置
- 生成admin证书与配置
- 生成ServiceAccount Key
- 生成的所有配置文件发送到其它节点
- kube-apiserver 负载均衡配置
- 启动k8s组件
- 配置apiserver服务
- 配置controller-manager服务
- 配置scheduler
- TLS与引导启动原理
- master1、master2、master3设置kubectl执行权限
- 创建集群引导权限文件
- 引导Node节点启动
- kube-proxy配置
- 部署calico
- 部署coreDNS
- 给机器节点打上role标签
- 集群验证
- 备注
环境准备
前序说明
本次安装模式使用二进制方式搭建kubernetes高可用集群,可用于实际生产环境,如果存在不恰当的地方,请在评论区里指正。安装软件下载链接放在文章最后
虚拟机配置
虚拟机版本以及配置
本次安装虚拟机使用virtualBox6.1,使用centos7作为镜像,分别搭建7台centos虚拟机,****并且能同时保证7台服务器之间网络能通、以及能够访问外网的能力配置如下:
我使用virtualBox分别给7台服务器开了两个网卡,一个网络地址转换(NAT)和仅主机(host-only)网络,如下图:
升级linux内核
使用指令uname -r 查看linux内核版本
因为3.10内核版本在集群生产环境中存在不稳定性,所以在此步骤升级linux内核
k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3执行!!!
// 升级软件包
yum update -y --exclude=kernel*
// 下载公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
//安装镜像加速
yum install -y yum-plugin-fastestmirror
//仓库启用后,列出可用的内核相关包
// kernel-lt: long term support:长期支持版
// kernel-ml: mainline stable: 主线稳定版
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
//选择指定版本进行安装 我选的是这个版本 5.4.119-1.el7.elrepo
yum --enablerepo=elrepo-kernel install -y kernel-lt
//重新查看内核版本,还是3.10未生效,继续以下操作
uname -sr
//查看内核位置
awk -F\' '$1=="menuentry " {
print $2}' /etc/grub2.cfg
//重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
//修改使用默认内核 排在第一位的就是当前centos默认使用的内核版本
vi /etc/default/grub
# 将 GRUB_DEFAULT 设置为 0,代表 GRUB 初始化页面的第一个内核将作为默认内核
# 再重新整理下内核
grub2-mkconfig -o /boot/grub2/grub.cfg
# 8、重开机
reboot
//再次重新查看内核版本
uname -r
#如果显示 5.4.213-1.el7.elrepo.x86_64 就没有问题了
centos环境设置
// 分别修改k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master的主机名
hostnamectl set-hostname xxxxx
//分别编辑k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master的/etc/hosts文件,追加以下内容
vim /etc/hosts
192.168.56.101 k8s-master1
192.168.56.102 k8s-master2
192.168.56.103 k8s-master3
192.168.56.104 k8s-node1
192.168.56.105 k8s-node2
192.168.56.109 k8s-node3
192.168.56.250 k8s-master-lb
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master关闭selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master关闭swap
swapoff -a && sysctl -w vm.swappiness=0
sed -ri 's/.*swap.*/#&/' /etc/fstab
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master修改limit
ulimit -SHn 65535
vi /etc/security/limits.conf
# 末尾添加如下内容
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
//k8s-master1配置ssh免密连接,为了后面方便连接k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3传输文件
ssh-keygen -t rsa
for i in k8s-master1 k8s-master2 k8s-master3 k8s-node1 k8s-node2 k8s-node3;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master安装其它的软件
yum install wget git jq psmisc net-tools yum-utils device-mapper-persistent-data lvm2 -y
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master执行以下操作
//安装ipvs工具,方便以后操作ipvs,ipset,conntrack等
yum install ipvsadm ipset sysstat conntrack libseccomp -y
//所有节点配置ipvs模块,执行以下命令,在内核4.19+版本改为nf_conntrack, 4.18下改为nf_conntrack_ipv4
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
//修改ipvs配置,加入以下内容
vi /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
//执行命令
systemctl enable --now systemd-modules-load.service #--now = enable+start
//检测是否加载
lsmod | grep -e ip_vs -e nf_conntrack
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master执行
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
net.ipv4.conf.all.route_localnet = 1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16768
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16768
EOF
sysctl --system
//k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3、k8s-lb-master执行所有节点配置完内核后,重启服务器,保证重启后内核依旧加载
reboot
lsmod | grep -e ip_vs -e nf_conntrack
kubernetes集群架构
kubernetes多个主节点的选举方式使用Raft协议,链接: raft讲解
Raft官方动画讲解,链接: 动画演示
细节内容这里不做具体陈述
cfssl使用以及安装
CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
链接: github地址
链接: 官网地址
集群相关证书类型
client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
peer certificate: 双向证书,用于etcd集群成员间通信
根据认证对象可以将证书分成三类:
服务器证书server cert,
客户端证书client cert,
对等证书peer cert(表示既是server cert又是client cert
在kubernetes 集群中需要的证书种类如下:
etcd 节点需要标识自己服务的server cert,也需要client cert与etcd集群其他节点交互,当然可以分别指定2个证书,也可以使用一个对等证书
master 节点需要标识 apiserver服务的server cert,也需要client cert连接etcd集群,这里也使用一个对等证书
kubectl calico kube-proxy 只需要client cert,因此证书请求中 hosts 字段可以为空
kubelet证书比较特殊,不是手动生成,它由node节点TLS BootStrap向apiserver请求,由master节点的controller-manager 自动签发,包含一个client cert 和一个server cert
证书划分层次如图:
官网下载cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64这三个组件
k8s-master1机器上执行
// k8s-master1节点上执行,安装cfssl
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64
//授予执行权限
chmod +x cfssl*
//批量重命名
for name in `ls cfssl*`; do mv $name ${
name%_1.5.0_linux_amd64}; done
//移动文件到/usr/bin
mv cfssl* /usr/bin
创建cfssl证书机构
生成ca配置
client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
peer certificate: 双向证书,用于etcd集群成员间通信
创建ca配置文件 (ca-config.json)
相当于证书颁发机构的工作规章制度
“ca-config.json”:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
“signing”:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
“server auth”:表示client可以用该 CA 对server提供的证书进行验证;
“client auth”:表示server可以用该CA对client提供的证书进行验证;
// 创建指定目录并且进入该目录
mkdir -p /etc/kubernetes/pki
cd /etc/kubernetes/pki
// 安装vim
yum install -y vim
//编辑ca-config.json生成证书机构
vim ca-config.json
{
"signing": {
"default": {
"expiry": "43800h"
},
"profiles": {
"server": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"kubernetes": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"etcd": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
//ca签名请求
vim /etc/kubernetes/pki/ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "Kubernetes",
"OU": "Kubernetes"
}
],
"ca": {
"expiry": "87600h"
}
}
//生成ca证书和私钥 在/etc/kubernetes/pki下操作
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
网络划分
安装docker
先检查k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3节点是否安装了docker,如果安装了需要先卸载再重新安装
安装docker指定版本
//以下指令需要在k8s-master1、k8s-master2、k8s-master3、k8s-node1、k8s-node2、k8s-node3上执行
// 指定安装docker3.19.03.9版本
yum remove docker*
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io-1.4.4
//修改docker配置,新版kubelet建议使用systemd,所以可以把docker的CgroupDriver改成systemd
// https://9ugrnx07.mirror.aliyuncs.com是我自己的镜像加速器,可以换成其它的镜像加速
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://9ugrnx07.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl enable --now docker
//验证docker服务的状态,如果状态为activing就代表docker安装成功
systemctl status docker
安装etcd集群
生成etcd证书
Kubernetes 需要 PKI 才能执行以下操作:
Kubelet 的客户端证书,用于 API 服务器身份验证
API 服务器端点的证书
集群管理员的客户端证书,用于 API 服务器身份认证
API 服务器的客户端证书,用于和 Kubelet 的会话
API 服务器的客户端证书,用于和 etcd 的会话
控制器管理器的客户端证书/kubeconfig,用于和 API 服务器的会话
调度器的客户端证书/kubeconfig,用于和 API 服务器的会话
前端代理 的客户端及服务端证书
下载etcd安装包
// 在k8s-master1执行
// 给所有master节点,发送etcd包准备部署etcd高可用
wget https://github.com/etcd-io/etcd/releases/download/v3.4.16/etcd-v3.4.16-linux-amd64.tar.gz
//复制到其他节点
for i in k8s-master1 k8s-master2 k8s-master3;do scp etcd-* root@$i:/root/;done
// 解压到 /usr/local/bin
tar -zxvf etcd-v3.4.16-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin etcd-v3.4.16-linux-amd64/etcd{
,ctl}
//验证
etcdctl #只要有打印就ok
生成etcd证书、公钥、私钥
// 在/etc/kubernetes/pki目录下执行
vim etcd-ca-csr.json
{
"CN": "etcd",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",