k8s中部署ingress-nginx

1. ingress-nginx部署

Ingress 资源随着时间的推移而发展。他们从 apiVersion: extensions/v1beta1 开始,然后转移到 apiVersion:network.k8s.io/v1beta1,最近又转移到 apiVersion:networks.k8s.io/v1。

以下是 Kubernetes 支持这些 Ingress 版本的方式:

  • 在 Kubernetes 1.19 之前,仅支持 v1beta1 Ingress 资源
  • 从 Kubernetes 1.19 到 1.21,同时支持 v1beta1 和 v1 Ingress 资源
  • 在 Kubernetes 1.22 及更高版本中,仅支持 v1 Ingress 资源

以下是 NGINX Ingress Controller 支持这些 Ingress 版本的方式:

  • 在 1.0 版之前,仅支持 v1beta1 Ingress 资源
  • 在 1.0 及更高版本中,仅支持 v1 Ingress 资源

因此,如果您运行 Kubernetes 1.19 或更高版本,您应该能够使用最新版本的 NGINX Ingress Controller;但是如果您使用的是旧版本的 Kubernetes(1.18 或更早版本),则必须使用 NGINX Ingress Controller 的 0.X 版(例如 0.49 版)。

NGINX Ingress Controller 的 Helm chart 在chart的版本 4 中切换到版本 1。换句话说,如果您运行的是 Kubernetes 1.19 或更早版本,则应使用chart的 3.X 版本(这可以通过在 helm install 命令中添加 –version=’<4’ 来完成)。

1.1. 使用helm安装

1
2
3
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace

它将在 ingress-nginx 命名空间中安装控制器,如果该命名空间尚不存在,则创建该命名空间。

这个命令是幂等的: - 如果入口控制器没有安装,它会安装它, - 如果入口控制器已经安装,它会升级它。

如果报错:Error: failed pre-install: timed out waiting for the condition,可按步骤分开部署

1
2
3
4
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm pull ingress-nginx/ingress-nginx
tar xf ingress-nginx-4.0.9.tgz
cd ingress-nginx/

修改values.yaml配置,这里我使用DaemonSet部署

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
34
35
36
37
38
39
40
41
42
43
controller:
name: controller
image:
registry: k8s.gcr.io
image: ingress-nginx/controller
tag: "v1.0.5"
digest: sha256:55a1fcda5b7657c372515fe402c3e39ad93aa59f6e4378e82acd99912fe6028d
dnsPolicy: ClusterFirst
hostNetwork: false
kind: Deployment
nodeSelector:
kubernetes.io/os: linux
type: LoadBalancer
patch:
enabled: true
image:
registry: k8s.gcr.io
image: ingress-nginx/kube-webhook-certgen
tag: v1.1.1
digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660


修改为
controller:
name: controller
image:
registry: heyuze
image: ingress-nginx-controller
tag: "v1.0.5"
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
kind: DaemonSet
nodeSelector:
kubernetes.io/os: linux
ingress: "true"
type: ClustertIP
patch:
enabled: true
image:
registry: heyuze
image: kube-webhook-certgen
tag: v1.1.1

注意:删除digest,

部署

1
2
3
4
5
6
7
kubectl create ns ingress-nginx

# 在部署的节点打个label
kubectl label node k8s-master ingress=true
kubectl label node k8s-node1 ingress=true

helm install ingress-nginx -n ingress-nginx .

扩容ingress节点:kubectl label nodes k8s-node1 ingress=true

缩容ingress节点:kubectl label nodes k8s-node1 ingress-

查看所有节点labels:kubectl get pod -A –show-labels

查看部署的ingress

1
2
3
[root@k8s-master ingress-nginx]# kubectl get pod -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-controller-hw5pw 1/1 Running 0 2m29s 192.168.101.202 k8s-node1 <none> <none>

注意:这里我在master节点上也打了标签,但是没有部署;原因很简单,我的master节点已经有了污点的标签,从亲和性上就已经不再容忍任何pod运行,所以只能部署到node节点。

1.2. 使用yaml文件安装

如果您更喜欢使用 YAML 清单,则可以运行以下命令:

在终端上运行命令之前,请确保在 Docker 设置中启用了 Kubernetes

其中 YAML 清单是使用 helm 模板生成的,因此您最终将获得几乎与使用 Helm 安装控制器相同的资源。

下载yaml文件

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

修改yaml文件

1
2
3
4
5
# containers镜像地址
heyuze/ingress-nginx-controller:v1.0.5

# kube-webhook-certgen镜像地址
heyuze/ingress-nginx/kube-webhook-certgen:v1.1.1

应用yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@k8s-master ~]# kubectl apply -f deploy.yaml 
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
serviceaccount/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created

如果您运行的是旧版本的 Kubernetes(1.18 或更早版本),请阅读本段以获取具体说明。

1.3. nginx 配置

自定义 NGINX 有以下三种方式:
ConfigMap:使用 Configmap 在 NGINX 中设置全局配置。
Annotations:如果您想要特定 Ingress 规则的特定配置,请使用此选项。
Custom template:当需要更具体的设置时,如 open_file_cache,将监听选项调整为 rcvbuf,或者当无法通过 ConfigMap 更改配置时。

1.4. 案例测试

创建deployment

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
34
35
36
37
# 创建模板
kubectl create deployment nginx --image=nginx --dry-run -o yaml > nginx-deploy.yaml

# 查看deployment内容
[root@k8s-master ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}

# 应用deployment并查看
[root@k8s-master ~]# kubectl apply -f nginx-deploy.yaml
deployment.apps/nginx created

[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-hfhwt 1/1 Running 0 3m40s

创建service

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
# 创建模板
kubectl expose deployment nginx --port=8000 --target-port=80 --type=ClusterIP --dry-run -o yaml > nginx-svc.yaml

# 查看模板
[root@k8s-master ~]# cat nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
ports:
- port: 8000
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
status:
loadBalancer: {}

# 创建service并查看
[root@k8s-master ~]# kubectl apply -f nginx-svc.yaml
service/nginx created

[root@k8s-master ~]# kubectl get svc|grep nginx
nginx ClusterIP 10.103.198.110 <none> 8000/TCP 19s

测试访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@k8s-master ~]# curl 10.103.198.110:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

创建ingress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# [root@k8s-master ~]# vim nginx-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
annotations:
nginx.ingress.kubernetes.io/ingress.class: 'nginx'
namespace: default
spec:
ingressClassName: nginx
rules:
- host: test.kubelet.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 8000

访问

-------------本文结束感谢您的阅读-------------