k8s集群初始化
关键词:
- k8s集群搭建、重建(国内docker镜像加速)
- istio服务网格部署
- ArgoCD部署,临时的外部访问
- 集群外部访问开放
- nfs挂载k8s-pv
0,背景概述
近期发现集群里面拉取不到很多的公共docker镜像,大致也知道是firewall的原因,因为开启了VPN就可以正常拉取
最初是利用先把这些镜像使用VPN拉取下来,然后推送到公司的私有镜像中,然后从私有镜像仓库中拉取,但是这样的效率太低也太麻烦,另外k8s集群使用的是contianerd的容器运行时,其配置国内的镜像加速与docker不一样。
同时,当前的k8s集群部署也是一点点查找资料部署,并没有形成部署文档,需要演练一下集群崩坏后重建的过程
索性就花费半天时间,所有的推倒重建,一步步记录如何从ecs到k8s集群,并且自动化部署所有的集群服务
备注:由于国内网络的原因,有不少资源离开了VPN无法正常下载,我这边整理了一个离线包k8s-init.zip,里面包含了下载比较困难的资源。
1,初始化linux系统
我使用的是腾讯云轻量级服务器(主要是当时有优惠政策以很低的价格薅几个规格相对还行的机器)
轻量级服务器-系统:CentOS Stream 9 64bit
主机名称* | 规格 | 内网ip | 外网ip | 备注 |
---|---|---|---|---|
node1 | 独占4c:8g:100g:1500g流量/月 | 10.0.12.2 | ||
node2 | 独占2c:8g:70g:1100g流量/月 | 10.0.4.15 | ||
node2 | 独占2c:8g:70g:1100g流量/月 | 10.0.4.17 | ||
node4 | 独占2c:8g:120g:1200g流量/月 | 10.0.4.12 |
使用如下命令修改各个节点的主机名
hostnamectl set-hostname <主机名称*>
每个节点都要执行如下命令
# 更新插件
yum update -y
# yum upgrade -y
# 安装必要的插件
yum install conntrack-tools -y
yum install socat -y
2,kubekey-搭建k8s集群
2.1,集群搭建
直接在主节点执行如下命令
# 下面是进行kubekey工具下载,以及赋予执行权限
mkdir -p /opt/kubekey
cd /opt/kubekey
export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | sh -
chmod +x kk
# 查看支持的版本(选择一个合适的版本)
./kk version --show-supported-k8s
# 创建一个目标版本的配置文件(我选用v1.28.8版本)
./kk create config --with-kubernetes v1.28.8 -f /opt/kubekey/k8s-cluster-template.yaml
# 修改新生成的集群配置信息,然后执行创建集群(集群创建中),大概要花费30分钟左右部署完成具体看节点数量、网速和性能
./kk create cluster -f k8s-cluster-template.yaml
参考链接:使用KubeKey搭建k8s集群
如果下载比较慢,可以直接使用资源中的kk,将其赋权即可
警告:在执行上面的命令后,我遇到了部署程序"卡住"的情况
卡在[InstallKubeBinariesModule] Synchronize kubernetes binaries 这一步将近20多分钟,服务器在主节点在疯狂的给其他节点发送文件,但是没有任何日志打印,只知道程序还在跑,就是没有新的日志打印
排查发现,主节点与从节点有通过外网传输文件,我将k8s-cluster-template.yaml文件中的address都改为内部ip,然后重启,立马就20Mbps的数据交互,3s就执行完成
2.2,contianerd镜像加速配置
v1.28.8默认使用的是contianerd容器运行时
containerd境外镜像拉取加速 | 腾讯云 (tencentcloud.com)
# 进入contianerd的配置文件目录中修改镜像加速地址
cd /etc/containerd
vim config.toml
# 重启contianerd服务
systemctl daemon-reload
systemctl restart containerd
config.toml样例(包含了国内的docker.io、quay.io、ghcr.io加速)
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://mirror.ccs.tencentyun.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
endpoint = ["https://quay.tencentcloudcr.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
endpoint = ["https://ghcr.nju.edu.cn"]
警告:我在配置完成后,重启contianerd时出现过报错,错误日志提示有东西正在运行占用,无法响应然后退出。经过排查后发现是config.toml配置的格式写错导致的,按照上面的配置编写是没有问题的
3,istio服务网格
为了要额外部署istio的原因是:我们公司的服务架构为微服务架构,服务治理、监控、可观测性直接使用istio这种服务网格的解决方案可以一步到位,并且istio当前也是很成熟的一个架构
3.1,部署
# 由于国内拉取istio资源慢,所以这里直接使用离线资源进行部署,离线资源见压缩包
tar -xzvf istio-1.22.2-linux-amd64.tar.gz
cd istio-1.22.2
export PATH=$PWD/bin:$PATH
# 部署了demo类型的istio,包含边车功能、入口网关、出口网关能力
istioctl install --set profile=demo -y
其他的外围Grafana、Kiali、Jaeger、Prometheus等部署可以使用官方的部署教程:istio/samples/addons at release-1.22 · istio/istio (github.com)
3.2,istio的ingress网关作为入口端
当前有4台轻量级服务器联机而成的集群,每台机器都拥有自己的公网ip,我们这里没有使用额外收费的loadbalance方案,是直接通过域名解析到网络能力较强的一台主机上(当前已经够用了),并且通过nodePort映射到80、443来暴露服务的外部入口。
先修改NodePort可以使用的范围,将范围设定到(70-32767)
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 新增内容如下
- --service-node-port-range=70-32767
# 修改完成后,大概3分钟之内会自动生效
# 另外,我这边是2混合、2从的节点结构,我把2混合的节点中的配置都修改了一下
修改istio-ingressgateway
# 先查看网关svc名称
kubectl get svc -n istio-system
# 编辑网关svckubectl edit svc istio-ingressgateway -n istio-system
kubectl edit svc istio-ingressgateway -n istio-system
# 修改之后保存即可
图3.2.1 查看istio-ingressgateway的svc
图3.2.2 针对网关的内容编辑
4,辅助资源部署
4.1,nfs部署
直接在一个master节点上运行
#master节点安装nfs
yum -y install nfs-utils
#创建nfs目录
mkdir -p /data/nfs/
#修改权限
chmod -R 777 /data/nfs/
#编辑export文件,这个文件就是nfs默认的配置文件 todo 必须给这个权限
vim /etc/exports
/data/nfs *(rw,no_root_squash,sync)
#配置生效
exportfs -r
#查看是否生效
exportfs
#/data/nfs 10.0.4.12
#/data/nfs 10.0.12.2
#/data/nfs 10.0.4.15
#/data/nfs 10.0.4.17
# 重启服务
systemctl reload nfs-server
# 后续需要挂载的资源都要提前建立好目录
mkdir -p /data/nfs/redis
mkdir -p /data/nfs/postgres
备注:提前将需要挂载的资源目录创建好,例如上面的redis和postgres
/etc/exports文件内容
内容的意义是相当于将本节点的/data/nfs目录的所有(读写、同步)权限赋给4个ip(内网ip)的用户
/data/nfs/ 10.0.4.12(rw,no_root_squash,sync) 10.0.12.2(rw,no_root_squash,sync) 10.0.4.15(rw,no_root_squash,sync) 10.0.4.17(rw,no_root_squash,sync)
5,argoCD持续部署
一个用于通过git仓库声明式管理k8s集群资源的工具,亲测很好用
5.1,部署
kubectl create ns argocd
kubectl apply -f argocd-install.yaml -n argocd
# 获取argocd初始化密码,复制data.password部分的密码
kubectl get secret -n argocd argocd-initial-admin-secret -o yaml
# 使用base64反编码
echo <base64的> |base64 -d
# 编辑argocd临时的NodePort访问端口,直接通过ip:nodePort端口进行编写
kubectl edit svc argocd-server -n argocd
# 在argocd-UI界面上添加git repository仓库的连接信息
备注:argocd-install-change.yaml为我这边为了适配istio-ingressgateway修改的版本,可能使用这个版本无法直接通过ip:nodePort访问ui页面,遇到这种情况可以先使用原版argocd-install.yaml文件覆盖
图 4.1.1 获取secret中的base64编码的密码
5.2,配置git仓库信息
这里使用的国内的Gitee仓库,使用的https连接
图4.2.1 git仓库添加入口
图4.2.2 具体页面
直接在ui界面上新建一个init项目,目录指向dev/run,之后所有的东西都是自动完成的
4.3,手动在页面上创建一个application触发集群资源部署
具体如何做,可以参考Argo CD 使用说明 - 万雨 - 博客园 (cnblogs.com)
4.4,argocd-ingress部署
在使用4.2中的argocd-install-change.yaml资源apply之后,可以直接使用ingress.yaml来暴露argocd的外部访问
kubectl apply -f ingress.yaml -n argocd
官方给出的istio-ingress暴露argoCD访问解决方案
告警:如果不按照官方的提示进行,会出现redirect Loop问题,这个问题很多人都会遇到,这个坑我已经踩过了,没必要再次浪费时间在这个上面
备注:已经默认使用的cert-manager进行tls管理
编辑时间:2024.07.10