如何让 My First ingress 在裸机 NodeIP 上运行?

How to make My First ingress work on baremetal NodeIP?

我有豆荚:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
  namespace: dev
spec:
  selector:
    matchLabels:
      app: hello
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"

制作服务:

---
apiVersion: v1
kind: Service
metadata:
  name: hello-service
  namespace: dev
  labels:
    app: hello
spec:
  type: ClusterIP
  selector:
    app: hello
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP

检查一下:

---
apiVersion: v1
kind: Service
metadata:
  name: hello-node-service
  namespace: dev
spec:
  type: NodePort
  selector:
    app: hello
  ports:
    - port: 80
      targetPort: 8080

$ kubectl get svc -n dev

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
hello-node-service   NodePort    10.233.3.50     <none>        80:31263/TCP   9h
hello-service        ClusterIP   10.233.45.159   <none>        80/TCP         44h

$ curl -I http://cluster.local:31263

HTTP/1.1 200 OK
Date: Sat, 11 Sep 2021 07:31:28 GMT
Content-Length: 66
Content-Type: text/plain; charset=utf-8

我已验证该服务正在运行。

使用 NodeIP 安装 ingress (https://kubernetes.github.io/ingress-nginx/deploy/):

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml

$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch

NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-7gsft       0/1     Completed   0          10h
ingress-nginx-admission-patch-qj57b        0/1     Completed   1          10h
ingress-nginx-controller-8cf5559f8-mh6fr   1/1     Running     0          10h

$ kubectl get svc -n ingress-nginx

NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.233.52.118   <none>        80:30377/TCP,443:31682/TCP   10h
ingress-nginx-controller-admission   ClusterIP   10.233.51.175   <none>        443/TCP                      10h

检查一下:

$ curl -I http://cluster.local:30377/healthz

HTTP/1.1 200 OK
Date: Sat, 11 Sep 2021 07:39:04 GMT
Content-Type: text/html
Content-Length: 0
Connection: keep-alive

进入:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
   name: ingress-hello
   namespace: dev
spec:
  rules:
  - host: cluster.local
    http:
      paths:
      - backend:
          service:
            name: hello-service
            port:
              number: 80
        path: "/hello"
        pathType: Prefix

检查一下:

$ curl -I http://cluster.local:30377/hello
HTTP/1.1 404 Not Found
Date: Sat, 11 Sep 2021 07:40:43 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive

这是行不通的。我花了几天时间,尝试将 ExternalIP 添加到入口控制器。

请问哪位有过设置ingress的经验,我哪里做错了? =(((

关于集群的信息: $ kubectl get ingress -n dev

NAME            CLASS    HOSTS           ADDRESS   PORTS   AGE
ingress-hello   <none>   cluster.local             80      10h

$ kubectl 获取节点

NAME               STATUS   ROLES                  AGE   VERSION
kuber-ingress-01   Ready    worker                 10d   v1.21.3
kuber-master1      Ready    control-plane,master   10d   v1.21.3
kuber-master2      Ready    control-plane,master   10d   v1.21.3
kuber-master3      Ready    control-plane,master   10d   v1.21.3
kuber-node-01      Ready    worker                 10d   v1.21.3
kuber-node-02      Ready    worker                 10d   v1.21.3
kuber-node-03      Ready    worker                 10d   v1.21.3

库存:

kuber-master1 10.0.57.31
kuber-master2 10.0.57.32
kuber-master3 10.0.57.33
kuber-node-01 10.0.57.34
kuber-node-02 10.0.57.35
kuber-node-03 10.0.57.36
kuber-ingress-01 10.0.57.30

$ 平 cluster.local

PING cluster.local (10.0.57.30) 56(84) bytes of data.
64 bytes from ingress.example.com (10.0.57.30): icmp_seq=1 ttl=62 time=0.603 ms

解决方法是在ingress-annotation中添加如下内容。 然后入口控制器开始查看 DNS 地址。

  annotations:
      kubernetes.io/ingress.class: nginx
      nginx.ingress.kubernetes.io/ssl-redirect: "false"
      nginx.ingress.kubernetes.io/use-regex: "true"
      nginx.ingress.kubernetes.io/rewrite-target: /

另外,为方便起见,将路径:/更改为正则表达式:

            - path: /v1(/|$)(.*)