Docker

kong与kubernetes集成(ingress)

2018-12-10  本文已影响74人  GoddyWu

Reference

之前设想kong和k8s结合使用https://docs.konghq.com/install/kubernetes/?_ga=2.265164879.1330610937.1543828237-1627235705.1540276193 中的Kong via Manifest Files方案,对应仓库https://github.com/Kong/kong-dist-kubernetes,即

  • kubectl create -f postgres.yaml
  • kubectl create -f kong_migration_postgres.yaml
  • kubectl delete -f kong_migration_postgres.yaml
  • kubectl create -f kong_postgres.yaml

    但是公司大牛调研后推荐Kubernetes Ingress Controller for Kong的方案,那么我们来看下。

本文涉及的技术:

实践

helm 安装kong

(helm 是kubernetes的包管理器,这里不再赘述。)

$ helm search kong
$ helm fetch stable/kong
这时已下载kong的charts文件到本地,因为我们只会更改它的values.yml文件,所以拷贝一份出来,目录结构类似:

对于kubernetes ingress来说,ingress controller是核心,这里我们配置ingressController的enabled为true。
kong会暴露两组端口至外部,一个是admin api(这里为admin), 另一个是resource api(这里为proxy)。因为我们需要使用oauth插件, kong的oauth endpoint必须为https,所以proxy需要使用https,admin可以改为http方便使用。

# helm启动
$ helm install --name my-kong kong --namespace kong --values values.yaml 

# helm更新(较慢,需要等kong ns下的kong-upgrade-migrations执行完毕)
$ helm upgrade my-kong kong -f values.yaml

# 永久删除
$ helm delete my-kong --purge

配置resource 服务

这里给一个简单示例

kind: Service
apiVersion: v1
metadata:
  name: python-service
  # annotations:
    # plugins.konghq.com: rl-by-ip
spec:
  # type: NodePort
  selector:
    app: python
  ports:
    - protocol: TCP
      port: 5000
      # targetPort: 80
      # nodePort: 31203
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: python-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: python
  template:
    metadata:
      labels:
        app: python
    spec:
      containers:
      - name: python-controller
        image: godbaby/kong-python:1.0
        ports:
        - containerPort: 5000
        #volumeMounts:
       # - mountPath: /code/app.py
          #name: python-volume
      #volumes:
      #- name: python-volume
        #hostPath:
          #path: /Users/goddy/test/kong/docker/resource.py
        # readinessProbe:
        #   httpGet:
        #     path: /debug/version
        #     port: 80
        #   initialDelaySeconds: 5
        #   periodSeconds: 10
        #   successThreshold: 5
        # resources:
        #   requests:
        #     memory: "400Mi"
        #     cpu: "100m"
        #   limits:
        #     memory: "800Mi"
        #     cpu: "200m"
---

这里注释的为了方便调试和记住这些配置项,可以忽略。
注意这里未使用nodePort的方式暴露端口,而是使用clusterIP的方式,来达到kong作为唯一集群外的访问终端。

配置KongIngress

Ingress是kubernetes已定义好的资源。
KongIngress是helm已经帮我们定义好的kubernetes 自定义资源,作为Ingress的额外配置,而且它必须创建于Ingress上(即metadata一致)。

apiVersion: configuration.konghq.com/v1
kind: KongIngress
metadata:
  name: tls-example-ingress
proxy:
  path: /
route:
  strip_path: true
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-example-ingress
  # annotations:
    # plugins.konghq.com: rl-by-ip
    # plugins.konghq.com: oauth
    # ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: test 
      http:
        paths:
        - path: /te
          backend:
            serviceName: python-service
            servicePort: 5000
        # - path: /2
        #   backend:
        #     serviceName: python-service
        #     servicePort: 5000
    # - host: dashboard
    #   http:
    #     paths:
    #     - path: /
    #       backend:
    #         serviceName: kong-dashboard
    #         servicePort: 8080

示例中的strip path就是一种常见的需求。

kong dashboard

因为kong-kubernetes ingress的方案提倡声明式的资源,所以GUI其实没啥用。而且目前版本的kong是不可以使用admin api创建数据的。

---
apiVersion: v1
kind: Service
metadata:
  name: kong-dashboard
  namespace: kong
spec:
  # type: NodePort
  selector:
    app: dashboard
  ports:
  - port: 8080
    protocol: TCP
---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kong-dashboard
  namespace: kong
spec:
  template:
    metadata:
      labels:
        name: dashboard
        app: dashboard
    spec:
      containers:
      - name: kong-dashboard
        args:
        - start
        - --kong-url http://bot-gateway-kong-admin:8444
        # - --basic-auth admin=admin
        image: pgbi/kong-dashboard:latest
        ports:
        - containerPort: 8080

对于oauth插件来说,还需要创建以下资源

开启插件

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: oauth
config:
  scopes: read,write
  mandatory_scope: true
  enable_password_grant: true
  global_credentials: true
  provision_key: frh1REQndMbcEVuO1DV4EpWtR7Wnmfac
plugin: oauth2

config的选项和kong官网的一致,这里不赘述。
多个Ingress可以声明同一个KongPlugin,理论上kong不支持单服务使用同一个插件,这里kubernetes的方案会自动帮我们创建多个一致的插件到不同服务,只是我们看起来它们同时使用一个kong的oauth插件。

创建consumer

apiVersion: configuration.konghq.com/v1
kind: KongConsumer
metadata:
  name: team-a
username: goddy
---
apiVersion: configuration.konghq.com/v1
kind: KongCredential
metadata:
  name: credential-a
consumerRef: team-a
type: oauth2
config:
  name: goddy
  client_id: kvcKEfrBn402kZkblQgRwe4j3Fv3A7GH
  client_secret: 3ZwsnUIon3VWafhn39kjJ2iSFT75lFJf
  redirect_uri: http://www.baidu.com

backend服务

参照https://www.jianshu.com/p/4ddb916d3195方案中的code repo。


还有一些调研的资料,也分享给大家

资料:

上一篇下一篇

猜你喜欢

热点阅读