Skip to main content

k8s流量走向 3

无论使不使用外部,看上去内部是肯定需要的

确实,无论是否使用外部负载均衡器或反向代理,Kubernetes 集群内部通常也需要配置一些形式的负载均衡和反向代理机制,以确保流量能够正确地路由到对应的服务和 Pod。以下是内部负载均衡和反向代理在 Kubernetes 中的几种常见实现方式:

1. Kubernetes Service

Kubernetes Service 是集群内部负载均衡的核心组件。它提供了多种类型的服务,以满足不同的需求:

a. ClusterIP(默认类型)

  • 功能:在集群内部创建一个虚拟 IP 地址,其他 Pod 可以通过这个 IP 地址访问服务。
  • 适用场景:集群内部通信。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP

b. NodePort

  • 功能:在每个节点上打开一个特定的端口,外部流量可以通过这些端口访问服务。
  • 适用场景:允许外部流量通过节点 IP 和端口访问集群内部服务。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
nodePort: 30007

c. LoadBalancer

  • 功能:在云环境中,自动创建一个外部负载均衡器,并将流量转发到服务。
  • 适用场景:需要外部访问并且使用云提供商的负载均衡功能。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080

2. Ingress Controller

Ingress Controller 是 Kubernetes 内部的 HTTP/HTTPS 负载均衡和反向代理解决方案。它根据 Ingress 资源定义的规则,将流量路由到相应的服务。

a. 安装 Ingress Controller

可以使用不同的 Ingress Controller 实现,如 NGINX、Traefik、HAProxy 等。以下是安装 NGINX Ingress Controller 的示例:

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

b. 配置 Ingress 资源

定义 Ingress 资源以指定流量路由规则。

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

3. 内部反向代理(如 NGINX 或 HAProxy)

在某些情况下,你可能需要在 Kubernetes 内部部署一个反向代理(如 NGINX 或 HAProxy)来处理复杂的流量路由需求。

a. 部署 NGINX 作为反向代理

可以通过 Deployment 和 Service 部署 NGINX 并配置它作为反向代理。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: nginx-config
configMap:
name: nginx-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
events { }
http {
server {
listen 80;
location / {
proxy_pass http://my-service:80;
}
}
}
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

总结

无论是否使用外部负载均衡器或反向代理,Kubernetes 内部通常需要配置一些形式的负载均衡和反向代理机制。这些机制确保流量能够正确地路由到对应的服务和 Pod,提供高可用性和性能。常见的内部负载均衡和反向代理解决方案包括 Kubernetes Service、Ingress Controller 和内部反向代理(如 NGINX 或 HAProxy)。选择具体的实现方式取决于应用需求、流量模式和架构设计。