背景
我们的业务目前在gke上是使用的自带的ingress服务,直接对接他们的loadbalancer服务,上几篇文章写的是安装prometheus,发现获取不到代理层的一些数据,所以想直接自己撸ingress-controller来实现。
备注:gke上的stackdriver虽然可以看到比较多的数据,但是关于loadbalancer,他没有具体的域名数据,所以比较不直观。
描述
我们使用ingress-controller的姿势其实有很多,一般有:
- deployment + loadbalancer模式的service
- daemonset + hostnetwork + nodeselector
具体可以参考这篇博客,我一个朋友写的:跳转
我分成两篇文章写吧!
这里着重讲一句,ingress-nginx和nginx-ingress是两个不同的,一个是k8s社区推出的,一个是nginx推出的,本篇文章是按照nginx-ingress讲的,接下来会讲ingress-nginx,这个也会作为以后默认的官方使用版本
步骤
- 创建gke ingress 节点池
- 下载最新的helm charts
- 修改配置文件
- 安装验证
- 增加lb代理到ingress-controller机器
- 验证流量
创建节点池
目前测试,在控制台创建ingress节点池,默认是不会打开防火墙的http和https规则,所以会影响你后续的流量访问。
那么通过查看文档发现,可以直接使用gcloud来创建节点池,并指定打开http和https防火墙规则。
gcloud命令参考:
重要的就是--tags=http-server,https-server
这个参数
(其中–cluster,–zone,–node-labels,–machine-type这些你都可以自定义,具体的参数请参考:官方文档)
gcloud container node-pools create nodepool-ingress --cluster=gke-cluster-name --zone us-central1-c --tags=http-server,https-server --num-nodes=1 --node-labels=nodetype=ingress --enable-autoscaling --max-nodes=3 --min-nodes=1 --disk-size=50 --machine-type=n2-custom-2-4096 --project projectName
![png1](https://i-blog.csdnimg.cn/blog_migrate/133fef1a27323dbb72a59d98bd353317.png)
下载charts
helm repo add nginx-stable https://helm.nginx.com/stable
helm repo update
helm pull nginx-stable/nginx-ingress
tar xvf nginx-ingress-0.7.0.tgz
修改配置文件
既然我们选择了deamonset+hostnetwork+nodeselector的方式来部署,那么我们主要修改以下内容:
vim values.yaml
1. kind: daemonset 默认是deployment,修改成daemonset
2. hostNetwork: true 默认是false
3. nodeSelector:
nodetype: ingress
4. 如果你有自定义镜像,也可以把image.repository和image.tag修改掉,注意修改下imagePullSecrets
5. 如果你有日志落盘的需求,那么可以设置volumeMounts来挂载宿主机目录到容器
6. service.create 设置为false,不然会默认创建一个类型为loadbalancer的svc
7. 打开健康检查healthStatus=true,healthStatusURL="/devops/status",另外自定义健康检查路径
8. 修改ingressClass为自定义组:mt-ingress-eve-release(后面会说有啥用)
安装验证
helm install nginx-ingress -n ingress-controller .
NAME: nginx-ingress
LAST DEPLOYED: Wed Nov 11 16:26:25 2020
NAMESPACE: ingress-controller
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The NGINX Ingress Controller has been installed.
由于是daemonset方式部署,所以当你扩容ingress节点池,他pod也会自动伸缩的
kubectl get daemonset -n ingress-controller
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-ingress-nginx-ingress 1 1 1 1 1 nodetype=ingress 44m
kubectl get pods -n ingress-controller
NAME READY STATUS RESTARTS AGE
nginx-ingress-nginx-ingress-xxx8z 1/1 Running 0 40m
通过hostnetwork的方式,就是把容器暴露的端口映射到宿主机上,容器目前是暴露80和443端口,所以你在宿主机也能看到这两个端口,由于gke的节点是不允许登录的,所以我们直接telnet验证下就行了。
![png2](https://i-blog.csdnimg.cn/blog_migrate/a4bcbd334d85653e1dd101d91304386e.png)
另外也可以看看健康检查是否正常:
![png3](https://i-blog.csdnimg.cn/blog_migrate/b0da09c7c8b3928a91219ace6ad9ecc5.png)
增加lb代理到ingress-controller
1.创建tcp
负载均衡器,然后选择后端实例组,也就是你创建nodepool的时候自动创建的实例组
![png4](https://i-blog.csdnimg.cn/blog_migrate/4a810505c235955e8c1bdf47eeb071b9.png)
2.创建健康检查,就是你上面在values.yaml中定义的
![png5](https://i-blog.csdnimg.cn/blog_migrate/7dc578b8f73ce04ec38003c33798afe7.png)
3.创建前端转发配置,分别是80和443
![png6](https://i-blog.csdnimg.cn/blog_migrate/4bf4057e7fea0891505aed3edf8e1966.png)
4.最后查看下glb创建的结果以及健康检查的状态
![png7](https://i-blog.csdnimg.cn/blog_migrate/711d088c1ef5e550ce2fdb36951c67a9.png)
验证流量
拿到glb的ip之后,添加一个ingress资源,添加的ingress资源需要设置kubernetes.io/ingress.class:
这个annotations,在前面已经定义了ingressClass为mt-ingress-eve-release,这个能解决你一个集群中有多个ingress-controller,可以通过这个标签来判断你的ingress资源应该被哪个ingress-controller接管。
(注意:secret要在这个ns下创建好)
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
kubernetes.io/ingress.class: mt-eve-ingress-release
name: ingress-xx-com
namespace: monitoring
spec:
rules:
- host: test.xx.com
http:
paths:
- backend:
serviceName: mt-prometheus-operator-prometheus
servicePort: 9090
tls:
- hosts:
- test.xx.com
secretName: x-xx-com-20201112
然后本地绑定一个host先测试下是否能够访问到。
通过ingress-controller的日志可以看到是没问题的:
![png8](https://i-blog.csdnimg.cn/blog_migrate/e48c29a30a8cfbfcdc505e0cd091bbf5.png)
额外讲一句
由于gke的机器是不允许的登录的,所以通过这种方式创建的ingress-controller,你是没有办法日志落盘的,所以搞不定。
在额外讲一句
安装好之后默认是打开了metrics的,所以你就可以创建一个servicemonitor,把数据收集到你prometheus中,如果你不懂这个是啥,请欣赏之前的文章,在gke中安装prometheus-operaotor。
或者也可以配置prometheus自动收集集群中的metrics数据
可以看看他默认提供了什么信息,默认的端口是9113。
(注意:需要打开防火墙规则,放开9113端口,默认是不行的)
curl 10.10.182.28:9113/metrics
![png9](https://i-blog.csdnimg.cn/blog_migrate/5e4d097f2df1422e6a71c9979762fbe6.png)