某不知名博客 某不知名博客
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carsaid

安全界的小学生
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前言

  • 学习建议

  • Docker命令大全
  • Kubernetes教程

  • CKS教程

    • 前言

    • CKS考试学习指南(翻译)

      • 集群设置

        • Kubernetes网络策略
        • Kubernetes CIS基准

        • Ingress安全

          • Ingress安全
          • Ingress入门指南
          • Nginx ingress 控制器设置指南
            • Ingress和Nginx Ingress控制器架构
            • 先决条件
            • Nginx Ingress控制器Kubernetes清单
            • 使用配置清单部署Nginx Ingress控制器
              • 准入控制器需求 & Webhook验证
              • 创建命名空间
              • 创建准入控制器角色 & 服务账户
              • 创建Validating Webhook Configuration
              • 部署 Jobs 以更新 Webhook 证书
              • 创建Ingress控制器角色 & 服务账户
              • 创建Configmap
              • 创建Ingress控制器 & 准入控制器服务
              • 创建Ingress控制器Deployment
            • 通过Helm部署Nginx Ingress控制器
            • 将域名映射到Ingress Loadbalancer的IP
              • 单一DNS映射
              • 通配符DNS映射
            • 部署演示应用程序
            • 为应用程序创建Ingress对象
            • TLS与Nginx Ingress
            • 结论
          • 如何为Ingress配置TLS、SSL证书
        • Kubernetes节点的元数据端点
        • 保护Kubernetes GUI
        • 在部署之前验证平台二进制文件
      • 集群加固

      • 系统加固

      • 最小化微服务漏洞

      • 供应链安全

      • 监控、日志记录和运行时安全性

  • 云原生安全
  • CKS教程
  • CKS考试学习指南(翻译)
  • 集群设置
  • Ingress安全
carsaid
2023-12-02
目录

Nginx ingress 控制器设置指南

翻译

原文:https://devopscube.com/setup-ingress-kubernetes-nginx-controller/

- name: 翻译
  desc: 原文:https://devopscube.com/setup-ingress-kubernetes-nginx-controller/
  bgColor: '#F0DFB1'
  textColor: 'green'
1
2
3
4

# Nginx ingress 控制器设置指南

Not Found Image

在这份全面的 ingress 指南中,您将学习如何在 Kubernetes 上设置 Nginx ingress 控制器并使用 DNS 配置 ingress。

如果您想了解 Kubernetes Ingress 是如何工作的,请阅读我的 Kubernetes Ingress 教程 (opens new window)。对于初学者来说,我已经解释了所有的核心 ingress 概念,包括 ingress 对象如何与 ingress 控制器一起工作。



有两种 Nginx ingress 控制器:

  1. kubernetes 社区的 Nginx ingress 控制器 (opens new window)
  2. 由 Nginx Inc 开发的 Nginx ingress 控制器 (opens new window)

在本指南中,我们将使用 kubernetes 社区的 Nginx 控制器。

# 1Ingress和Nginx Ingress控制器架构

下面是使用 Nginx ingress 控制器的 Kubernetes ingress 的高级架构。在本指南中,我们将学习如何在架构中构建设置。

Not Found Image

# 2先决条件

  1. 一个 Kubernetes 集群 (opens new window)
  2. 已安装 kubectl 实用程序并通过了 kubernetes 集群验证。
  3. 拥有对 kubernetes 集群的管理员访问权限。
  4. 一个指向 ingress 控制器的负载均衡器有效 IP 。(可选)

如果您在 Google Cloud 上尝试此设置,请启用集群角色,并为您的帐户分配管理员权限。

ACCOUNT=$(gcloud info --format='value(config.account)')
kubectl create clusterrolebinding owner-cluster-admin-binding \
    --clusterrole cluster-admin \
    --user $ACCOUNT
1
2
3
4

# 3Nginx Ingress控制器Kubernetes清单

本教程中使用的所有 kubernetes 清单都托管在 Github 存储库上。克隆它并将其用于部署。这些清单来自 Nginx 社区的官方仓库。

git clone https://github.com/techiescamp/nginx-ingress-controller
1

首先,我们将使用 YAML 清单部署 Nginx 控制器,然后理解所有相关的 Kubernetes 对象。当我们有所了解之后,我们将改为使用 Helm chart 部署它。

此外,这里是用于部署所有对象的一行代码。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
1

笔记

如果您想了解所有 Nginx ingress 控制器对象以及它们之间的关系,我建议您从仓库中单独创建每一个对象。在您了解其工作原理后,可以改为使用一个整体清单或 helm chart 来部署它。

# 4使用配置清单部署Nginx Ingress控制器

我们需要部署以下 Kubernetes 资源对象才能拥有一个正常工作的 Nginx 控制器。

  1. 命名空间ingress-nginx
  2. Nginx 准入控制器的 ServiceAccount/Roles/ClusterRoles
  3. 验证 Webhook 配置
  4. 创建/更新用于 Webhook CA 捆绑包的 Jobs
  5. Nginx 控制器 deployment 的 ServiceAccount/Roles/ClusterRoles
  6. Nginx 控制器 configmap
  7. Nginx 控制器和准入控制器的服务
  8. Ingress 控制器 deployment

笔记

您可以自己创建所有配置清单,也可以直接使用 Github 存储库。但是,我强烈建议您仔细阅读每一份清单,并了解您正在部署的内容。

# 4.1准入控制器需求 & Webhook验证

Kubernetes 准入控制器是一小段代码,用于在创建 Kubernetes 对象之前对其进行验证或更新。在本例中,这个准入控制器是用于验证 ingress 对象的。准入控制器代码是 Nginx 控制器的一部分,它监听端口8443。

为什么需要准入控制器?

如果没有准入控制器,您可能会部署包含错误配置的 ingress 对象。错误的配置可能会破坏与 ingress 控制器关联的所有 ingress 规则。

有了准入控制器,我们可以确保自己创建的 ingress 对象具有正确的配置,并且不会破坏路由规则。

以下是准入控制器在 Nginx 中的工作方式。

Not Found Image
  1. 当您部署一个 ingress YAML 时,准入验证会拦截请求。
  2. 然后,Kubernetes API 根据 Webhook 准入端点将 ingress 对象发送到准入验证控制器的 Service 端点。
  3. Service 将请求发送到 Nginx deployment 上的8443端口,以验证入口对象。
  4. 然后,准入控制器向 k8s API 发送响应。
  5. 如果这是一个有效的响应,则 API 将创建 ingress 对象。

# 4.2创建命名空间

我们将在ingress-nginx命名空间中部署所有 Nginx 控制器对象。

让我们创建命名空间。

kubectl create ns ingress-nginx
1

# 4.3创建准入控制器角色 & 服务账户

我们需要一个具有所需权限的 Role 和 ClusterRole,并绑定到ingress-nginx-admission服务帐户。

创建名为admission-service-account.yaml的文件,并复制以下内容。

---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission
  namespace: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  annotations:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission
  namespace: ingress-nginx
rules:
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - get
  - create

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission
  namespace: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingress-nginx-admission
subjects:
- kind: ServiceAccount
  name: ingress-nginx-admission
  namespace: ingress-nginx


---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission
rules:
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - validatingwebhookconfigurations
  verbs:
  - get
  - update

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ingress-nginx-admission
subjects:
- kind: ServiceAccount
  name: ingress-nginx-admission
  namespace: ingress-nginx
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

部署资源。

kubectl apply -f admission-service-account.yaml 
1

# 4.4创建Validating Webhook Configuration

创建一个名为validating-webhook.yaml的文件并复制以下内容。

---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    service:
      name: ingress-nginx-controller-admission
      namespace: ingress-nginx
      path: /networking/v1/ingresses
  failurePolicy: Fail
  matchPolicy: Equivalent
  name: validate.nginx.ingress.kubernetes.io
  rules:
  - apiGroups:
    - networking.k8s.io
    apiVersions:
    - v1
    operations:
    - CREATE
    - UPDATE
    resources:
    - ingresses
  sideEffects: None
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

创建ValidatingWebhookConfiguration

kubectl apply -f validating-webhook.yaml
1

# 4.5部署 Jobs 以更新 Webhook 证书

ValidatingWebhookConfiguration只能通过 HTTPS 工作。因此它需要一个 CA 捆绑包。

我们使用 kube-webhook-certgen (opens new window) 为第一个 job 生成 CA 证书捆绑包。生成的 CA 证书存储在名为ingress-nginx-admission的 secret 中。

第二个 job 使用 CA 捆绑包更新ValidatingWebhookConfiguration对象。

创建名为jobs.yaml的文件并复制以下内容。

---
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission-create
  namespace: ingress-nginx
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
      name: ingress-nginx-admission-create
    spec:
      containers:
      - args:
        - create
        - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
        - --namespace=$(POD_NAMESPACE)
        - --secret-name=ingress-nginx-admission
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
        imagePullPolicy: IfNotPresent
        name: create
        securityContext:
          allowPrivilegeEscalation: false
      nodeSelector:
        kubernetes.io/os: linux
      restartPolicy: OnFailure
      securityContext:
        runAsNonRoot: true
        runAsUser: 2000
      serviceAccountName: ingress-nginx-admission
---
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-admission-patch
  namespace: ingress-nginx
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/component: admission-webhook
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
      name: ingress-nginx-admission-patch
    spec:
      containers:
      - args:
        - patch
        - --webhook-name=ingress-nginx-admission
        - --namespace=$(POD_NAMESPACE)
        - --patch-mutating=false
        - --secret-name=ingress-nginx-admission
        - --patch-failure-policy=Fail
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
        imagePullPolicy: IfNotPresent
        name: patch
        securityContext:
          allowPrivilegeEscalation: false
      nodeSelector:
        kubernetes.io/os: linux
      restartPolicy: OnFailure
      securityContext:
        runAsNonRoot: true
        runAsUser: 2000
      serviceAccountName: ingress-nginx-admission
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

执行 job 之后,您可以查看ValidatingWebhookConfiguration的详情,并且您将看到已更新的捆绑包。

kubectl describe ValidatingWebhookConfiguration ingress-nginx-admission
1

# 4.6创建Ingress控制器角色 & 服务账户

创建一个名为ingress-service-account.yaml的文件,并复制以下内容。

---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx
  namespace: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx
  namespace: ingress-nginx
rules:
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - configmaps
  - pods
  - secrets
  - endpoints
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses/status
  verbs:
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - ingressclasses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resourceNames:
  - ingress-controller-leader
  resources:
  - configmaps
  verbs:
  - get
  - update
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - create
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx
  namespace: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingress-nginx
subjects:
- kind: ServiceAccount
  name: ingress-nginx
  namespace: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - nodes
  - pods
  - secrets
  - namespaces
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses/status
  verbs:
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - ingressclasses
  verbs:
  - get
  - list
  - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ingress-nginx
subjects:
- kind: ServiceAccount
  name: ingress-nginx
  namespace: ingress-nginx
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194

部署资源。

 kubectl apply -f ingress-service-account.yaml
1

# 4.7创建Configmap

使用此 configmap 之后,您可以自定义 Nginx 设置。例如,您可以设置自定义标头和大多数 Nginx 功能。请参阅官方社区文档 (opens new window)以了解所有支持的配置项。

创建一个名为configmap.yaml的文件并复制以下内容。

---
apiVersion: v1
data:
  allow-snippet-annotations: "true"
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-controller
  namespace: ingress-nginx
1
2
3
4
5
6
7
8
9
10
11
12

创建这个 configmap。

kubectl apply -f configmap.yaml
1

# 4.8创建Ingress控制器 & 准入控制器服务

创建一个名为services.yaml的文件并复制以下内容。

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  externalTrafficPolicy: Local
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-controller-admission
  namespace: ingress-nginx
spec:
  ports:
  - appProtocol: https
    name: https-webhook
    port: 443
    targetPort: webhook
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: ClusterIP
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
44
45
46
47
48
49
50
51
52

创建服务。

kubectl apply -f services.yaml
1

ingress-nginx-controller会在您部署的相应云平台中创建 Loadbalancer。

您可以使用以下命令获取负载均衡器的 IP/DNS。

kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller
1

笔记

对于每个云提供商,您可以使用特定的注释将静态 IP 地址和其他配置映射到 Loadbalancer。在此处查阅 GCP 注释 (opens new window),在此处查阅 AWS 注释 (opens new window)。

# 4.9创建Ingress控制器Deployment

创建一个名为deployment.yaml的文件并复制以下内容。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/name: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
        - --election-id=ingress-controller-leader
        - --controller-class=k8s.io/ingress-nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: LD_PRELOAD
          value: /usr/local/lib/libmimalloc.so
        image: k8s.gcr.io/ingress-nginx/controller:v1.1.1
        imagePullPolicy: IfNotPresent
        lifecycle:
          preStop:
            exec:
              command:
              - /wait-shutdown
        livenessProbe:
          failureThreshold: 5
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: controller
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
        securityContext:
          allowPrivilegeEscalation: true
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - ALL
          runAsUser: 101
        volumeMounts:
        - mountPath: /usr/local/certificates/
          name: webhook-cert
          readOnly: true
      dnsPolicy: ClusterFirst
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      volumes:
      - name: webhook-cert
        secret:
          secretName: ingress-nginx-admission
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

创建 deployment。

kubectl apply -f deployment.yaml
1

为确保 deployment 工作正常,请检查 pod 状态。

kubectl get pods -n ingress-nginx
1

# 5通过Helm部署Nginx Ingress控制器

如果您是 Helm 用户,则可以使用社区 helm chart 来部署 ingress 控制器。默认情况下,ValidatingWebhookConfiguration在values.yaml中处于禁用状态。

通过 helm chart 部署。它将创建命名空间ingress-nginx(如果不存在的话)。

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

确认 helm 状态。

helm list -n ingress-nginx
1

若要清理资源,请卸载该版本。

 helm uninstall ingress-nginx -n ingress-nginx
1

# 6将域名映射到Ingress Loadbalancer的IP

Ingress 的主要任务是接收 Kubernetes 上运行的 Service 的外部流量。理想情况下,在项目中,DNS 将映射到 ingress 控制器所在的负载均衡器 IP。

这可以通过具有您域名的相应 DNS 提供商来完成。

信息

对于面向互联网的应用程序,它将指向负载均衡器的公共 IP 上的公共 DNS。如果是内部应用,则它将映射到私有负载均衡器 IP 上的私有 DNS。

# 6.1单一DNS映射

您可以直接将单个域作为 A 记录映射到负载均衡器 IP。使用这种方法,您只能为 ingress 控制器设置一个域,并基于多个路径进行流量路由。

例如:

www.example.com --> Loadbalancer IP
1

您还可以使用此模型进行基于路径的路由。

几个例子:

http://www.example.com/app1
http://www.example.com/app2
http://www.example.com/app1/api
http://www.example.com/app2/api
1
2
3
4

# 6.2通配符DNS映射

如果您将通配符 DNS 映射到负载均衡器,则可以通过 ingress 获得动态 DNS 端点。

在 DNS 记录中添加通配符条目后,需要在 ingress 对象中提及所需的 DNS,然后 Nginx ingress 控制器会负责将其路由到所需的服务端点。

例如以下两个映射:

*.example.com --> Loadbalancer IP
*.apps.example.com --> Loadbalancer IP 
1
2

这样一来,您可以通过单个 ingress 控制器拥有多个动态子域,并且每个 DNS 都可以设置自己的基于路径的路由。

几个例子:

# URL 1

http://demo1.example.com/api
http://demo1.example.com/api/v1
http://demo1.example.com/api/v2

# 特定于应用的 URL

http://grafana.apps.example.com
http://prometheus.apps.example.com

# URL 2

http://demo2.apps.example.com/api
http://demo2.apps.example.com/api/v1
http://demo2.apps.example.com/api/v2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

出于演示目的,我已将一个通配符 DNS 映射到 LoadBalancer IP。根据您的 DNS 提供商,您可以添加相应的 DNS 记录。

下图展示了我在这个博客演示中使用的 DNS 记录。我使用了 EKS,而不是 Loadnbalacer IP,因此我有一个具备网络负载均衡器的 DNS 端点,可以作为一个 CNAME。另外在 GKE 的情况下,您将得到一个 IP,在这种情况下,您需要自己创建一个 A 记录。

Not Found Image

# 7部署演示应用程序

为了测试 ingress,我们将部署一个演示用的应用程序(demo),并向其添加一个 ClusterIp 服务。此应用程序只能在没有 ingress 的集群内访问。

步骤 1:创建一个名为dev的命名空间:

kubectl create namespace dev
1

步骤 2:创建一个名为hello-app.yaml的文件。

步骤 3:复制以下内容并保存文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
  namespace: dev
spec:
  selector:
    matchLabels:
      app: hello
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

步骤 4:使用 kubectl 创建 deployment:

kubectl create -f hello-app.yaml

# 检查 deployment 状态
kubectl get deployments -n dev
1
2
3
4

步骤 5:创建一个名为hello-app-service.yaml的文件。

步骤 6:复制以下内容并保存文件。

apiVersion: v1
kind: Service
metadata:
  name: hello-service
  namespace: dev
  labels:
    app: hello
spec:
  type: ClusterIP
  selector:
    app: hello
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

步骤 7:使用 kubectl 创建 service。

kubectl create -f hello-app-service.yaml
1

# 8为应用程序创建Ingress对象

现在,让我们创建一个 ingress 对象,以使用 DNS 访问我们的 hello 应用程序。ingress 对象只不过是路由规则的设置。

如果您想知道 ingress 对象是如何连接到 Nginx 控制器的,ingress 控制器的 pod 会连接到 Ingress API 以检查规则,并相应地更新其nginx.conf。

由于我在 DNS 提供商中已经映射过通配符 DNS(*.apps.mlopshub.com)了,因此我将使用demo.apps.mlopshub.com指向 hello 应用服务。

步骤 1:创建一个名为ingress.yaml的文件。

步骤 2:复制以下内容并保存文件。

将demo.apps.mlopshub.com替换为您自己的域名。此外,我们正在dev命名空间中创建这个 ingress 对象,因为 hello 应用程序在dev命名空间中运行。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  namespace: dev
spec:
  ingressClassName: nginx
  rules:
  - host: "demo.apps.mlopshub.com"
    http:
      paths:
        - pathType: Prefix
          path: "/"
          backend:
            service:
              name: hello-service
              port:
                number: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

步骤 3:查看已创建 Ingress 对象的详情,检查其配置。

kubectl describe ingress -n dev
1

现在,如果我尝试访问demo.apps.mlopshub.com域,我将能够访问 hello 应用程序,如下所示。(您应该将其替换为您的域名)

Not Found Image

# 9TLS与Nginx Ingress

您可以为每个 ingress 对象配置 TLS 证书。但 TLS 将在 ingress 控制器层面终止效果。

下图展示了 ingress TLS 配置。TLS 证书需要作为 secret 对象添加。

Not Found Image

我写了一篇关于 Ingress TLS 配置的详细文章。

👉 查看在 Kubernetes 上配置 ingress TLS 的指南 (opens new window)。

# 10结论

在本文中,我们学习了如何设置 Nginx ingress 控制器。

这很容易上手。但是,对于项目实施,请确保您检查了所有 Nginx 配置并根据需求进行调优。

通过使用 Nginx 控制器中的 configmap,您可以配置所有 Nginx 选项,而无需重新部署控制器。

我希望你喜欢这份关于 Nginx ingress 控制器的指南。

在评论部分让我知道您的想法和疑问。

另外,如果您正在学习 Kubernetes,请查看我的全面 Kubernetes 教程 (opens new window)。

本文原作者:Bibin Wilson

https://devopscube.com/author/bibinwilson/

- name: 本文原作者:Bibin Wilson
  desc: https://devopscube.com/author/bibinwilson/
  bgColor: '#38b6ff'
  textColor: 'black'
1
2
3
4
编辑 (opens new window)
Ingress入门指南
如何为Ingress配置TLS、SSL证书

← Ingress入门指南 如何为Ingress配置TLS、SSL证书→

最近更新
01
API测试笔记
04-30
02
msfvenom
03-29
03
Metasploit
03-29
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Carsaid | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式