阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

原创 吴就业 130 0 2024-04-24

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/3d0e2080b34e4321b22d76065d26be1b

作者:吴就业
链接:https://wujiuye.com/article/3d0e2080b34e4321b22d76065d26be1b
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

在k8s上安装apisix全家桶,通过helm安装很简单,但是会遇到一些问题。

安装

首先登录阿里云控制台,在ACK集群详情页,进入CloudShell,执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-controller。

helm repo add apisix https://charts.apiseven.com && helm repo update && helm upgrade --install apisix apisix/apisix --create-namespace  --namespace apisix --set dashboard.enabled=true --set ingress-controller.enabled=true --set ingress-controller.config.apisix.serviceNamespace=apisix

也可以分成三步执行

# 添加repo
helm repo add apisix https://charts.apiseven.com
# 
helm repo update
# 安装chart
helm upgrade --install apisix apisix/apisix --create-namespace  --namespace apisix --set dashboard.enabled=true --set ingress-controller.enabled=true --set ingress-controller.config.apisix.serviceNamespace=apisix

执行完命令安装的服务:

apisix-etcd部署遇到的问题

其中apisix-etcd是有状态服务,部署3个节点,需要用到3个存储卷。

PVC的声明如下:

spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  volumeMode: Filesystem

因此,我们需要到ECS购买3块云盘(云服务器ECS->存储与快照->云盘->创建云盘),用来做持久化存储卷。需要注意,购买的云盘所在的可用区,必须和集群在同一个可用区,否则无法挂盘成功。

购买成功后,在ack集群服务下,存储->存储卷,创建3个存储卷,类型勾选云盘,然后选择购买好的云盘。

截屏2023-11-12 20.18.55.png

然后到存储->存储声明,修改etcd的几个PVC,添加storageClassName: disk,这样pvc和pv就自动绑定了。

截屏2023-11-12 20.19.53.png

重新部署一下etcd有状态服务,这次将不会报找不到存储卷的错误,但是容器会一直重启,查看启动日记我们会看到pod想创建/bitnami/etcd/data目录,但是报了无权限。

解决权限问题,添加一个初始化容器,修改挂盘路径的权限。

       initContainers:
        - args:
            - '-c'
            - chmod 777 /bitnami/etcd
          command:
            - /bin/sh
          image: centos
          imagePullPolicy: IfNotPresent
          name: chmod
          resources: {}
          securityContext:
            runAsUser: 0
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /bitnami/etcd
              name: data

然后还要修改主容器的securityContext。

      securityContext:
        fsGroup: 0
        runAsGroup: 0
        runAsUser: 0

另外,ectd默认PVC申请的存储空间大小是8Gi,如果想修改这个大小,直接编辑etcd部署后的StatefulSet的yaml是不行的。参考这个issue(https://github.com/apache/apisix-helm-chart/issues/12),通过在执行helm命令安装apisix的时候设置:

--set etcd.persistence.size=1Gi

怎么访问apisix网关

由于我买的是ACK的Serverless集群(ASK),没有固定的Node,所以需要将apisix-gateway这个Service资源的type改为LoadBalancer,这样阿里云就会为我们创建一个CLB,然后得到一个公网IP。

怎么访问apisix-dashboard

访问dashboard前,需要给apisix-dashboard也分配clb,即将apisix-dashboard的Service的类型改为LoadBalancer。

账号密码在名为“apisix-dashboard”的ConfigMap资源里面描述,修改账号密码的话也是修改这个ConfigMap资源即可,修改成功后需要重启dashboard容器。(ACK集群控制台->配置管理->配置项->apisix-dashboard)

如何低成本使用

如果你想以非常经济的成本在阿里云上安装apisix学习测试或部署自己的网站的话,那么可以继续调整容器规格和缩容节点。

后记补充

发现配置上游指定服务发现类型为kubernetes时,无法正常转发请求到上游服务。

截屏2023-12-07 17.43.15.png

这个issue帮助我解决了问题:https://github.com/apache/apisix/issues/7026 我们还少了三个步骤:

  1. 修改名为apisix的configmap。增加配置:

    discovery:
    kubernetes: { }
    

    截屏2023-12-07 17.43.43.png 2. 创建rbac。通过cloudshell创建。

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
    name: apisix
    rules:
    - apiGroups: [""]
    resources: ["namespaces"]
    verbs: ["get", "list", "watch"]
    - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get", "list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: apisix
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: apisix
    subjects:
    - kind: ServiceAccount
    name: apisix
    namespace: apisix
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: apisix
    namespace: apisix
    
  2. 修改apisix的deployment,将pod的serviceAccount和serviceAccountName都改为apisix。

然后apisix配置上游的服务名的格式是:namespace/service资源的name:port的name,例如:

截屏2023-12-07 18.09.08.png

这里“port的name”指的是我们service资源里面声明的port的name字段。

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

国内docker用不了了怎么办

替换掉Docker的镜像仓库,例如可以使用AWS的ECR公开的镜像仓库,常用的基础镜像都能找到替代。

df命令查看挂盘目录大小是整个文件系统的大小还是挂载的目录的大小

df命令获取的是整个nfs文件系统的磁盘空间使用情况,而不是我们挂盘的目录。统计目录的使用情况可以使用du命令。

golang如何本地开发然后在远程编译运行

有时候,我们可能会遇到go项目中依赖一些底层的lib c库,这些库是只有linux环境下才有的,而我们本地开发环境一般是windwos系统或者mac os系统,我们也懒得搞一个Linux虚拟机来专门做开发,而且在虚拟机里面开发体验也确实不好,会影响效率。

Cloudflare CDN请求body被限制问题,以及http Range请求头被移除问题

对于免费用户,单个请求的最大Body大小为100mb,对于付费企业用户,最大也只有500MB。请求经过Cloudflare CDN后,Range请求头被干掉了,Cloudflare CDN请求源站的时候并没有带上Range请求头。

Go语言有前途吗?

做后台开发,不管是java还是go,都只是一门编程语言罢了,不会说做了5年的java后端研发,换成go就不会了吧,顶多花点时间学习一门语言和一些框架,把编码习惯变一变而已,在问题排查方面,需要重新学习一些工具而已。

新人成长路上,技术选型容易犯的错

技术人追求技术是好事,但应该把精力放在精益求精上,而不是追随潮流。没必要一味追求用一项技术,技术选型的目的就是选择各方面对比最适合的,这也包括开发成本、运维成本。