在 Kubernetes 中,Ingress 是一种 API 对象,它充当了集群中服务的入口。使用 Ingress 可以实现负载均衡、HTTPS 等功能。本文将详细介绍如何在 Kubernetes 中使用 Ingress 实现负载均衡和 HTTPS,并提供示例代码和指导意义。
什么是 Kubernetes Ingress
Kubernetes Ingress 是一种 Kubernetes API 对象,它定义了如何将 HTTP(S) 流量路由到 Kubernetes Service 中的不同路径。Ingress 可以实现负载均衡、HTTPS 等功能。Ingress 通常使用一个 Ingress Controller 来实现它所描述的规则。Ingress Controller 是一个独立的 Kubernetes 应用程序,它可以根据 Ingress 规则自动配置反向代理软件(如 Nginx、HAProxy 等)。
如何使用 Ingress 实现负载均衡和 HTTPS
安装 Ingress Controller
在 Kubernetes 中使用 Ingress 需要先安装 Ingress Controller。本文以 Nginx Ingress Controller 为例,演示如何安装和使用 Ingress。以下是安装步骤:
- 创建命名空间
apiVersion: v1 kind: Namespace metadata: name: ingress-nginx
- 添加 Ingress Controller Helm 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update
- 安装 Ingress Controller
helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx
安装完成后,可以通过以下命令查看 Ingress Controller 是否正常运行:
kubectl get pods -n ingress-nginx
配置 Ingress
下面是一个简单的 Ingress 配置示例,它将流量路由到两个不同的 Service:
// www.javascriptcn.com code example
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
name: http
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
name: http上面的 Ingress 配置将流量路由到 example.com 的 /service1 和 /service2 路径上。其中,nginx.ingress.kubernetes.io/rewrite-target 注解指定了重写目标为 /。
配置 HTTPS
使用 Ingress 还可以实现 HTTPS 加密通信。下面是一个简单的 Ingress 配置示例,它将流量路由到两个不同的 Service,并启用 HTTPS 加密通信:
// www.javascriptcn.com code example
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- example.com
secretName: example-tls-secret
rules:
- host: example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
name: http
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
name: http上面的 Ingress 配置启用了 HTTPS 加密通信,并使用 cert-manager 为 example.com 配置了 Let's Encrypt 证书。其中,nginx.ingress.kubernetes.io/ssl-redirect 注解指定了强制重定向到 HTTPS。
示例代码
下面是一个完整的示例代码,它演示了如何在 Kubernetes 中使用 Ingress 实现负载均衡和 HTTPS:
// www.javascriptcn.com code example
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
---
apiVersion: v1
kind: Service
metadata:
name: service1
namespace: ingress-nginx
spec:
type: ClusterIP
selector:
app: service1
ports:
- name: http
port: 80
---
apiVersion: v1
kind: Service
metadata:
name: service2
namespace: ingress-nginx
spec:
type: ClusterIP
selector:
app: service2
ports:
- name: http
port: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- example.com
secretName: example-tls-secret
rules:
- host: example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
name: http
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
name: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: service1
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: service1
template:
metadata:
labels:
app: service1
spec:
containers:
- name: service1
image: nginx:1.21-alpine
ports:
- name: http
containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: service2
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: service2
template:
metadata:
labels:
app: service2
spec:
containers:
- name: service2
image: nginx:1.21-alpine
ports:
- name: http
containerPort: 80指导意义
使用 Ingress 可以实现负载均衡、HTTPS 等功能,使得 Kubernetes 中的服务更加灵活和安全。本文介绍了如何在 Kubernetes 中使用 Ingress 实现负载均衡和 HTTPS,并提供了示例代码和指导意义,帮助读者更好地理解和应用 Ingress。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d1635fa941bf71342f4cdb