一、关于kong的详细内容这里不再赘述,可以查看官网。

kong升级到1.0以后功能越来越完善,并切新版本的kong可以作为service-mesh使用,并可以将其作为kubernetes的ingress-controlor。虽然在作为service-mesh方面与istio还有差异,但是kong的发展前景很好,kong-ingress-controlor可以自动发现kubernetes集群里面的ingress服务并统一管理。所以我们的测试集群正在试用kong,这里先记录一下部署过程。

二、部署

提前准备好:kubernetes 集群(我线上使用的是1.13.2)、PV持久化(使用nfs做的)、helm

获取charts:

安装好了helm,可以直接使用:

helm  fetch stable/kong

这个默认repo获取是需要翻墙的。

我们使用的是根据官方的定制的:

https://github.com/cuishuaigit/k8s-kong

部署前可以根据自己的需要进行定制:

修改values.yaml文件,我这里取消了admin API的https,因为是纯内网环境。然后做了admin、proxy(http、https)的nodeport端口分别为32344、32380、32343。然后就是设置了默认开启 ingressController。

部署kong:

git clone https://github.com/cuishuaigit/k8s-kong

cd k8s-kong

helm install -n kong-ingress  --tiller-namespace default  .

测试环境的tiller是部署在default这个namespace下的。

部署完的效果:

root@ku13-1:~# kubectl get pods  | grep kong
kong-ingress-kong-5c968fdb74-gsrr8 1/1 Running 0 4h14m
kong-ingress-kong-controller-5896fd6d67-4xcg5 2/2 Running 1 4h14m
kong-ingress-kong-init-migrations-k9ztt 0/1 Completed 0 4h14m
kong-ingress-postgresql-0 1/1 Running 0 4h14m
root@ku13-1:/data/k8s-kong# kubectl get svc  | grep kong
kong-ingress-kong-admin NodePort 192.103.113.85 <none> 8444:32344/TCP 4h18m
kong-ingress-kong-proxy NodePort 192.96.47.146 <none> 80:32380/TCP,443:32343/TCP 4h18m
kong-ingress-postgresql ClusterIP 192.97.113.204 <none> 5432/TCP 4h18m
kong-ingress-postgresql-headless ClusterIP None <none> 5432/TCP 4h18m

然后根据https://github.com/Kong/kubernetes-ingress-controller/blob/master/docs/deployment/minikube.md部署了demo服务:

wget  https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/master/deploy/manifests/dummy-application.yaml

# cat dummy-application.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: http-svc
spec:
replicas:
selector:
matchLabels:
app: http-svc
template:
metadata:
labels:
app: http-svc
spec:
containers:
- name: http-svc
image: gcr.io/google_containers/echoserver:1.8
ports:
- containerPort:
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP

# cat demo-service.yaml

apiVersion: v1
kind: Service
metadata:
name: http-svc
labels:
app: http-svc
spec:
type: NodePort
ports:
- port:
targetPort:
protocol: TCP
name: http
selector:
app: http-svc
kubectl create -f dummy-application.yaml  -f  demo-servcie.yaml

创建ingress rule:

ingress 必须与相应的service部署在相同的namespace下。这里没有指定默认demo-service 和demo-ingress 都是部署在default这个namespace下面。

#cat demo-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: foo-bar
spec:
rules:
- host: foo.bar
http:
paths:
- path: /
backend:
serviceName: http-svc
servicePort: 80
kubectl  create -f demon-ingress.yaml

使用curl测试:

root@ku13-1:/data/k8s-kong# curl http://192.96.47.146 -H Host:foo.bar

Hostname: http-svc-6f459dc547-qpqmv

Pod Information:
node name: ku13-2
pod name: http-svc-6f459dc547-qpqmv
pod namespace: default
pod IP: 192.244.32.25 Server values:
server_version=nginx: 1.13.3 - lua: 10008 Request Information:
client_address=192.244.6.216
method=GET
real path=/
query=
request_version=1.1
request_uri=http://192.244.32.25:8080/ Request Headers:
accept=*/*
connection=keep-alive
host=192.244.32.25:8080
user-agent=curl/7.47.0
x-forwarded-for=10.2.6.7
x-forwarded-host=foo.bar
x-forwarded-port=8000
x-forwarded-proto=http
x-real-ip=10.2.6.7 Request Body:
-no body in request-

三、部署konga

konga是kong的一个dashboard,具体部署参考https://www.cnblogs.com/cuishuai/p/9378960.html

四、kong plugin

kong有很多插件,帮助用户更好的使用kong来完成更加强大的代理功能。这里介绍两种,其他的使用都是相似的,只是配置参数不同,具体参数配置参考https://docs.konghq.com/1.1.x/admin-api/#plugin-object

kong-ingress-controlor提供了四种crd:KongPlugin、KongIngress、KongConmuser、KongCredential

1、request-transform

创建yaml:

#cat demo-request-transformer.yaml

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: transform-request-to-dummy
namespace: default
labels:
global: "false"
disable: false
config:
replace:
headers:
- 'host:llll'
add:
headers:
- "x-myheader:my-header-value"
plugin: request-transformer

创建插件:

kubectl create -f demo-request-transformer.yaml

2、file-log

创建yaml:

# cat demo-file-log.yaml

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: echo-file-log
namespace: default
labels:
global: "false"
disable: false
plugin: file-log
config:
path: /tmp/req.log
reopen: true

创建插件:

kubectl create -f demo-file-log.yaml

3、插件应用

插件可以与route、servcie绑定,绑定的方式就是使用annotation,0.20版本后的ingress controlor使用的是plugins.konghq.com.

1)route

在route层添加插件,就是在ingress里面添加:

# cat demo-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: foo-bar
annotations:
plugins.konghq.com: transform-request-to-dummy,echo-file-log
spec:
rules:
- host: foo.bar
http:
paths:
- path: /
backend:
serviceName: http-svc
servicePort:

应用:

kubectl apply -f demo-ingress.yaml

去dashboard上查看效果:

或者使用admin API查看:

curl http://10.1.2.8:/plugins | jq

32344是kong admin  API映射到node节点的端口, jq格式化输出

2)service

在service层添加插件,直接在dummy的service的yaml里面添加anntations:

# cat  demo-service.yaml

apiVersion: v1
kind: Service
metadata:
name: http-svc
labels:
app: http-svc
annotations:
plugins.konghq.com: transform-request-to-dummy,echo-file-log
spec:
type: NodePort
ports:
- port:
targetPort:
protocol: TCP
name: http
selector:
app: http-svc

应用:

kubectl apply -f demo-service.yaml

去dashboard上查看效果:

或者使用admin API:

curl http://10.1.2.8:32344/plugins | jq

4、插件效果

1)request-transformer

# curl  http://10.1.2.8:32380 -H Host:foo.bar

Hostname: http-svc-6f459d7-7qb2n

Pod Information:
node name: ku13-
pod name: http-svc-6f459d7-7qb2n
pod namespace: default
pod IP: 192.244.32.37 Server values:
server_version=nginx: 1.13. - lua: Request Information:
client_address=192.244.6.216
method=GET
real path=/
query=
request_version=1.1
request_uri=http://llll:8080/ Request Headers:
accept=*/*
connection=keep-alive
host=llll
user-agent=curl/7.47.0
x-forwarded-for=10.1.2.8
x-forwarded-host=foo.bar
x-forwarded-port=8000
x-forwarded-proto=http
x-myheader=my-header-value
x-real-ip=10.1.2.8 Request Body:
-no body in request-

可以看到我们在上面的plugin的设置生效了。host被替换成了llll,并且添加了x-myheader。

2)file-log

需要登陆kong的pod去查看:

kubectl exec -it kong-ingress-kong-5c9lo74-gsrr8 -- grep -c request  /tmp/req.log

可以看到正确收集到日志了。

5、使用注意事项

目前使用的时候如果当前的某个plugin被删掉了,而annotations没有修改,那么会导致所有的plugin都不可用,这个官方正在修复这个bug。所以现在使用的时候要格外注意避免出现问题。

参考:

https://github.com/Kong/kubernetes-ingress-controller/blob/master/docs/custom-resources.md

https://github.com/Kong/kubernetes-ingress-controller/blob/master/docs/external-service/externalnamejwt.md

https://github.com/Kong/kubernetes-ingress-controller/blob/master/docs/deployment/minikube.md

https://github.com/cuishuaigit/k8s-kong

kubernetes 安装kong、kong-ingress-controlor的更多相关文章

  1. kubernetes系列(十) - 通过Ingress实现七层代理

    1. Ingress入门 1.1 Ingress简介 1.2 原理和组成部分 1.3 资料信息 2. Ingress部署的几种方式 2.1 前言 2.1 Deployment+LoadBalancer ...

  2. Docker系列(九)Kubernetes安装

    环境: A.B两天机器A机器IP:192.169.0.104,B机器IP:192.168.0.102,其中A为Master节点,B为Slave节点 操作系统:Centos7 Master与Slave节 ...

  3. 轻松加愉快的 Kubernetes 安装教程

    轻松加愉快的 Kubernetes 安装教程 马哥Linux运维 2 days ago 作者:无聊的学习者 来源:见文末 在国内安装 K8S,一直是大家很头痛的问题,各种麻烦,关键是还不知道需要下载什 ...

  4. Kuboard Kubernetes安装

    一.简介 Kubernetes 容器编排已越来越被大家关注,然而使用 Kubernetes 的门槛却依然很高,主要体现在这几个方面: 集群的安装复杂,出错概率大 Kubernetes相较于容器化,引入 ...

  5. kubernetes安装-kubeadm

    系统信息 角色 系统 CPU Core memory master 18.04.1-Ubuntu 4 8G slave 18.04.1-Ubuntu 4 4G 安装前准备(主节点和从节点都需要执行) ...

  6. kubernetes安装-二进制

    主要参考https://github.com/opsnull/follow-me-install-kubernetes-cluster,采用Flanel和docker 系统信息 角色 系统 CPU C ...

  7. 服务网格Istio入门-详细记录Kubernetes安装Istio并使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,文章更新也只在官网,欢迎大家来喝茶~~ 1 服务网格Istio Istio是开源的Service Mesh实现,一般用于Kubernetes ...

  8. kubernetes 安装 ingress controller

    文章链接 ingress-nginx ingress 官方网站 ingress 仓库地址 ingress-nginx v1.0 最新版本 v1.0 适用于 Kubernetes 版本 v1.19+ ( ...

  9. kubernetes 安装手册(成功版)

    管理组件采用staticPod或者daemonSet形式跑的,宿主机os能跑docker应该本篇教程能大多适用安装完成仅供学习和实验 本次安裝的版本: Kubernetes v1.10.0 (1.10 ...

随机推荐

  1. 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)

    传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...

  2. mysql 慢日志分析

    mysql 调优首先需要找到那些有问题的SQL语句. 怎么找到这些语句呢? mysql 提供了很方便的功能. 1.慢日志 在my.cnf 文件中,增加如下配置 log-error            ...

  3. Web打印控件Lodop实现表格物流单的打印

    Web打印控件Lodop实现表格物流单的打印 一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用 ...

  4. 关于数据库连接时URL的问题

    最近在写一个简单的增删改查的代码时,遇到保存的中文都会变成问号(?),由于刚开始只是一些数据的保存,所以认为之后只要对数据库的编码进行修改即可,但是后来要对数据进行查找的时候发现根本查找不到, 当时用 ...

  5. scrum冲刺

    小组第一次冲刺任务及其完成情况描述: 这次主要是先构建一个框架,然后就是完成首页的一些代码编写,能够基本实现首页的注册.登陆以及一些之后完成的内部构建. 在第一次冲刺任务中的收获和体会,以后如何改进的 ...

  6. 服务器windows2008系统登录报错:由于远程桌面服务当前正忙,因此无法完成您尝试的任务。请在...

    1.问题描述:windows server 2008服务器通过远程桌面登录时很慢,登录不进去,把远程桌面关掉后,再用远程桌面登录时,出现下图提示. 把服务器接上显示器键盘鼠标后,卡在系统登录的欢迎界面 ...

  7. macOS终端开启TAB键自动补全功能(不区分大小写)

    1.在当前用户根目录(~)下,修改~/.inputrc这个文件(如果文件不存在,则新建该文件),文件内容如下: set show-all-if-ambiguous on set completion- ...

  8. Postman+Newman+jenkins实现API自动化测试

    最近自己在学习用postman+newman+jenkins实现API自动化测试,这里做个回顾和记录.(此次是在windows上进行的环境搭建) 一.说明 1.大致思路:利用postman做接口调试所 ...

  9. 微信小程序设置web-view的业务域名

    微信小程序设置web-view的业务域名 域名必备 你的域名必须要备案过 你的域名必须是https,而不能是http web-view 在小程序后台添加业务域名,只解析业务域名中的url网页地址的. ...

  10. 微信小程序中的app.js-清除缓存

    微信小程序中的app.js 关于小程序app.js生命周期的介绍 App(Object) App() 函数用来注册一个小程序.接受一个 Object 参数,其指定小程序的生命周期回调等. App() ...