关键词:
近期发现集群里面拉取不到很多的公共docker镜像,大致也知道是firewall的原因,因为开启了VPN就可以正常拉取
最初是利用先把这些镜像使用VPN拉取下来,然后推送到公司的私有镜像中,然后从私有镜像仓库中拉取,但是这样的效率太低也太麻烦,另外k8s集群使用的是contianerd的容器运行时,其配置国内的镜像加速与docker不一样。
同时,当前的k8s集群部署也是一点点查找资料部署,并没有形成部署文档,需要演练一下集群崩坏后重建的过程
索性就花费半天时间,所有的推导重建,一步步记录如何从ecs到k8s集群,并且自动化部署所有的集群服务
备注:由于国内网络的原因,有不少资源离开了VPN无法正常下载,我这边整理了一个离线包k8s-init.zip,里面包含了下载比较困难的资源。
我使用的是腾讯云轻量级服务器(主要是当时有优惠政策以很低的价格薅几个规格相对还行的机器)
轻量级服务器-系统: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
直接在主节点执行如下命令
# 下面是进行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就执行完成
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配置的格式写错导致的,按照上面的配置编写是没有问题的
为了要额外部署istio的原因是:我们公司的服务架构为微服务架构,服务治理、监控、可观测性直接使用istio这种服务网格的解决方案可以一步到位,并且istio当前也是很成熟的一个架构
# 由于国内拉取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)
当前有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 针对网关的内容编辑
直接在一个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)
一个用于通过git仓库声明式管理k8s集群资源的工具,亲测很好用
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编码的密码
这里使用的国内的Gitee仓库,使用的https连接
图4.2.1 git仓库添加入口
图4.2.2 具体页面
直接在ui界面上新建一个init项目,目录指向dev/run,之后所有的东西都是自动完成的
具体如何做,可以参考Argo CD 使用说明 - 万雨 - 博客园 (cnblogs.com)
在使用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管理
作者:周健康 - 博客园 (cnblogs.com)
编辑时间:2024.07.10
本文由博客一文多发平台 OpenWrite 发布!