写在最前

为了提升服务的可维护性与灵活性我们总不能一直使用Kubernetes为Service提供的NodePort吧,为了避免暴露 NodePort 端口带来的管理和安全问题,我们通过 Ingress 配合负载均衡器,优雅地将域名请求映射到 Kubernetes 服务,实现流量的智能路由和高可用性。

1. 前置条件

  1. Kubernetes 构建指南:二进制部署 v1.21.10

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协议已经关掉了

https://metallb.io/installation/
# 部署进集群
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配置与实践

image-nbbc.png

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是正常的。

图片-wari.png