二进制搭建docker19.03+kubernetes1.21版本高可用集群

本文档详细介绍了如何使用二进制方式在Linux环境下搭建docker19.03和kubernetes1.21的高可用集群。内容包括环境准备,如虚拟机配置、升级内核、环境设置,以及安装docker、etcd集群、k8s组件,配置负载均衡、证书生成等关键步骤。此外,还涉及网络划分、k8s组件的配置和服务验证,确保集群的稳定性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境准备

前序说明

本次安装模式使用二进制方式搭建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",
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值