作者归档:小笨孩

在 Kubernetes 上安装 Kong 和 Kong Enterprise

Kubernetes Ingress Controller for Kong

使用官方Kubernetes Ingress控制器安装Kong或Kong Enterprise。

通过README文件了解更多信息。要运行本地概念证明,请按照Minikube和Minishift教程进行操作。

Kubernetes Ingress Controller for Kong发布公告在Kong Blog上。

如有问题和讨论,请访问Kong Nation。 有关错误报告,请在GitHub上打开一个新问题

通过 Google Cloud Platform Marketplace 安装 Kong

也许在Kubernetes上尝试Kong的最快方法是通过Google Cloud Platform Marketplace和Google Kubernetes Engine - 以及Google Cloud Platform的Free Tier 和 credit,,您可以免费使用。

  1. 访问 https://console.cloud.google.com/marketplace/details/kong/kong
  2. 单击“Configure”,然后按照屏幕上的提示进行操作
  3. 有关公开Admin API的重要详细信息,请参阅https://github.com/Kong/google-marketplace-kong-app/blob/master/README.md,以便您可以配置Kong。

如果您只是在尝试使用,请考虑在完成实验后删除Google云资源,以避免持续使用Google Cloud使用费。

通过 Helm 安装 Kong

使用官方Helm chart 安装Kong或Kong Enterprise。

如有问题和讨论,请访问 Kong Nation

通过 Manifest 文件安装 Kong

可以通过Kong Kubernetes存储库中提供的清单文件在Kubernetes集群上配置Kong或Kong Enterprise的试用版。

准备

  1. 下载或克隆Kong Kubernetes存储库
  2. 一个Kubernetes集群

安装步骤

Kong Kubernetes存储库包括 Make tasks run_cassandrarun_postgresrun_dbless 以便于使用,但我们将详细说明任务在此处使用的特定YAML文件。

对于所有变体,创建Kong命名空间:

$ kubectl apply -f kong-namespace.yaml

下一步取决于您是否要使用Kong与Cassandra,Postgres或没有数据存储区:

Cassandra Backed Kong

使用此存储库中的cassandra-service.yamlcassandra-statefulset.yaml文件在集群中部署Cassandra服务和StatefulSet

$ kubectl apply -f cassandra-service.yaml
$ kubectl apply -f cassandra-statefulset.yaml

使用此存储库中的kong-control-plane-cassandra.yaml文件运行所需的迁移并部署Kong控制平面节点,包括Kong admin api

$ kubectl -n kong apply -f kong-control-plane-cassandra.yaml

使用此存储库中的kong-ingress-data-plane-cassandra.yaml文件运行Kong数据平面节点

$ kubectl -n kong apply -f kong-ingress-data-plane-cassandra.yaml

PostgreSQL Backed Kong

使用存储库中的postgres.yaml文件在集群中部署postgreSQL服务和ReplicationController

$ kubectl create -f postgres.yaml

使用此存储库中的kong-control-plane-postgres.yaml文件运行所需的迁移并部署Kong控制平面节点,包括Kong Admin API:

$ kubectl -n kong apply -f kong-control-plane-postgres.yaml

使用此存储库中的kong-ingress-data-plane-postgres.yaml文件运行Kong数据平面节点

$ kubectl -n kong apply -f kong-ingress-data-plane-postgres.yaml

Using Datastore Backed Kong

首先,让我们确保Kong控制平面和数据平面成功运行

kubectl get all -n kong
NAME                           READY   STATUS
pod/kong-control-plane         1/1     Running
pod/kong-ingress-data-plane    1/1     Running

访问Kong Admin API端口(如果运行minikube,则以下内容应该有效):

$ export HOST=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
$ export ADMIN_PORT=$(kubectl get svc --namespace kong kong-control-plane  -o jsonpath='{.spec.ports[0].nodePort}')

Using Kong without a Database

对于declarative / db-less,使用此存储库中的declarative.yaml示例文件创建配置映射

$ kubectl create configmap kongdeclarative -n kong --from-file=declarative.yaml

现在使用此存储库中的kong-dbless.yaml文件部署Kong数据平面

$ kubectl apply -f kong-dbless.yaml

Using Declarative / DB Less Backed Kong

要更新declarative / db-less Kong,请编辑声明性文件,然后替换配置映射

$ kubectl create configmap kongdeclarative -n kong --from-file=declarative.yaml -o yaml --dry-run | kubectl replace -n kong -f -

现在使用声明性Kong yaml文件的md5sum进行滚动部署

$ kubectl patch deployment kong-dbless -n kong -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"declarative\":\"`md5sum declarative.yaml | awk '{ print $$1 }'`\"}}}}}}"

访问Kong Admin API端口(如果运行minikube,则以下内容应该有效):

$ export HOST=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')=
$ export ADMIN_PORT=$(kubectl get svc --namespace kong kong-control-plane  -o jsonpath='{.spec.ports[0].nodePort}')

Kong Enterprise 试用用户的附加步骤

  1. 将Kong Enterprise Docker映像发布到容器注册表

    由于Kong Enterprise映像在公共Docker容器注册表中不可用,因此必须将其发布到私有存储库以与Kubernetes一起使用。虽然任何私有存储库都可以使用,但此示例使用Google Cloud Platform容器注册表,该注册表在其他步骤中自动与Google Cloud Platform示例集成。

    在下面的步骤中,将 <image ID> 替换为与docker images输出中已加载图像关联的ID。将 <project ID> 替换为您的Google Cloud Platform项目ID。

      $ docker load -i /tmp/kong-docker-enterprise-edition.tar.gz
      $ docker images
      $ docker tag <image ID> gcr.io/<project ID>/kong-ee
      $ gcloud docker -- push gcr.io/demo-cs-lab/kong-ee:latest
    
  2. 添加您的Kong Enterprise许可文件

    编辑kong_trial_postgres.yamlkong_trial_migration_postgres.yaml,将YOUR_LICENSE_HERE替换为您的Kong Enterprise License File字符串 – 它应如下所示:

      - name: KONG_LICENSE_DATA
      value: '{"license":{"signature":"alongstringofcharacters","payload":{"customer":"Test Company","license_creation_date":"2018-03-06","product_subscription":"Kong Only","admin_seats":"5","support_plan":"Premier","license_expiration_date":"2018-06-04","license_key":"anotherstringofcharacters"},"version":1}}'
    
  3. 使用Kong Enterprise图像

    编辑kong_trial_postgres.yamlkong_trial_migration_postgres.yaml并将image:kong替换为image:gcr.io/<project ID> / kong-ee,使用与上面相同的项目ID。

  4. 部署Kong Enterprise

    使用Kong Enterprise Trial目录中的kong_trial_* YAML文件,从上面的Manifest Files指令继续执行Kong或Kong Enterprise中的步骤4。 一旦Kong Enterprise运行,您应该能够通过<kong-admin-ip-address>:8002https:// <kong-ssl-admin-ip-address>:8445访问Kong Admin GUI。

 

Kong 无法使用 lua-openssl

目前在写一个kong的插件的时候想要使用一下 lua-openssl 的ecc加密功能,ecc是一个相对较新的加密算法(椭圆加密算法)。

lua-openssl 的项目地址为:https://github.com/zhaozg/lua-openssl 然后按照文档中的步骤,先安装:

luarocks install openssl

然后直接根据 https://github.com/zhaozg/lua-openssl/blob/master/test/ec.lua 中的例子来使用:

local openssl = require "openssl"
local pkey = require "openssl.pkey"

local nec = {'ec',"prime256v1"}
local ec = pkey.new(unpack(nec))
local k1 = pkey.get_public(ec)
print(k1)

执行然后发现报错:

/usr/local/share/lua/5.1/kong/plugins/init/handler.lua:33: bad argument #2 to 'new' (invalid option 'prime256v1')

发现这个是不支持这个算法,但是不对啊,分明已经按照文档上的来了为什么不可以,然后就怀疑,问题出在local openssl = require "openssl"这个上面。然后一顿google发现,原因是kong里面也有自带一个类似的项目,叫做 luaossl,然而,他们的包名称都叫做openssl,所以其实虽然我以为我引用了的是lua-openssl这个项目,但其实使用的还是kong自带的 luaossl(项目地址:https://github.com/wahern/luaossl) 。但是 luaossl 暂时还没有支持ecc这个比较新的算法,这个功能就用不了。

真相大白,原来是资源包名称相同导致的。详情可点击此链接:https://github.com/zhaozg/lua-openssl/issues/72 。目前暂时还没有很好的解决方案,lua-openssl的作者说联系 luaossl 商量改名的事宜,但暂还没有下文。

那么最后的解决方案就是先在lua中调用系统命令生成ecc相关密钥。

如何在 Kong 和 OpenResty 中使用环境变量 os.getenv()

在项目中有时会遇到使用系统环境变量的问题,但是直接使用 os.getenv() 是不可行的,不仅是在 Kong 中,在 OpenResty 也都是不可以的,原因是 Kong 是基于 OpenResty ,OpenResty 是基于 Nginx 的,而Nginx在启动的时候,会把环境中所有的环境变量都清除掉,我们可以从Nginx的官方文档中看到这段描述:http://nginx.org/en/docs/ngx_core_module.html#env 

By default, nginx removes all environment variables inherited from its parent process except the TZ variable.

具体可以参考春哥在这个issue下的回复:https://github.com/openresty/lua-nginx-module/issues/601

所以需要在你的nginx.conf文件中把你需要的环境变量声明一下:

events{
  ...
}

env PATH;
env USERNAME;

然后重启一下Nginx,就可以直接在你的 Lua 代码中使用 os.getenv("USERNAME") 获取环境变量。

在 Kong 中使用 os.getenv()

那如果我想在kong的插件中是使用os.getenv()要怎么操作呢?

在 Kong 里面,我们看到Kong生成的 Nginx配置文件是不可修改的,即使你修改了,Kong 还是会生成恢复成修改前,那么这个时候就要用到 Kong 的一个自定义 Nginx 配置文件功能。详情可以看这俩issue:

那么实际操作起来就很简单了,新建一个custom-nginx.conf文件,里面和上文一样,把你需要使用到的环境变量写到这个配置文件中。

events{
  ...
}

env PATH;
env USERNAME;

接着重启 Kong 即可。不过这里要注意的是,重启的时候,需要带上一个参数--nginx-conf。不过不要搞错的是-c参数是kong的配置文件参数,--nginx-conf 是自定义Nginx模板配置参数

 kong restart -c kong.conf --nginx-conf custom-nginx.conf

重启成功之后,就可以在 Kong 的插件中使用代码中使用 os.getenv("USERNAME") 来获取环境变量了。

在 Ubuntu 上安装 Kong

安装包

首先下载配置的相应软件包:

企业试用用户应从其欢迎电子邮件中下载其包,并在步骤1之后将其许可保存到/etc/kong/license.json

APT存储库

您也可以通过APT安装Kong; 按照下面页面上“Set Me Up”部分的说明,将分布设置为适当的值(lsb_release -sc)(例如,precise)和组件到main

安装

  1. 安装Kong 如果要下载程序包,请执行:
      $ sudo apt-get update
      $ sudo apt-get install openssl libpcre3 procps perl
      $ sudo dpkg -i kong-1.3.0.*.deb
    

    如果您正在使用apt存储库执行:

      $ sudo apt-get update
      $ sudo apt-get install -y apt-transport-https curl lsb-core
      $ echo "deb https://kong.bintray.com/kong-deb `lsb_release -sc` main" | sudo tee -a /etc/apt/sources.list
      $ curl -o bintray.key https://bintray.com/user/downloadSubjectPublicKey?username=bintray
      $ sudo apt-key add bintray.key
      $ sudo apt-get update
      $ sudo apt-get install -y kong
    
  2. 准备数据库或声明性配置文件无论是否有数据库,Kong都可以运行。

    使用数据库时,您将使用 kong.conf 配置文件在启动时设置Kong的配置属性,并将数据库用作所有已配置实体的存储,例如Kong代理所在的 Routes 和 Services 。

    不使用数据库时,您将使用kong.conf的配置属性和kong.yml文件来将实体指定为声明性配置。

    使用数据库

    配置Kong以便它可以连接到您的数据库。Kong支持PostgreSQL 9.5+Cassandra 3.x.x作为其数据存储。

    如果您使用Postgres,请在开始Kong之前配置数据库和用户,即:

     CREATE USER kong; CREATE DATABASE kong OWNER kong;
    
    然后执行Kong的数据迁移:
    
      $ kong migrations bootstrap [-c /path/to/kong.conf]
    

    对于Kong 小于0.15的注意事项:如果Kong版本低于0.15(最高0.14),请使用up子命令而不是bootstrap。另请注意,如果Kong 小于0.15,则不应同时进行迁移;只有一个Kong节点应该一次执行迁移。对于0.15,1.0及以上的Kong,此限制被取消。

    不使用数据库

    如果要在无DB模式下运行Kong,则应首先生成声明性配置文件。以下命令将在当前文件夹中生成kong.yml文件。它包含有关如何填写它的说明。

     $ kong config init
    

    填写kong.yml文件后,编辑您的kong.conf文件。将数据库选项设置为off,将declarative_config选项设置为kong.yml文件的路径:

     database = off
      declarative_config = /path/to/kong.yml
    
  3. 启动Kong
     $ kong start [-c /path/to/kong.conf]
    
  4. 使用KongKong正在运行
      $ curl -i http://localhost:8001/

使用 Docker 安装 Kong

有关如何在Docker中使用Kong的详细信息可以在镜像图像的DockerHub存储库中找到:kong。 我们还有一个Docker Compose template,内置编排和可扩展性。

使用数据库

这是一个快速示例,显示如何将Kong容器连接到Cassandra或PostgreSQL容器。

  1. 创建一个Docker network

    您需要创建一个自定义网络,以允许容器相互发现和通信。在此示例中,kong-net是网络名称,您可以使用任何名称。

     $ docker network create kong-net
    
  2. 启动数据库

    如果您想使用Cassandra容器:

      $ docker run -d --name kong-database \
                --network=kong-net \
                -p 9042:9042 \
                cassandra:3
    

    如果您想使用PostgreSQL容器:

      $ docker run -d --name kong-database \
                --network=kong-net \
                -p 5432:5432 \
                -e "POSTGRES_USER=kong" \
                -e "POSTGRES_DB=kong" \
                postgres:9.6
    
  3. 准备数据库

    使用临时Kong容器运行迁移:

      $ docker run --rm \
      --network=kong-net \
      -e "KONG_DATABASE=postgres" \
      -e "KONG_PG_HOST=kong-database" \
      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
      kong:latest kong migrations bootstrap
    

    在上面的示例中,配置了Cassandra和PostgreSQL,但您应该使用cassandrapostgres更新KONG_DATABASE环境变量。
    对于Kong 小于0.15的注意事项:如果Kong版本低于0.15(最高0.14),请使用up子命令而不是bootstrap。另请注意,如果Kong 版本小于0.15,则不应同时进行迁移;只有一个Kong节点应该一次执行迁移。对于0.15,1.0及以上的Kong,此限制被取消。

  4. 启动Kong

    迁移运行并且数据库准备就绪后,启动一个将连接到数据库容器的Kong容器,就像临时迁移容器一样:

      $ docker run -d --name kong \
      --network=kong-net \
      -e "KONG_DATABASE=postgres" \
      -e "KONG_PG_HOST=kong-database" \
      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
      -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
      -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
      -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
      -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
      -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
      -p 8000:8000 \
      -p 8443:8443 \
      -p 8001:8001 \
      -p 8444:8444 \
      kong:latest
    
  5. 使用Kong

    Kong正在运行:

      $ curl -i http://localhost:8001/
    

    通过5分钟的快速入门快速学习如何使用Kong。

无数据库模式

在无DB模式下启动Kong所涉及的步骤如下:

  1. 创建一个Docker network

    这与Pg / Cassandra指南中的相同。我们也使用kong-net作为网络名称,它也可以改为其他东西。

      $ docker network create kong-net
    

    在无DB模式下运行Kong并不严格需要此步骤,但如果您希望将来添加其他内容(如Redis群集备份的速率限制插件),这是一个很好的预防措施。

  2. 创建Docker volume

    对于本指南的目的,Docker卷是主机内的一个文件夹,可以将其映射到容器中的文件夹中。卷有一个名称。在这种情况下,我们将命名我们的kong-vol

      $ docker volume create kong-vol
    

    您现在应该能够检查volume:

      $ docker volume inspect kong-vol
    

    结果应该类似于:

      [
          {
              "CreatedAt": "2019-05-28T12:40:09Z",
              "Driver": "local",
              "Labels": {},
              "Mountpoint": "/var/lib/docker/volumes/kong-vol/_data",
              "Name": "kong-vol",
              "Options": {},
              "Scope": "local"
          }
      ]
    

    注意MountPoint条目。我们将在下一步中使用该路径。

  3. 准备声明性配置文件

    声明性配置格式指南中描述了语法和属性。

    添加您需要的任何核心实体(服务,路由,插件,消费者等)。

    在本指南中,我们假设您将其命名为kong.yml。

    将其保存在上一步中提到的MountPoint路径中。

    就本指南而言,这将是/var/lib/docker/volumes/kong-vol/_data/kong.yml

  4. 在无DB模式中启动Kong

    虽然可以仅使用KONG_DATABASE=off来启动Kong容器,但通常还需要通过KONG_DECLARATIVE_CONFIG变量名称将声明性配置文件作为参数包含在内。为此,我们需要从容器中使文件“visible”。我们使用-v标志来实现这一点,它将kong-vol卷映射到容器中的/usr/local/kong/declarative文件夹。

      $ docker run -d --name kong \
      --network=kong-net \
      -v "kong-vol:/usr/local/kong/declarative" \
      -e "KONG_DATABASE=off" \
      -e "KONG_DECLARATIVE_CONFIG=/usr/local/kong/declarative/kong.yml" \
      -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
      -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
      -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
      -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
      -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
      -p 8000:8000 \
      -p 8443:8443 \
      -p 8001:8001 \
      -p 8444:8444 \
      kong:latest
    
  5. 使用Kong

    Kong应该正在运行,它应该包含一些以Kong .yml添加的实体。

      $ curl -i http://localhost:8001/
    

    例如,获取服务列表:

      $ curl -i http://localhost:8001/services

 

如何成为一个合格的逮虾户

之前在大学的时候由于资金的欠缺,还有抱着那时反正也不会马上买车的理念,就一直没有学驾照,于是乎就一直到了现在,还是一个没有驾照的孩子,但是现在开车也应该算是一个基本技能了,就报了名,以后买了车,可以带着家人一起兜个风啥的,生活半径也会扩大很多。把这次两个半月(2019-5->2019-8)拿到驾照的过程记录一下,如何成为一个逮虾户。

一些准备

需要下载的app:

  • 驾考宝典:科目一和科目四的题目
  • 车学堂:需要刷学时
  • 交管12123:预约科目一到科目四的考试,以及缴考试费

夏天学车:

  • 准备防晒的装备or防晒霜
  • 一双适合的鞋子,底稍微可以感受地面的那种最好

科目一

科目一主要就是看题目,一共一千两百多道题目,下载一个驾考宝典之类的app可以全部做一遍,然后把错题再看一遍,模拟考两次,题目方面的基本就没啥问题了。目前的驾考规定是还需要看视频教程刷学时,也就是下载车学堂app,然后看里面的科目一视频,看够8小时即可。现在可以预约考试了,下载交管12123这个app,然后注册,选择时间,场次,就可以预约了。预约好之后等个几天,收到预约成功的短信,记得再进入交管12131,缴费即可。科目一的考试是可以考两次的,第一次失败了可以再来一次,90分通过,我当时第一把就过了,不要紧张即可。

科目二

科目二一直一来就是驾考的挂科重头戏,这个时候就是需要上车实战了,基本上要学习的重点就是有直角弯,s弯,侧方位停车,倒车入库,和半坡起步。科目二我自己觉得最重要的是控制好离合,不需要踩油门,练习踩离合到能控制离合能平稳通过任何地方,尤其是在需要打方向盘的时候,很容易离合就松的多,离合一旦松的多,车速就容易上去,车速上去就紧张容易压线,甚至撞到东西。所以在准备工作中的鞋子就比较重要,底子别太厚了,可以感受到离合的松紧,前脚掌就可以更容易控制一些。还有就是后视镜,个人体验下来,后视镜的角度非常重要,后视镜跑偏了,即时你看的很准确,但其实还是偏离的很远,容易压线挂科。

  • 直角弯:即时打方向,切勿压线,记得转向灯
  • s弯:就是要注意不能压线,方向盘要随时的调整,不能打了一个方向就不动了
  • 半坡起步:找准位置即时停下
  • 侧方位停车:记得转向灯,按照教练给出的位置精准操作
  • 倒车入库:后视镜要调整准确,按照教练给出的位置精准操作

练习的差不多之后,最重要的是一定要到考场去练习一下,收费的那种,因为平时的练车场是不够完整的,而且每个项目的先后顺序是不一样的。必须去体验一次考场的先后顺序,让教练告诉你需要注意的点在哪,不然直接去开始肯定直接懵逼挂科。我当时去练习了几次,只通过了一次,但是正式考试的时候一把过了。要克服对汽车的恐惧,这一点很重要。

科目三

科目三主要考试的是细节,各种打灯,各种转向,实际上经过了科目三的学习,就基本上算是会开车了。科目三是上路学习和考试,教你在路上如何安全驾驶。驾驶技术类别的主要就是油门,换挡。油门和离合的配合是换挡的最基本操作,这个听从教练,不断的练习即可。剩下的超车,转弯,直线行驶,变道,掉头等等,都是注意细节,特别是注意打灯。打灯是科目三中最常用的操作,一定要熟练。

  • 夜晚灯光模拟:记住特殊的那几个灯的操作,剩下的就是保持原样
  • 超车、变道:注意转向灯
  • 直线行驶:注意方向盘必须保持
  • 换挡:练习顺滑换挡

练习科目三的时候,教练告诉了一次每个点的操作之后,就是不断的练习,克服内心的恐惧,特别是前面的路程只剩下几十米的时候,教练让我不断的换挡到3档,以此来练习换挡的敏捷和熟练度。真正考试的时候,和科目二一样,必须要去考场练习,而且科目三的最重要的地方来了,就是:记路线。要去考场的科目三的场地,去练习每个地方应该怎么拐弯,什么时候选择什么车道等等,要不断的去记路,听教练讲解,有一些考场还有视频,对着视频记路线,路线熟悉了,科目三一大半就算通过了。我当时记熟了路线之后,一把满分通过。

科目四

科目四确切的来说是科目三:安全文明驾驶。也都是做题,不过题目比科目一的简单很多,基本上大部分题目考常识都是可以通过的,刷题的话,主要刷一下多选题即可。直接在app上模拟考个几次,就可以直接去考试了,科目三考完之后打印成绩了之后就可以直接考科目四。科目四考完就可以直接等待拿驾照了。

整个驾照考试下来,感觉就是克服恐惧感,不断的练习,练习的越多越不恐惧,而且在练习中要非常注意细节,等到真正上路了,不能做一个马路杀手,即使是做一个逮虾户,也得是一个安全文明开车的逮虾户。

Kong 1.3发布!支持原生gRPC代理,上游双向TLS认证,以及更多功能

原文地址:https://konghq.com/blog/kong-1-3-released/

今天,我们很高兴地宣布推出Kong 1.3!我们的工程团队和出色的社区为此版本提供了许多功能和改进。基于1.2版本的成功,Kong 1.3是Kong的第一个版本,它本身支持gRPC代理,上游相互TLS身份验证,以及一系列新功能和性能改进。

请阅读以下内容,了解有关Kong 1.3的新功能,改进和修复的更多信息,以及如何利用这些令人兴奋的变化。 请花几分钟时间阅读我们的更新日志以及升级路径以获取更多详细信息。

原生gRPC代理

我们观察到越来越多的用户转向微服务架构,并听到用户表达他们对本机gRPC代理支持的兴趣。Kong 1.3通过支持gRPC本地代理来解决这个问题,为支持gRPC的基础架构带来更多控制和可见性。

主要优点:

  • 简化运营流程。
  • 为gRPC服务添加A / B测试,自动重试和断路,以提高可靠性和正常运行时间。
  • 更多的可观测性
  • 针对gRPC服务的日志记录,分析或Prometheus集成?Kong让你满意。

主要功能:

  • 新协议:Route和Service实体的protocol属性现在可以设置为grpcgrpcs,这对应于通过明文HTTP/2(h2c)的gRPC和通过TLS HTTP/ 2(h2)的gRPC。

上游双向TLS认证

Kong长期以来一直支持与上游服务的TLS连接。 在1.3中,我们添加了对Kong的支持,以提供特定证书,同时与上游握手以提高安全性。

主要优点:

  • 能够使用证书与上游服务握手使得Kong在需要强大的身份验证保证的行业中更加出色,例如金融和医疗保健服务。
  • 安全性更好
  • 通过提供可信证书,上游服务将确定传入请求是由Kong转发的,而不是恶意客户端。
  • 对开发人员更友好
  • 您可以使用Kong将需要相互TLS身份验证的服务转换为与开发人员无关的方法(例如OAuth)。

主要功能:

  • 新配置属性:Service实体具有新字段client_certificate。如果设置,当Kong尝试与服务握手时将使用相应的证书。

Sessions 插件

在Kong 1.3中,我们开放了Sessions插件(之前仅在Kong Enterprise中提供)供所有用户使用。 结合其他身份验证插件,它允许Kong记住之前已经过身份验证的浏览器用户。 您可以在此处阅读详细的文档

NGINX CVE修复

Kong 1.3附带NGINX HTTP/2模块(CVE-2019-9511CVE-2019-9513CVE-2019-9516)的修复程序。 我们还发布了Kong 1.0.4,1.1.3,1.2.2来修补旧版Kong中的漏洞,以防不能立即升级到1.3。

OpenResty Version Bump

OpenResty的版本已经发布到最新的OpenResty版本 - 1.15.8.1,该版本基于Nginx 1.15.8。 此版本的OpenResty在关闭上游keepalive连接,ARM64架构支持和LuaJIT GC64模式时带来了更好的性能。 最引人注目的变化是,由于LuaJIT编译器生成更多本机代码,OpenResty更有效地存储请求上下文数据,因此使用密钥身份验证在基线代理基准测试中,Kong现在运行速度提高约10%。 

Kong 1.3的其他新功能

按任何请求 header 路由

  • Kong的路由器现在能够通过任何请求头(不仅是Host)匹配路由。
  • 这允许对服务之间路由传入流量的方式进行精细控制。
  • 参阅此处的文档

最少连接负载平衡

  • Kong现在可以将流量发送到连接数最少的上游服务。
  • 在某些用例中改善上游负载分配。
  • 参阅此处的文档

数据库导出

  • 新添加的kong config db_export CLI命令可用于创建数据库内容转储到YAML文件中,该文件适用于声明性配置或稍后导回数据库。
  • 这样可以更轻松地创建声明性配置文件。
  • 这使得Kong配置的备份和版本控制变得更加容易
  • 参阅此处的文档

主动关闭上游keepalive连接

  • 在旧版本的Kong中,上游连接永远不会被Kong关闭。这可能导致竞争条件,因为Kong可能会尝试重新使用keepalived连接,而上游尝试关闭它。
  • 如果您在Kong error.log中看到“upstream prematurely closed connection”错误,则此版本应显着减少甚至消除部署中的此错误。
  • 添加了新的配置指令来控制此行为,请阅读完整的更新日志以了解更多信息。

更多的监听标志支持

  • 特别是reuseport标志,如果Kong worker数量很大,可用于改善负载分配和延迟抖动。
  • 还添加了deferredbind标志支持。您可以查看NGINX listen指令文档以了解使用它们的效果。

其他改进和错误修复

Kong 1.3还包含有关存储CA证书(没有私钥的证书),Admin API接口和更多PDK功能的新实体的改进。 我们还修复了很多错误。由于此版本中有大量新功能,因此我们无法在此博客文章中介绍所有这些内容,而是鼓励您在此处阅读完整的更新日志

我们还在kong.conf模板中添加了一个新的部分,以更好地解释注入NGINX指令的功能。 对于具有仅添加几个NGINX指令的自定义模板的用户,我们建议切换使用注入的NGINX指令,以获得更好的可升级性。

与往常一样,Kong 1.3的文档可在此处获得。 此外,如上所述,我们将在后续帖子和社区电话中讨论1.3中的主要功能,敬请期待!

感谢我们的用户,贡献者和核心维护者社区,感谢您对Kong的开源平台的持续支持。 请试试Kong 1.3,一定要告诉我们您的想法

Kong社区

像往常一样,随时可以就我们的社区论坛Kong Nation提出任何问题。 从您的反馈中学习将使我们能够更好地理解任务关键用例并不断改进Kong。

Go 语言 Web 框架 Revel 安装以及使用 GORM 操作 MySQL

Revel是一个高生产力的 Go 语言 Web 框架。框架源于java的 Play,文件结构是经典的MVC结构,比较清晰,是现在go语言中比较流行的web框架之一。

GORM 是一个Golang写的,开发人员友好的ORM库。可以简单直观的对 Mysql,Redis等等一些流行的数据库进行操作。

最近项目中需要一个集中处理id的功能,刚好准备尝试一下使用go,架构师推荐了这个框架,那么就来结合一下GORM做一个小小的使用入门。当然在revel的官方项目中,也给了一个例子:https://github.com/revel/examples/tree/master/orm/gorm

安装revel

假定这里你已经成功安装了go,并且已经配置好了 GOROOT 和 GOPATH,GOROOT是go语言编译、工具、标准库等的安装路径,GOPATH是go的工作目录,你的项目都是在这个目录下面。

安装框架

执行如下命令安装revel框架:

$ go get -u -v github.com/revel/cmd/revel

然后可以新建一个revel项目看看是否安装成功:

$ revel new myapp

如果提示revel命令找不到,可以找到revel的安装目录放到环境变量中再执行。

运行项目:

revel run myapp

打开浏览器访问

 http://localhost:9000

it works,代表安装运行成功。

revel new myapp 命令生成的目录结构如下:

myapp                 项目根目录
├── app               MVC框架目录
│   ├── controllers   控制器目录
│   ├── init.go
│   ├── models        模型目录
│   ├── routes
│   ├── tmp
│   └── views         视图目录
├── conf
│   ├── app.conf      配置文件
│   └── routes        路由文件
├── messages          国际化目录
├── public            静态文件目录
└── tests

安装GROM

安装相关包

安装gorm包:

go get -u -v github.com/jinzhu/gorm

安装mysql驱动包:

go get -u -v github.com/go-sql-driver/mysql

安装

在revel中使用GROM

这里我们使用 https://github.com/revel/examples/tree/master/orm/gorm 官方例子来说明:首先把这个gorm代码拉到工作目录下

配置文件

打开config/app.conf文件,然后修改其中数据库配置:

db.driver=mysql # 数据库类型 : mysql, postgres, sqlite3
db.host=localhost  # Use dbhost  /tmp/gorm.db is your driver is sqlite
db.name=test #数据库名
db.password=root
db.user=root

model 文件说明

在model文件中添加一个user.go文件:

package models

import (
    "github.com/jinzhu/gorm"
    "golang.org/x/crypto/bcrypt"
)

// User model
type User `struct` {
    gorm.Model
    Name           string `gorm:"size:255"`
    Email          string `gorm:"type:varchar(100);unique_index"`
    HashedPassword []byte
    Active         bool
    FileName       string `gorm:"size:255"`
}

// SetNewPassword set a new hashsed password to user
func (user *User) SetNewPassword(passwordString string) {
    bcryptPassword, _ := bcrypt.GenerateFromPassword([]byte(passwordString), bcrypt.DefaultCost)
    user.HashedPassword = bcryptPassword
}

此文件是用来定义表的model,struct结构体中和你的数据表是一一对应的。注意到此model用到了另一个包,需要安装一下:

 go get -u -v golang.org/x/crypto

controller 文件说明

在controllers 中添加一个init.go文件

package controllers

import (
    "github.com/revel/examples/orm/gorm/app/models"
    gorm "github.com/revel/modules/orm/gorm/app"
    "github.com/revel/revel"
)

func initializeDB() {
    gorm.DB.AutoMigrate(&models.User{})
    var firstUser = models.User{Name: "Demo", Email: "demo@demo1.com"}
    firstUser.SetNewPassword("demo")
    firstUser.Active = true
    gorm.DB.Create(&firstUser)
}


func init() {
    revel.OnAppStart(initializeDB)
}

这个文件相当于初始化操作,在请求到controller的时候会执行一下,这里是使用的gorm的一个gorm.DB.AutoMigrate方法,如果没有就创建表。当然,如果不需要的话是可以去掉。

在controllers 中添加一个app.go文件

package controllers

import (
    "github.com/revel/examples/orm/gorm/app/models"
    gormc "github.com/revel/modules/orm/gorm/app/controllers"
    "github.com/revel/revel"
)

type App struct {
    gormc.TxnController
}

func (c App) Index() revel.Result {
    var users = []models.User{}
    c.Txn.Find(&users)
    return c.RenderJSON(users)
}

这里只是列了一个最基本的find操作,更多的操作可以查看 https://jasperxu.github.io/gorm-zh/ grom中文手册。

view 文件说明

这里由于是演示,就不使用页面展示了,在 controller 中使用RenderJSON,直接以json展示。

运行项目:

revel run gorm

然后打开:http://localhost:9000/ 查看数据正常展示,打完收工。

液体乳制品的选择

在公司已经做了有几次分享,基本都是关于技术的,这次在技术分享之后,添加了第二部分,讲的就是关于一些乳制品的选择,之前在微博上看到一个叫做“奶粉揭秘”的博主,然后从他哪里学习了很多关于乳制品的知识,于是算是做了一次科普吧,下面就是分享的第二部分的主要内容。

牛奶选择

  1. 常温奶
  2. 巴氏奶,高温灭菌
  3. 生牛乳(街上卖的那种)不可直接喝,容易感染布鲁氏菌

常温奶和巴氏奶在成分上差别不大,主要差别在于口味,巴氏奶最大保存牛奶风味,口感较好。

纯奶选择标准:

  • 蛋白质>=3.2(国家标准是2.9)
  • 碳水化合物5,不能超过6(碳水就是糖,碳水5基本是乳糖,超过5基本就是游离糖,发胖的那种)
  • 配料表,越简单越好

国产奶推荐:

  • 第一梯队:蒙牛每日鲜语,光明至优,三元极致
  • 第二梯队:光明优倍,晨光供港一号
  • 盒马鲜生的那个每天的牛奶也不错

酸奶选择

  1. “发酵乳”是酸奶
  2. “风味发酵乳”是饮料
  3. 看配料表,含有“白砂糖”的,基本都是高糖
  4. 常温酸奶一般含糖量比较高
  5. 低温酸奶比较健康,必须全冷链,成本较高
  6. 推荐无糖酸奶“光明如实”和“蒙牛简爱”,低温酸奶

选奶十字箴言:低钠高蛋白,低碳又高钙

推荐关注微博:奶粉揭秘

解决在debian 9 中安装 PostgreSQL 9.6 中` No such file or directory`问题

最近的项目中需要在debian 9 中安装 PostgreSQL 9.6 数据库,一般安装就按照常规步骤:

先更新源:

sudo apt-get update
sudo apt upgrade

然后直接安装PostgreSQL:

sudo apt-get install postgresql-9.6

就在安装的时候突然报如下错误并中断:

Setting up postgresql-client-9.6 (9.6.13-0+deb9u1) ...
update-alternatives: using /usr/share/postgresql/9.6/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
update-alternatives: error: error creating symbolic link '/usr/share/man/man1/psql.1.gz.dpkg-tmp': No such file or directory

安装失败,然后发现是一个路径找不到,需要手动创建一下,然后google之后找到了相同问题:

https://github.com/debuerreotype/debuerreotype/issues/10

于是乎采纳一下解决方案,执行如下代码新建一下相关文件夹:

for i in $(seq 1 8); do mkdir -p "/usr/share/man/man${i}"; done

执行完之后可以去/usr/share/man/目录下看一下是不是有8个man文件,执行成功就可以继续安装即可。

微服务 API 网关 Kong 插件 Kubernetes Sidecar 注入插件中文文档

Kubernetes Sidecar 注入插件

该插件将注入Kong数据平面节点并在Kubernetes之上形成服务网格

介绍

Kong 0.15.0 / 1.0.0增加了代理和路由原始tcptls流的能力,并使用服务网格Sidecar模式和Kong节点之间的相互tls来部署Kong。本教程将引导您使用我们的 Kubernetes Sidecar 注入插件在Kubernetes上设置Kong服务网格。

准备条件

您需要在Kubernetes上运行Kong 1.0.0或更高版本,包括存储为可用于Kong控制平面的机密的SSL证书。来自Kong Kubernetes Repository的Make任务run_cassandrarun_postgres将完全配置必备数据存储,Kong控制平面,Kong数据平面和SSL机密。

或者,按照Kong Kubernetes Install Instructions页面中的任何设置说明进行操作,然后设置SSL证书/密码:

cd $(mktemp -d)

### Create a key+certificate for the control plane
cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: kong-control-plane.kong.svc
spec:
  request: $(openssl req -new -nodes -batch -keyout privkey.pem -subj /CN=kong-control-plane.kong.svc | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
kubectl certificate approve kong-control-plane.kong.svc
kubectl -n kong create secret tls kong-control-plane.kong.svc --key=privkey.pem --cert=<(kubectl get csr kong-control-plane.kong.svc -o jsonpath='{.status.certificate}' | base64 --decode)
kubectl delete csr kong-control-plane.kong.svc
rm privkey.pem

或使用以下简便脚本:

curl -fsSL https://raw.githubusercontent.com/Kong/kong-dist-kubernetes/master/setup_certificate.sh | bash

安装步骤

导出一些变量以访问Kong Admin API和Proxy:

$ export HOST=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
$ export ADMIN_PORT=$(kubectl get svc --namespace kong kong-control-plane  -o jsonpath='{.spec.ports[0].nodePort}')

通过Kong Admin API启用Sidecar Injector插件:

curl $HOST:$ADMIN_PORT/plugins -d name=kubernetes-sidecar-injector -d config.image=kong

打开Kubernets Sidecar Injection:

cat <<EOF | kubectl create -f -
apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata:
  name: kong-sidecar-injector
webhooks:
- name: kong.sidecar.injector
  rules:
  - apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
    operations: [ "CREATE" ]
  failurePolicy: Fail
  namespaceSelector:
    matchExpressions:
    - key: kong-sidecar-injection
      operator: NotIn
      values:
      - disabled
  clientConfig:
    service:
      namespace: kong
      name: kong-control-plane
      path: /kubernetes-sidecar-injector
    caBundle: $(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}')
EOF

或使用以下简便脚本:

curl -fsSL https://raw.githubusercontent.com/Kong/kong-dist-kubernetes/master/setup_sidecar_injector.sh | bash

使用

接下来,任何开始使用Kong Sidecar的pods都会自动注入,而来自该pods容器的所有数据都将通过Kong Sidecar。 例如,如果我们使用Istio中的bookinfo.yaml示例:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.1/samples/bookinfo/platform/kube/bookinfo.yaml

我们看到所有pods都收到了Kong Sidecar:

kubectl get all
NAME                 READY   STATUS
pod/details-v1       2/2     Running
pod/productpage      2/2     Running
pod/ratings-v1       2/2     Running
pod/reviews-v1       2/2     Running
pod/reviews-v2       2/2     Running
pod/reviews-v3       2/2     Running

继续配置服务。

基于OpenResty 的 WEB 框架 Lor 安装初探

  • 项目介绍:
    • Lor是一个运行在OpenResty上的基于Lua编写的Web框架.
    • 路由采用Sinatra风格,Sinatra是Ruby小而精的web框架.
    • API基本采用了Express的思路和设计,Node.js跨界开发者可以很快上手.
    • 支持插件(middleware),路由可分组,路由匹配支持string/正则模式.
    • lor以后会保持核心足够精简,扩展功能依赖middleware来实现. lor本身也是基于middleware构建的.
    • 推荐使用lor作为HTTP API Server,lor也已支持session/cookie/html template等功能.
    • 框架简单示例项目lor-example
    • 框架全站示例项目openresty-china
  • 项目地址: https://github.com/sumory/lor
  • 文档地址: http://lor.sumory.com

安装lor框架

git clone https://github.com/sumory/lor
cd lor 
make install

此时可能会有报错如下:

/usr/bin/env: "resty": 没有那个文件或目录

原因为lor没有找到resty的执行目录,这个时候只需要找到resty的执行目录并软链过去即可:

sudo ln -s /usr/local/openresty/bin/resty /usr/bin/resty

框架自带一个示例项目,运行一下代码

lord new lor_demo

启动

然后就能在框架中看到lor_demo文件夹,执行如下命令

cd lor_demo
lord start

打开浏览器,输入http://localhost:8888/正常访问,即正常安装。