在Kubernetes(简称K8S)中使用NGINX作为反向代理是一种常见的做法,能够帮助我们实现负载均衡、安全性等功能。本文将详细介绍如何在K8S中使用NGINX代理服务,并为刚入行的小白开发者提供具体的步骤和代码示例。

### 实现NGINX代理K8S的流程

下面是整个流程的步骤,我们可以通过表格展示:

| 步骤 | 操作 |
|------|----------------------------------------------|
| 1 | 创建一个NGINX的Deployment并将其暴露为Service |
| 2 | 创建一个Ingress对象 |
| 3 | 部署NGINX Ingress Controller |
| 4 | 配置Ingress Controller所需的RBAC权限 |

### 操作步骤及代码示例

#### 1. 创建一个NGINX的Deployment并将其暴露为Service

首先,我们需要创建一个NGINX的Deployment,然后将其暴露为一个Service供外部访问。下面是需要执行的代码:

```yaml
# nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
# nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
```

解释:以上代码中,我们创建了一个名为`nginx-deployment`的Deployment,指定了副本数量为3,并创建了`nginx-service`用于暴露Deployment中的服务。

#### 2. 创建一个Ingress对象

接下来,我们需要创建一个Ingress对象,用于将外部流量引导到我们的NGINX服务上。下面是示例代码:

```yaml
# ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: example.com # 替换为你的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
```

解释:以上代码中,我们创建了一个名为`nginx-ingress`的Ingress对象,指定了将流量引导到`nginx-service`上,只要访问`example.com`域名下的任何路径都会被转发到NGINX服务上。

#### 3. 部署NGINX Ingress Controller

为了使Ingress对象生效,我们需要部署NGINX Ingress Controller。下面是部署命令:

```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
```

解释:上述命令将部署NGINX Ingress Controller,该Controller会自动读取Kubernetes中的Ingress对象进行流量的转发。

#### 4. 配置Ingress Controller所需的RBAC权限

为了确保Ingress Controller正常工作,我们还需要配置所需的RBAC权限。以下是RBAC配置代码示例:

```yaml
# rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
rules:
- apiGroups:
- ""
resources:
- services
- endpoints
- secrets
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-role
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: default
namespace: default
```

解释:以上代码中,我们创建了一个名为`nginx-ingress-clusterrole`的ClusterRole,并为默认的ServiceAccount分配相应的权限。

通过以上步骤,我们就成功实现了在Kubernetes中使用NGINX作为反向代理。希望这篇文章能帮助刚入行的小白开发者顺利完成NGINX代理K8S的配置。如果有任何疑问或困惑,欢迎随时进行咨询和讨论。