kubernetes1.22安装apisix

背景:

kubernetes环境(tke)1.20.6刚完成了升级,体验了一把Tke1.20.6升级Tke1.22.5留下的坑。traefik自定义crd各种的问题!算是比较早用traefik的用户了。大佬们都说traefik早期算是第一梯队。现在算是淘汰的网关了。纯go写的,GC语言写的网关后面都会成为三流网关。就也想顺路体验一下其他的网关,比如apisix。这貌似是基于nginx lua的网关。另外也关注张晋涛大佬各种博客文章很久了。也值得试一试。为什么 APISIX Ingress 是比 Traefik 更好的选择?

kubernetes1.22安装apisix

理想很丰满,文档很现实:

本来觉得国人团队开发的,文档应该会很易读,打开文档:apisix.apache.org/zh/docs/ing.... 这里又简体中文的切换,but.....点击以后特别想知道这个简体中文 选项到底什么用途?仅仅是为了切换标题栏 的语言吗.......。何况这不是国人搞的吗......就算与世界接轨中文也很容易吧........ 实在不行也就别加这个中文切换了 我自己谷歌翻译......

以TKE helm安装文档为例Installation

安装这里由于我的环境是tke就看了一眼 Installation TKE (Tencent)的文档: apisix.apache.org/docs/ingres...

满足先决条件:

helm是早先安装过的:

arduino 复制代码
helm version
kubectl get nodes

满足先决条件:

添加helm repo 创建工作空间

csharp 复制代码
helm repo add apisix https://charts.apiseven.com
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
kubectl create ns ingress-apisix

特意备份一下这个版本,pull到本地存一下,个人习惯吧:

bash 复制代码
helm pull apisix/apisix

安装 APISIX 和入口控制器

直接参照官方文档:

arduino 复制代码
helm install apisix apisix/apisix \
  --set gateway.type=LoadBalancer \
  --set ingress-controller.enabled=true \
  --set etcd.persistence.size="10Gi" \
  --namespace ingress-apisix \
  --set ingress-controller.config.apisix.serviceNamespace=ingress-apisix
kubectl get service --namespace ingress-apisix

默认存储cbs 10G最小步进也符合

arduino 复制代码
 kubectl get sc

等待helm 安装成功参照文档:

arduino 复制代码
kubectl get service apisix-gateway --namespace ingress-apisix -o jsonpath='{.status.loadBalancer.ingress[].ip}'

但是完全没有返回loadBalancer阿? get svc获取一下相关信息:

arduino 复制代码
kubectl get svc -n ingress-apisix

但是上面按照文档gateway.type=LoadBalancer 了阿?怎么还是**NodePort?**没有想明白...... 怎么解决呢?我尝试了一下卸载,准备重新安装一下.....(默认以为自己输错了.......):

复制代码
helm uninstall apisix -n ingress-apisix

再重新安装一下:

arduino 复制代码
helm install apisix apisix/apisix \
  --set gateway.type=LoadBalancer \
  --set ingress-controller.enabled=true \
  --set etcd.persistence.size="10Gi" \
  --namespace ingress-apisix \
  --set ingress-controller.config.apisix.serviceNamespace=ingress-apisix
kubectl get service --namespace ingress-apisix

but get pod发现etcd搞不起来了。大概就是下面的样子:

复制代码
kubectl logs -f apisix-etcd-1 -n ingress-apisix

无脑想一下应该是pv pvc里面残留的数据造成的。继续uninstall apisix

复制代码
helm uninstall apisix -n ingress-apisix

删除pvc:

kotlin 复制代码
kubectl delete pvc data-apisix-etcd-0 data-apisix-etcd-1 data-apisix-etcd-2 -n ingress-apisix

重新安装一下:

arduino 复制代码
helm install apisix apisix/apisix \
  --set gateway.type=LoadBalancer \
  --set ingress-controller.enabled=true \
  --set etcd.persistence.size="10Gi" \
  --namespace ingress-apisix \
  --set ingress-controller.config.apisix.serviceNamespace=ingress-apisix
kubectl get service --namespace ingress-apisix

跑起来了 仍然与开始一样: 懒得kubectl命令去修改了,登陆tke控制台,找到对应集群-服务与路由-service,选择 ingress-apisix namespace。选择apisix-gateway 更改配置: 选择公网LB访问,这里自动创建 端口都默认了 修改完成后控制台如下,出现了lb以及相关信息 当然了kubectl get svc -n ingress-apisix 也正常获取了loadbalancer: 访问默认lb地址出现404页面如下:

关于loadbalancer

怀疑自己,创建一个loadbalancer

也怀疑了一下当时是我的集群有问题吗?没法创建loadbalancer?按照官方文档Service 基本功能 试了一下:

cat svc.yaml

yaml 复制代码
kind: Service
apiVersion: v1
metadata:
  ## annotations:
  ##   service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxxxx ##若是创建内网访问的 Service 需指定该条 annotation
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
  type: LoadBalancer
复制代码
kubectl apply -f svc.yaml

完全没有问题阿!不去纠结了,起码不是集群的问题,应该是helm的配置问题,or压根不支持。起码按照文档搞不起来! 看一眼自动创建的lb: 这我还是喜欢使用http https监听器.......,好歹能启用sni阿!创建一个https的监听器,这里创建的默认的是tcp的监听器!

创建一个https监听器

创建一个https监听器,这是个人的习惯,习惯把证书挂载在负载均衡层。免得在ingress曾管理那么多证书...... 启用SNI : 添加一个规则:输入域名,我这里直接用了泛域名 *.xxx.com的方式,具体的交给后面的ingress去处理选择对应域名证书: 注意:我这里开启了目标组 下一步,直接默认就开通了健康检查了: 会话保持根据个人需求是否开启,我这里保持了默认: clb控制台创建了目标组 随后转发规则这里绑定目标组:

简单测试:

创建测试应用实例

启动一个nginx 实例然后用apisix代理一下,以常用的nginx镜像启动一个实例: cat nginx-php.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-php
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: nginx-php
  template:
    metadata:
      labels:
        app: nginx-php
    spec:
      containers:
        - name: nginx-php
          image: richarvey/nginx-php-fpm:latest
          ports:
            - containerPort: 80
          resources:
            requests:
              memory: "512M"
              cpu: "500m"
            limits:
              memory: "2048M"
              cpu: "2000m" 
---

apiVersion: v1
kind: Service
metadata:
  name: nginx-php
  labels:
    app: nginx-php
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-php
arduino 复制代码
kubectl apply -f nginx-php.yaml
kubectl get svc 

ApisixRoute 与ingress方式代理:

参照文档:apisix.apache.org/docs/ingres... cat router.yaml

yaml 复制代码
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: nginx-php-route
  namespace: default
spec:
  http:
  - name: nginx-php-route
    match:
      hosts:
      - test.xxx.com
      paths:
      - /*
    backends:
      - serviceName: nginx-php
        servicePort: 80
复制代码
 kubectl apply -f router.yaml

盲猜了一下应该是这样现实router.......

arduino 复制代码
kubectl get apisixroute

http方式访问: https方式: 以ingress的方式试一下: cat ingress.yaml

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-php-ingress
  namespace: default
spec:
  ingressClassName: apisix
  rules:
    - host: test1.xxx.com
      http:
        paths:
          - backend:
              service:
                name: nginx-php
                port:
                  number: 80
            path: /
            pathType: Prefix

执行apply yaml文件:

arduino 复制代码
kubectl apply -f ingress.yaml
kubeclt get ingress 

https访问 http方式访问:

启用dashboard:

启动dashboard控制台体验一下?**--set dashboard.enabled=true **

arduino 复制代码
helm upgrade apisix  apisix/apisix  --set dashboard.enabled=true   --namespace ingress-apisix

etcd这个提示忽略了......

sql 复制代码
kubectl get all -n ingress-apisix

but** loadbalancer**又没有了.... 我再也不想用loadbalancer的这种方式了.....正好就启用一下http https监听器吧....

创建一个Loadbalancer

clb控制台新建一个clb实例: 注意选择所属网络。貌似今天刚出的实例规格。这里还是保持默认了共享型。立即购买!确认订单: 控制台选择对应的新建实例,打开监听器管理,创建https https监听器: 注意:依然启用SNI,命名名称可以根据个人喜好定义。我个人喜欢映射端口号命名! 创建转发规则(443下创建,80准备直接做重定向!),启用了http 2.0 quic 还启用了后端目标组! 健康检测也默认开启了

会话保持默认没有开启,提交: 绑定目标组: 注:仍然是上面创建的目标组! 重定向配置: 偷懒做了一个强制跳转80访问直接跳转到443:

注意:当然了这里的重定向针对的是*.xxx.com 如果有其他监听器域名规则。依然要添加对应域名的重定向配置!

对外暴露apisix dashboard

这里直接以Ingress方式暴露服务了: cat apisix-dashboard-router.yaml

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apisix-dashboard-ingress
  namespace: ingress-apisix
spec:
  ingressClassName: apisix
  rules:
    - host: apisix-dashboard.layaverse.com
      http:
        paths:
          - backend:
              service:
                name: apisix-dashboard
                port:
                  number: 80
            path: /
            pathType: Prefix

apply yaml文件:

复制代码
kubectl apply -f apisix-dashboard-router.yaml

浏览器访问dashboard域名。默认账号密码admin admin进入? 控制台页面大致如下: 路由这里可以看到已有的路由策略:

修改dashboard默认用户名密码:

找了一圈没有修改密码的.... 退出登陆,重新登陆页面,提示了可以修改配置文件? edit configmap配置文件修改:

arduino 复制代码
kubectl get cm -n ingress-apisix
kubectl edit cm apisix-dashboard -n ingress-apisix

明文....是很抗拒,另外不能动态加载生效阿毕竟。delete pods 等待pod running:

arduino 复制代码
kubectl get pods -n ingress-apisix
kubectl delete pods apisix-dashboard-55c654b869-9b9pg -n ingress-apisix

再使用 admin admin 已经无法登陆了: 使用新的账号密码登陆web控制台: 就先这样吧:

接下来我的需求日志json化:

先个人习惯吧 看着日志就不爽了。一般都进行了json格式化:

复制代码
kubectl edit cm apisix -n ingress-apisix

参照 :apisix 修改日志为json格式 。修改参数如下:

swift 复制代码
access_log_format_escape: json

access_log_format:'{"time": "$time_iso8601", "remote_addr": "$proxy_protocol_addr", "x_forward_for": "$proxy_add_x_forwarded_for", "remote_user": "$remote_user", "bytes_sent": $bytes_sent, "request_time": $request_time, "status": $status, "vhost": "$host", "request_proto": "$server_protocol", "path": "$uri", "request_query": "$args", "request_length": $request_length, "duration": $request_time,"method": "$request_method", "http_referrer": "$http_referer", "http_user_agent": "$http_user_agent", "upstream_addr": "$upstream_addr", "upstream_response_time": "$upstream_response_time", "upstream_status": "$upstream_status", "upstream_scheme": "$upstream_scheme", "upstream_host": "$upstream_host", "upstream_uri": "$upstream_uri", "http_host": "$http_host", "request": "$request", "time_local": "$time_local", "body_bytes_sent": "$body_bytes_sent"}'

依然是delete pod 等待pod running: 日志json格式了看着顺眼点了,虽然上面打印的这些日志还有点强迫症........

总结一下:

  1. 文档中英文的支持,中文只替换了标题栏.
  2. 对loadbalancer的支持。文档写的都可以,结果启动了都是nodeport.
  3. dashboard 不知道能不能支持多用户?用户密钥不想明文希望能动态加载。
  4. dashboard中grafana这些的没有对我进行很好的用户引导......路由这些也没有按照namespace进行区分...用起来不是很习惯
  5. 其他功能慢慢体验吧,等我多体验完整了再考虑替代traefik......
  6. apisix实例helm安装了一个pod,怎么实现高性能呢?当时用traefik都是daemonsets的方式。这里是怎么更好的实现性能呢
相关推荐
木鱼时刻19 小时前
容器与 Kubernetes 基本概念与架构
容器·架构·kubernetes
chuanauc1 天前
Kubernets K8s 学习
java·学习·kubernetes
庸子2 天前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
李白你好2 天前
高级运维!Kubernetes(K8S)常用命令的整理集合
运维·容器·kubernetes
Connie14512 天前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes
伤不起bb2 天前
Kubernetes 服务发布基础
云原生·容器·kubernetes
别骂我h2 天前
Kubernetes服务发布基础
云原生·容器·kubernetes
weixin_399380692 天前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes
斯普信专业组3 天前
K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南
nginx·kubernetes·ssl
&如歌的行板&3 天前
如何在postman中动态请求k8s中的pod ip(基于nacos)
云原生·容器·kubernetes