hello云胜

技术与生活

0%

部署nginx-ingress-controller

部署ingress-nginx-controller

基于 Nginx 的 Ingress Controller 有两种,

一种是 k8s 社区提供的 ingress-nginx,就是本文的部署方案

另一种是 Nginx 社区提供的nginx-ingress

部署

  1. 下载部署文件

    ingress-nginx的官方地址是

    https://github.com/kubernetes/ingress-nginx

    image-20231030112250439

    我的k8s是1.25版本的,决定部署1.9.3的ingress-nginx

​ 下载deploy文件

1
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.3/deploy/static/provider/cloud/deploy.yaml

查看该yaml文件,找到需要的镜像是

1
2
registry.k8s.io/ingress-nginx/controller:v1.9.3
registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0

我已经转发传到了dockerhub

分别修改镜像地址

1
2
anjia0532/google-containers.ingress-nginx.controller:v1.9.3
anjia0532/google-containers.ingress-nginx.kube-webhook-certgen:v20231011-8b53cabe0

修改deployment为hostnetwork

1
2
hostNetwork: true
dnsPolicy:ClusterFirstWithHostNet

监听主机的80端口

然后apply该文件即可

1
kubectl apply -f deploy.yaml

分析该yaml文件,创建的资源如下

  1. 创建一个 Namespce,名为 ingress-nginx,下面的所有资源都在该命名空间下
  2. 创建一个 ServiceAccount,名为ingress-nginx
  3. 再创建一个 ServiceAccount,名为ingress-nginx-admission
  4. 创建一个 Role,名为 ingress-nginx
  5. 再创建一个 Role,名为 ingress-nginx-admission。有secrets的相关权限
  6. 创建一个 ClusterRole,名为 ingress-nginx
  7. 再创建一个 ClusterRole,名为 ingress-nginx-admission
  8. 创建一个 RoleBinding,名称为 ingress-nginx,将Role ingress-nginx,与ServiceAccount ingress-nginx相绑定。即第2步和第4步
  9. 再创建一个RoleBinding,ingress-nginx-admission。绑定3和5
  10. 创建一个ClusterRoleBinding,ingress-nginx。绑定6和2
  11. 再创建一个ClusterRoleBinding,ingress-nginx-admission。绑定7和3
  12. 创建一个 ConfigMap,名为ingress-nginx-controller
  13. 创建一个 Service ,名称为 ingress-nginx-controller,类型是nodeport。对外暴露80和443端口, 对应协议分别是 http和https
  14. 创建一个 Service ,名称为 ingress-nginx-controller-admission,类型为CusterIP,对外暴露443 ,协议https
  15. 创建一个 Deployment,名称为 ingress-nginx-controller
  16. 创建一个job,ingress-nginx-admission-create。
  17. 创建一个 Job,名称为 ingress-nginx-admission-patch
  18. 创建一个IngressClass。名为nginx
  19. 创建一个NetworkPolicy。名为ingress-nginx-admission
  20. 创建一个 ValidatingWebhookConfiguration,名称为 ingress-nginx-admission

测试

部署一个tomcat的serveice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
selector:
app: tomcat
ports:
- name: http
targetPort: 8080
port: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.5.34-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080

部署一个ingress用于转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-tomcat
spec:
rules:
- host: test.xxx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat
port:
number: 8080
ingressClassName: nginx

本地电脑上改一下host

1
要ingress-controller启动的那台node的ip  test.xxx.com

image-20231030154706020

改进

现在所有的流量都走ingress-controller的pod所在的那台服务器,存在单点风险。

应该每个node节点部署一个ingress-controller。然后流量进行负载均衡。

修改deploy文件

我的测试集群只有两个node节点

1
replicas: 2

进行pod反亲和,使两个pod分别部署到两个node上

1
2
3
4
5
6
7
8
9
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
topologyKey: kubernetes.io/hostname

这样在前面可以加一个kong或者其他的负载均衡器来代理一下。

贴一下最后完成的deploy.yaml

deploy.yaml