写在最前
为了提升服务的可维护性与灵活性我们总不能一直使用Kubernetes为Service提供的NodePort吧,为了避免暴露 NodePort 端口带来的管理和安全问题,我们通过 Ingress 配合负载均衡器,优雅地将域名请求映射到 Kubernetes 服务,实现流量的智能路由和高可用性。
1. 前置条件
1.1 配置kube-proxy
如果在 IPVS 模式下使用 kube-proxy,自 Kubernetes v1.14.2 起必须启用严格 ARP 模式,如果是deployment部署的kube-proxy则直接编辑configmap,如果是二进制部署的kube-proxy则自行去编辑kube-proxy.yaml配置文件。
kubectl edit configmap -n kube-system kube-proxy
vi /etc/kubernetes/kube-proxy.yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
2. 部署流程
2.1 metalLB
大于0.13.5的版本是不可以ping的,icmp协议已经关掉了
# 部署进集群
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
# 查看结果
[root@k8s-master1 kubernetes]# kubectl get po -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-5684477f66-8bzp5 1/1 Running 1 82s
speaker-9tl5t 1/1 Running 0 82s
speaker-cgzl7 1/1 Running 0 82s
speaker-j2szk 1/1 Running 0 82s
speaker-l5mkp 1/1 Running 0 82s
# 创建地址池
cat > metallb-ippool.yaml <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 172.31.0.240-172.31.0.250
EOF
# 开启二层通告
cat > l2.yaml <<EOF
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
EOF
2.2 openELB
2.3 ingress-nginx
可以看ingress-nginx篇章这里就不部署了,可以看到ingress-nginx已经成功识别到提供的负载均衡ip了。
Kubernetes构建指南:Ingress-nginx配置与实践
2.4 试验访问
其中要注意ingress的annotations要加上kubernetes.io/ingress.class: nginx
否则可能会失败。
cat > test-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1 # 设置副本数量,根据需求调整
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest # 替换为你实际的镜像地址
ports:
- containerPort: 80 # 配置应用的端口
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # 集群内部访问的端口
targetPort: 80 # 容器内部服务的端口
type: ClusterIP # 如果是集群内部访问使用 ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: nginx.uat.tanqidi.com # 配置域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service # 对应的 Service 名称
port:
number: 80
EOF
在window配置本地hosts加入172.31.0.240 nginx.uat.tanqidi.com
可以看到成功响应welcome to nginx,证明负载均衡对接ingress是正常的。