随着 Kubernetes 版本更新迭代,在 1.24 开始,已经将容器运行时修改为 containerd,周末闲来无事使用腾讯云的 ECS + 负载均衡实现对 apiserver 的代理。

随着 Kubernetes 版本更新迭代,在 1.24 开始,已经将容器运行时修改为 containerd,周末闲来无事使用腾讯云的 ECS + 负载均衡实现对 apiserver 的代理。同时使用 Ubuntu 二进制来安装 k8s 1.24.3

2022年08月02日更新相关错误

环境介绍

购买服务器

购买负载均衡

  • 系统 Ubuntu Server 20.04 LTS 64 位
  • K8S 版本 1.24.3
  • containerd v1.6.4
主机名称IP 地址说明服务服务器配置
k8s-0110.206.16.2master 节点containerd、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy2c4g
k8s-0210.206.16.5master 节点containerd、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy2c4g
k8s-0310.206.16.3master 节点containerd、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy2c4g

VIP 为腾讯云负载均衡服务器

初始化环境

初始化步骤所有服务器执行
  • 初始化环境需要在所有服务器上操作
#配置apt源
  • 在所有服务器上设置时间同步
sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
  • 配置 ulimit
  • 配置主机名
#关闭防火墙
  • 配置免密
免密只需要在 k8s-01 节点上执行即可
systemctl disable --now ufw
  • 安装 ipvs (如果业务量不大,使用 iptables 效率也是可以)
  • 修改内核参数
#关闭交换分区,云服务器没有交换分区,所以我这里不执行了

所有节点安装 Containerd

sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 配置 Containerd 所需的模块
swapoff -a && sysctl -w vm.swappiness=0
  • 加载模块,设置开机启动
  • 配置 Containerd 所需的内核
cat /etc/fstab
  • 创建 Containerd 的配置文件
# /dev/mapper/centos-swap swap                    swap    defaults        0 0

请手动删除标记的 67 行systemd_cgroup = false,否则 kubelet 启动会提示下面的错误
https://i4t.com/5633.html

  • 设置开机启动
#打开终端输入以下命令安装ntpdate工具。

所有节点都可以正常使用

apt-get install ntpdate

Kubernetes Master 安装

二进制文件下载

k8s-01 节点操作即可

下载安装包

解压 k8s 安装文件

#再输入命令设置系统时间与网络时间同步。

etcd 安装文件

ntpdate cn.pool.ntp.org

检查/usr/local/bin下内容

查看 kubelet 和 etcdctl 是否获取正常

#最后输入命令将时间更新到硬件上即可。

将刚刚解压的二进制文件拷贝到其它服务器上

hwclock --systohc

下载配置 cfssl 证书

k8s-01 上操作即可

下载配置 cfssl 证书工具

ulimit -SHn 65535

创建证书配置文件

cat >> /etc/security/limits.conf <<EOF

ETCD 证书

创建证书文件

* soft nofile 655360
下方操作均在 k8s-01 节点

生成 etcd 证书和 etcd 证书的 key

* hard nofile 131072

将证书复制到其它节点

* soft nproc 655350

k8s 集群证书

k8s-01 节点操作

所有证书存放目录

* hard nproc 655350

生成一个根证书

* seft memlock unlimited

10.96.0.1 是 service 网段的第一个地址
apiserver.frps.cn 高可用 vip 地址
10.206.16.14 高可用 ip

* hard memlock unlimitedd

生成 apiserver

EOF

生成 controller-manage 证书

cat >> /etc/hosts <<EOF

生成 kube-proxy 证书

10.206.16.2  k8s-01

创建 ServiceAccount Key

10.206.16.5  k8s-02

其他节点创建目录

10.206.16.3  k8s-03

查看证书

10.206.16.14 apiserver.i4t.com

配置 ETCD

k8s-01 配置文件,请根据需求修改

  • 10.206.16.2 ETCD 地址
  • k8s-01 ETCD-01 节点名称
EOF

k8s-02 配置文件,请根据需求修改

apt install -y sshpass

k8s-03 配置文件,请根据需求修改

ssh-keygen -f /root/.ssh/id_rsa -P ''

创建 etcd 启动服务(需要在所有 master 节点操作)

export IP="k8s-01 k8s-02 k8s-03

拷贝 ETCD 证书

export SSHPASS=Haomima123..

查看 etcd 状态

for HOST in $IP;do

配置腾讯云负载均衡

负载均衡是通信集群信息的节点,所以我这里将负载均衡 IP 添加了一个 hosts 解析。解析域名为 apiserver.frps.cn

配置监听器

  • 负载均衡端口为 8443
  • apiserver 服务端口为 6443

绑定后端节点

最后展示

在 k8s-01 节点上执行 for 循环,将 apiserver IP 解析为 apiserver.frps.cn 域名

sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST

ApiServer 配置

创建 apiserver 服务启动文件

k8s-01 节点

需要在每台节点自行修改对应的信息

  • --advertise-address 当前节点 IP
  • --etcd-servers ETCD 节点信息
  • --secure-port apiserver 端口号
done

k8s-02 节点

k8s-03 节点

#自行开启SSH root登陆

启动 apiserver(所有 master 节点)

apt install ipvsadm ipset sysstat conntrack -y

启动完成后,我们到腾讯云 SLB 就可以看到后端健康已经正常

Controller-Manage

只在 k8s-01 操作,然后拷贝到其它节点

172.16.0.0/12 为 pod 网段,按需求设置你自己的网段

配置文件拷贝到其它节点

cat >> /etc/modules-load.d/ipvs.conf <<EOF

启动所有节点服务

ip_vs

Scheduler

只在 k8s-01 操作,然后拷贝到其它节点
ip_vs_rr

配置文件拷贝到其它节点

ip_vs_wrr

启动所有节点服务

ip_vs_sh

上下文配置

只在 k8s-01 操作
nf_conntrack

查看集群状态

ip_tables

Kubelet

只在 k8s-01 操作,然后拷贝到其它节点

创建 kubelet 启动文件

ip_set

提示: Centos 需要将--node-labels=node.kubernetes.io/node=后面的单引号删除

创建 kubelet 配置文件

xt_set

拷贝证书到其它节点

ipt_set

启动服务

所有节点
ipt_rpfilter
ipt_REJECT

查看集群

ipip

Kube-Proxy

创建 systemd 启动文件

EOF

创建 kube-proxy 配置文件

前面已经生成了 kube-proxy.kubeconfig 文件,接下来我们拷贝到其它 master 节点

systemctl restart systemd-modules-load.service

批量启动服务

检查服务状态

lsmod | grep -e ip_vs -e nf_conntrack

Calico 安装

Calico 网段

  • service:10.96.0.0/12
  • pod:172.16.0.0/12
ip_vs_sh               16384  0

检查 calico

ip_vs_wrr              16384  0

CoreDNS 安装

ip_vs_rr               16384  0

创建 coredns

ip_vs                 155648  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr

检查 dns 服务

nf_conntrack          139264  1 ip_vs

集群验证

等 kube-system 命名空间下的 Pod 都为 Running,这里先测试一下 dns 是否正常

nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs

创建后 Pod 我们进行检查

nf_defrag_ipv4         16384  1 nf_conntrack
  • 测试 DNS 解析
libcrc32c              16384  4 nf_conntrack,btrfs,raid456,ip_vs
  • 测试 Nginx pod_ip svc_ip
cat <<EOF > /etc/sysctl.d/k8s.conf

  • 测试 Node Port

在任意一台节点访问 ip:30001 端口,测试 nginx

如果安全组没有打开,需要开启一下哈~

Metrics Server

net.ipv4.ip_forward = 1

创建 metrics-server

net.bridge.bridge-nf-call-iptables = 1

稍等几分钟我们就可以通过kubectl top node查看到各个节点的资源使用情况

fs.may_detach_mounts = 1

Pod 也是可以看到

vm.overcommit_memory=1

Dashboard 安装

vm.panic_on_oom=0

更改 dashboard 的 svc 为 NodePort

fs.inotify.max_user_watches=89100

查看 nodeport 端口号

fs.file-max=52706963

创建 token 访问

fs.nr_open=52706963

使用浏览器访问

任意 Node IP:31816 (31816端口号是需要通过 kubectl get svc 获取到,端口号为随机生成,也可以直接指定)

下面填写上面 token 内容

最后修改:2023 年 02 月 13 日
如果觉得我的文章对你有用,请随意赞赏