赞
踩
在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是有状态服务,部署3个节点,需要用到3个存储卷。
PVC的声明如下:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
volumeMode: Filesystem
因此,我们需要到ECS购买3块云盘(云服务器ECS->存储与快照->云盘->创建云盘),用来做持久化存储卷。需要注意,购买的云盘所在的可用区,必须和集群在同一个可用区,否则无法挂盘成功。
购买成功后,在ack集群服务下,存储->存储卷,创建3个存储卷,类型勾选云盘,然后选择购买好的云盘。
然后到存储->存储声明,修改etcd的几个PVC,添加storageClassName: disk
,这样pvc和pv就自动绑定了。
重新部署一下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
由于我买的是ACK的Serverless集群(ASK),没有固定的Node,所以需要将apisix-gateway这个Service资源的type改为LoadBalancer,这样阿里云就会为我们创建一个CLB,然后得到一个公网IP。
访问dashboard前,需要给apisix-dashboard也分配clb,即将apisix-dashboard的Service的类型改为LoadBalancer。
账号密码在名为“apisix-dashboard”的ConfigMap资源里面描述,修改账号密码的话也是修改这个ConfigMap资源即可,修改成功后需要重启dashboard容器。(ACK集群控制台->配置管理->配置项->apisix-dashboard)
如果你想以非常经济的成本在阿里云上安装apisix学习测试或部署自己的网站的话,那么可以继续调整容器规格和缩容节点。
--set ingress-controller.enabled=true --set ingress-controller.config.apisix.serviceNamespace=apisix
,如果已经安装成功,直接删除inngress controller的Deployment即可。发现配置上游指定服务发现类型为kubernetes时,无法正常转发请求到上游服务。
这个issue帮助我解决了问题:https://github.com/apache/apisix/issues/7026
我们还少了三个步骤:
discovery:
kubernetes: { }
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
然后apisix配置上游的服务名的格式是:namespace/service资源的name:port的name,例如:
这里“port的name”指的是我们service资源里面声明的port的name字段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。