不使用pvc的方式在K8S中部署apisix-gateway

不使用pvc的方式在K8S中部署apisix-gateway

簡介

我的apisix使用etcd作為數據存儲服務器,官方的使用pvc方式或者docker-compose的方式,對於新手不太友好,本篇是從etcd的安裝到apisix的打通都會涉及。

部署etcd

etcd 是一個分佈式鍵值對存儲,設計用來可靠而快速的保存關鍵數據並提供訪問。通過分佈式鎖,leader選舉和寫屏障(write barriers)來實現可靠的分佈式協作。etcd集群是為高可用,持久性數據存儲和檢索而準備。

  • ubuntu部署etcd

    • ubuntu中部署etcd的兩種方式:

      一種是去GitHub下載二進制的安裝包,還有一種是apt-get install etcd,第二種方式我也嘗試過,可能是我軟件源的問題,版本有點老,所以我就換成了使用第一種方式,而且也比較推薦使用第一種方式。

    • 我用的etcd下載的版本是3.5.2,廢話不多說直接看步驟:

      1、將etcd etcdctl etcdutl 二進制文件拷貝到/usr/local/bin目錄下

      /usr/local/bin
      

      2、創建一個etcd的etcd.conf.yml,將下面代碼拷貝進去,我這裡etcd就簡單的配置了一下,沒有做集群,所以yml很簡單。

      name: etcd-1
      data-dir: /home/etcd/data
      listen-client-urls: //0.0.0.0:2379
      advertise-client-urls: //0.0.0.0:2379
      

      3、通過etcd –config-file etcd.conf.yml的路徑運行,如下圖就是成功了,也可以使用etcd manager客戶端來測試。

      4、如果使用etcd直接啟動的話沒有辦法後台運行,所以我們需要在/etc/systemd/system目錄下創建一個etcd.service來進行後台運行。

      [Unit]
      Description=ETCD Server
      Documentation=//github.com/coreos/etcd
      After=network-online.target
      Wants=network-online.target
      
      [Service]
      User=root
      Group=root
      ExecStart= etcd --config-file /home/etcd/etcd.conf.yml
      
      [Install]
      WantedBy=multi-user.target
      

      5、創建好之後可以通過以下命令來確定運行狀態如下圖:

      # 啟動
      sudo systemctl start etcd.service
      # 查看狀態
      sudo systemctl status etcd.service
      # 開機自啟
      sudo systemctl enable etcd.service
      


      6、設置用戶名和密碼

      # 設置版本為V3
      export ETCDCTL_API=3
      # 添加用戶
      etcdctl user add root
      # 開啟認證
      etcdctl auth enable
      

K8S部署apisix

apisix-gateway在部署的時候分為兩塊,分別是apisix和apisix-dashboard面板,所以看起來比較繞,不過apisix在部署的時候使用的是yaml文件覆蓋的方式,所以我這裡是將yaml存儲到configmap中了,方便進行統一管理。我使用的k8s是Ubuntu出品的microk8s,用它的主要原因是因為配置簡單。

  • apisix是服務端,用來進行網絡請求轉發。
  • apisix-dashboard是他的控制面板,用來進行可視化配置。
    • apisix介紹

      apisix是基於 OpenResty + etcd 實現的雲原生、高性能、可擴展的微服務 API 網關。它是國人開源,目前已經進入 Apache 進行孵化。APISIX 通過插件機制,提供了動態負載平衡、身份驗證、限流限速等等功能,當然我們也可以自己開發插件進行拓展。

      • 動態負載均衡:跨多個上游服務的動態負載均衡,目前已支持 round-robin 輪詢和一致性哈希算法。
      • 身份驗證:支持 key-auth、JWT、basic-auth、wolf-rbac 等多種認證方式。
      • 限流限速:可以基於速率、請求數、並發等維度限制。
    • 部署apisix

      1、創建apisix.conf.yaml,並存儲到configmap中,

      apisix:
      node_listen: 9080              # APISIX listening port
      enable_ipv6: false
      
      allow_admin:                  # //nginx.org/en/docs/http/ngx_http_access_module.html#allow
          - 0.0.0.0/0              # We need to restrict ip access rules for security. 0.0.0.0/0 is for test.
      
      admin_key:
      - name: "admin"
          key: edd1c9f034335f136f87ad84b625c8f1
          role: admin                 # admin: manage all configuration data
                                      # viewer: only can view configuration data
      - name: "viewer"
          key: 4054f7cf07e344346cd3f287985e76a2
          role: viewer
      
      enable_control: true
      control:
          ip: "0.0.0.0"
          port: 9092
      
      
      
      etcd:
      host:          # supports defining multiple etcd host addresses for an etcd cluster
          - "//192.168.31.170:2379"
      user: "root"    # ignore etcd username if not enable etcd auth
      password: "root"  # ignore etcd password if not enable etcd auth
      
      discovery:
      nacos:
          host:
          - "//47.100.213.49:8848"
          prefix: "/nacos/v1/"
          fetch_interval: 30    # default 30 sec
          weight: 100           # default 100
          timeout:
          connect: 2000       # default 2000 ms
          send: 2000          # default 2000 ms
          read: 5000          # default 5000 ms
      
      
      plugin_attr:
      prometheus:
          export_addr:
          ip: "0.0.0.0"
          port: 9091
      
      plugins:
      - client-control
      - ext-plugin-pre-req
      - zipkin
      - request-id
      - fault-injection
      - serverless-pre-function
      - batch-requests
      - cors
      - ip-restriction
      - ua-restriction
      - referer-restriction
      - uri-blocker
      - request-validation
      - openid-connect
      - wolf-rbac
      - hmac-auth
      - basic-auth
      - jwt-auth
      - key-auth
      - consumer-restriction
      - authz-keycloak
      - proxy-mirror
      - proxy-cache
      - proxy-rewrite
      - api-breaker
      - limit-conn
      - limit-count
      - limit-req
      - gzip
      - server-info
      - traffic-split
      - redirect
      - response-rewrite
      - grpc-transcode
      - prometheus
      - echo
      - http-logger
      - sls-logger
      - tcp-logger
      - kafka-logger
      - syslog
      - udp-logger
      - serverless-post-function
      - ext-plugin-post-req
      
      stream_plugins:
      - ip-restriction
      - limit-conn
      - mqtt-proxy
      

      2、使用kubectl命令創建configmap

      kubectl create configmap sukt-apisix-gateway-config --from-file=config.yaml=/home/sukt-platform/apisix/apisix-gateway-config.yaml -n sukt-platform
      

      3、新建apisix-deployment.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: sukt-apisix-gateway
      namespace: sukt-platform
      spec:
      selector:
          matchLabels:
          app: sukt-apisix-gateway
      template:
          metadata:
          labels:
              app: sukt-apisix-gateway
          spec:
          containers:
          - name: sukt-apisix-gateway
              image: apache/apisix:2.10.3-alpine
              imagePullPolicy: IfNotPresent
              resources:
              limits:
                  cpu: 500m
                  memory: 1Gi
              requests:
                  cpu: 250m
                  memory: 256Mi
              securityContext:
              privileged: false
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
              - mountPath: /usr/local/apisix/conf/config.yaml
              name: config
              subPath: config.yaml
              ports:
              - containerPort: 9080
              - containerPort: 9443
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
              - configMap:
                  defaultMode: 420
                  name: sukt-apisix-gateway-config
              name: config
      
      

      4、新建apisix-service.yaml

      apiVersion: v1
      kind: Service
      metadata:
      name: sukt-apisix-gateway-nodetype
      labels:
          app: sukt-apisix-gateway-nodetype
      namespace: sukt-platform
      spec:
      type: NodePort
      selector:
          app: sukt-apisix-gateway
      ports:
      - port: 9080
          name: transfer1
          targetPort: 9080
          nodePort: 30107
      - port: 9443
          name: transfer2
          targetPort: 9443
          nodePort: 30108
      
      
    • 部署apisix-dashboard

      1、創建apisix-dashboard-config.yaml,並存儲到configmap中,

      #
      # Licensed to the Apache Software Foundation (ASF) under one or more
      # contributor license agreements.  See the NOTICE file distributed with
      # this work for additional information regarding copyright ownership.
      # The ASF licenses this file to You under the Apache License, Version 2.0
      # (the "License"); you may not use this file except in compliance with
      # the License.  You may obtain a copy of the License at
      #
      #     //www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      #
      
      conf:
      listen:
          host: 0.0.0.0     # `manager api` listening ip or host name
          port: 9000          # `manager api` listening port
      allow_list:           # If we don't set any IP list, then any IP access is allowed by default.
          - 0.0.0.0/0
      etcd:
          endpoints:          # supports defining multiple etcd host addresses for an etcd cluster
          - "//192.168.31.170:2379"
                              # yamllint disable rule:comments-indentation
                              # etcd basic auth info
          username: "root"    # ignore etcd username if not enable etcd auth
          password: "root"  # ignore etcd password if not enable etcd auth
          mtls:
          key_file: ""          # Path of your self-signed client side key
          cert_file: ""         # Path of your self-signed client side cert
          ca_file: ""           # Path of your self-signed ca cert, the CA is used to sign callers' certificates
          # prefix: /apisix     # apisix config's prefix in etcd, /apisix by default
      log:
          error_log:
          level: warn       # supports levels, lower to higher: debug, info, warn, error, panic, fatal
          file_path:
              logs/error.log  # supports relative path, absolute path, standard output
                              # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
          access_log:
          file_path:
              logs/access.log  # supports relative path, absolute path, standard output
                              # such as: logs/access.log, /tmp/logs/access.log, /dev/stdout, /dev/stderr
                              # log example: 2020-12-09T16:38:09.039+0800	INFO	filter/logging.go:46	/apisix/admin/routes/r1	{"status": 401, "host": "127.0.0.1:9000", "query": "asdfsafd=adf&a=a", "requestId": "3d50ecb8-758c-46d1-af5b-cd9d1c820156", "latency": 0, "remoteIP": "127.0.0.1", "method": "PUT", "errs": []}
      authentication:
      secret:
          secret              # secret for jwt token generation.
                              # NOTE: Highly recommended to modify this value to protect `manager api`.
                              # if it's default value, when `manager api` start, it will generate a random string to replace it.
      expire_time: 3600     # jwt token expire time, in second
      users:                # yamllint enable rule:comments-indentation
          - username: admin   # username and password for login `manager api`
          password: P@ssW0rd
          - username: user
          password: P@ssW0rd
      
      plugins:                          # plugin list (sorted in alphabetical order)
      - api-breaker
      - authz-keycloak
      - basic-auth
      - batch-requests
      - consumer-restriction
      - cors
      # - dubbo-proxy
      - echo
      # - error-log-logger
      # - example-plugin
      - fault-injection
      - grpc-transcode
      - hmac-auth
      - http-logger
      - ip-restriction
      - jwt-auth
      - kafka-logger
      - key-auth
      - limit-conn
      - limit-count
      - limit-req
      # - log-rotate
      # - node-status
      - openid-connect
      - prometheus
      - proxy-cache
      - proxy-mirror
      - proxy-rewrite
      - redirect
      - referer-restriction
      - request-id
      - request-validation
      - response-rewrite
      - serverless-post-function
      - serverless-pre-function
      # - skywalking
      - sls-logger
      - syslog
      - tcp-logger
      - udp-logger
      - uri-blocker
      - wolf-rbac
      - zipkin
      - server-info
      - traffic-split
      

      2、使用kubectl命令創建configmap

      kubectl create configmap sukt-apisix-dashboard-config --from-file=config.yaml=/home/sukt-platform/apisix/apisix-dashboard-config.yaml -n sukt-platform
      

      3、新建apisix-dashboard-deployment.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: sukt-apisix-dashboard
      namespace: sukt-platform
      spec:
      selector:
          matchLabels:
          app: sukt-apisix-dashboard
      template:
          metadata:
          labels:
              app: sukt-apisix-dashboard
          spec:
          nodeName: microk8sslave1 # 部署到指定的node節點
          containers:
          - name: sukt-apisix-dashboard
              image: apache/apisix-dashboard:2.10.1-alpine
              imagePullPolicy: IfNotPresent
              resources:
              limits:
                  cpu: 500m
                  memory: 1Gi
              requests:
                  cpu: 250m
                  memory: 256Mi
              securityContext:
              privileged: false
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
              - mountPath: /usr/local/apisix-dashboard/conf/conf.yaml
              name: config
              subPath: config.yaml #這個位置對應的是comfigmap中的名字,不是 /usr/local/apisix-dashboard/conf/conf.yaml
              ports:
              - containerPort: 9000
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
              - configMap:
                  defaultMode: 420
                  name: sukt-apisix-dashboard-config
              name: config
      
      

      4、新建apisix-dashboard-service.yaml

      apiVersion: v1
      kind: Service
      metadata:
      name: sukt-apisix-dashboard-nodetype
      labels:
          app: sukt-apisix-dashboard-nodetype
      namespace: sukt-platform
      spec:
      type: NodePort
      selector:
          app: sukt-apisix-dashboard
      ports:
      - port: 9000
          name: transfer1
          targetPort: 9000
          nodePort: 30109
      
    • 運行效果圖

      可以通過dashboard面板的系統信息查看apisix-gateway的運行信息

結語

apisix-gateway文章分為兩篇,本篇只是講解了如何在k8s中安裝以及啟動,下一章講解如何進行轉發以及其他功能測試等。