(daemonset篇)使用helm3在gke中安装ingress-controller

背景

我们的业务目前在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这些你都可以自定义,具体的参数请参考:官方文档)

1
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

下载charts

1
2
$ helm repo add nginx-stable https://helm.nginx.com/stable
$ helm repo update
1
2
$ helm pull nginx-stable/nginx-ingress
$ tar xvf nginx-ingress-0.7.0.tgz

修改配置文件

既然我们选择了deamonset+hostnetwork+nodeselector的方式来部署,那么我们主要修改以下内容:

1
2
3
4
5
6
7
8
9
10
11
$ 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(后面会说有啥用)

安装验证

1
2
3
4
5
6
7
8
9
$ 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也会自动伸缩的

1
2
3
4
5
6
$ 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

另外也可以看看健康检查是否正常:
png3

增加lb代理到ingress-controller

1.创建tcp负载均衡器,然后选择后端实例组,也就是你创建nodepool的时候自动创建的实例组
png4
2.创建健康检查,就是你上面在values.yaml中定义的
png5
3.创建前端转发配置,分别是80和443
png6
4.最后查看下glb创建的结果以及健康检查的状态
png7

验证流量

拿到glb的ip之后,添加一个ingress资源,添加的ingress资源需要设置kubernetes.io/ingress.class:这个annotations,在前面已经定义了ingressClass为mt-ingress-eve-release,这个能解决你一个集群中有多个ingress-controller,可以通过这个标签来判断你的ingress资源应该被哪个ingress-controller接管。
(注意:secret要在这个ns下创建好)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

额外讲一句

由于gke的机器是不允许的登录的,所以通过这种方式创建的ingress-controller,你是没有办法日志落盘的,所以搞不定。

在额外讲一句

安装好之后默认是打开了metrics的,所以你就可以创建一个servicemonitor,把数据收集到你prometheus中,如果你不懂这个是啥,请欣赏之前的文章,在gke中安装prometheus-operaotor。
或者也可以配置prometheus自动收集集群中的metrics数据

可以看看他默认提供了什么信息,默认的端口是9113。
(注意:需要打开防火墙规则,放开9113端口,默认是不行的)

1
curl 10.10.182.28:9113/metrics

png9