关键词

  • 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 <主机名称*>
  • 1.

每个节点都要执行如下命令

# 更新插件
yum update -y
# yum upgrade -y
# 安装必要的插件
yum install conntrack-tools -y
yum install socat -y

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

参考链接: 使用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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

警告:我在配置完成后,重启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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

​ 其他的外围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混合的节点中的配置都修改了一下
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

​ 修改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
# 修改之后保存即可
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

​ 图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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

备注:提前将需要挂载的资源目录创建好,例如上面的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)
  • 1.

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仓库的连接信息
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

备注: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
  • 1.

​ 官方给出的istio-ingress暴露argoCD访问 解决方案

告警:如果不按照官方的提示进行,会出现redirect Loop问题,这个问题很多人都会遇到,这个坑我已经踩过了,没必要再次浪费时间在这个上面

备注:已经默认使用的cert-manager进行tls管理

作者: 周健康 - 博客园 (cnblogs.com)

编辑时间:2024.07.10

本文由博客一文多发平台  OpenWrite 发布!