在搭建Kubernetes集群时,有时候需要将集群的节点暴露到公网,以便外部可以访问到相关的服务。本文将引导您如何实现在Kubernetes集群中通过公网IP搭建K8S。

### 步骤概览

下面是搭建Kubernetes集群并通过公网IP暴露的简要步骤:

| 步骤 | 操作 |
| ---- | ---- |
| 1. 安装Kubernetes集群 | 使用kubeadm安装Kubernetes集群 |
| 2. 部署Ingress Controller | 部署Ingress Controller将流量引导到服务 |
| 3. 为Ingress资源分配公网IP | 为Ingress资源指定公网IP地址 |
| 4. 暴露服务 | 创建Service,并通过Ingress来暴露服务 |

### 具体操作

#### 1. 安装Kubernetes集群

首先,您需要使用kubeadm来安装Kubernetes集群。在这里假设您已经成功安装并初始化了集群。接下来,您需要加入其他节点。例如:

```bash
kubeadm join : --token --discovery-token-ca-cert-hash
```

#### 2. 部署Ingress Controller

安装Ingress Controller来管理Kubernetes集群的入口流量。您可以使用nginx-ingress作为Ingress Controller。部署Ingress Controller的步骤如下:

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

#### 3. 为Ingress资源分配公网IP

现在,您需要为Ingress资源分配一个公网IP地址。您可以通过云服务商提供的负载均衡器或者MetalLB这样的工具来分配公网IP。以MetalLB为例,您可以通过以下步骤为Ingress资源配置公网IP:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
ingressClassName: nginx
loadBalancerSourceRanges:
- YOUR_PUBLIC_IP_RANGE
```

#### 4. 暴露服务

最后,您需要创建一个Service,并通过Ingress资源将服务暴露到公网。以下是创建Service的示例:

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

将服务暴露到公网:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
```

通过以上步骤,您已经成功在Kubernetes集群中通过公网IP搭建K8S并暴露服务。希望这篇文章对您有所帮助,如有疑问欢迁随时联系我。