随着 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-01 | 10.206.16.2 | master 节点 | containerd、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy | 2c4g |
k8s-02 | 10.206.16.5 | master 节点 | containerd、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy | 2c4g |
k8s-03 | 10.206.16.3 | master 节点 | containerd、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy | 2c4g |
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 内容