Nginx入口控制器无法到达后端服务?

时间:2020-01-16 17:28:25

标签: nginx kubernetes

我目前正在尝试通过入口控制器公开kubernetes服务,但是我似乎不能这样做吗?

主机/路径永远无法解析为我要使用的clusterIp和端口的奇怪原因是什么,尽管这应该已经通过我的入口控制器和资源来解决了?...

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes
  template:
    metadata:
      labels:
        app: hello-kubernetes
    spec:
      containers:
      - name: hello-kubernetes
        image: paulbouwer/hello-kubernetes:1.5
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-ingress-controller-conf
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: default
spec:
  replicas: 1
  revisionHistoryLimit: 3
  template:
    metadata:
      labels:
        app: nginx-ingress-lb
    spec:
      terminationGracePeriodSeconds: 60
      serviceAccount: nginx
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0
          imagePullPolicy: Always
          readinessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
          livenessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            timeoutSeconds: 5
          args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-backend-service
            - --configmap=$(POD_NAMESPACE)/nginx-ingress-controller-conf
            - --v=2
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
          - name: http 
            containerPort: 80
          - name: https
            containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      name: http
    - port: 443
      targetPort: 443
      name: https 
  selector:
    app: nginx-ingress
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: nginx-role
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - nodes
  - pods
  - secrets
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - update
  - watch
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - extensions
  resources:
  - ingresses/status
  verbs:
  - update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: nginx-role
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-role
subjects:
- kind: ServiceAccount
  name: nginx
  namespace: default
---
#Ingress ressource
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-hello
spec:
  rules:
  - host: dev.hello.com
    http:
      paths: 
      - backend:
          serviceName: hello-kubernetes
          servicePort: 80
---
##Default backend
apiVersion: v1
kind: Service
metadata:
  name: default-backend-service
  labels:
    app: default-backend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: default-backend
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: default-backend
  labels:
    app: default-http-backend
spec:
  selector:
    matchLabels:
      app: default-backend  
  serviceName: default-backend-service
  replicas: 2
  template:
    metadata:
      labels:
        app: default-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: default-backend
        image: gcr.io/google_containers/defaultbackend:1.0
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi
---

我尝试制作MVP-但由于某些原因,我无法解析路径dev.hello.com 我想用它来告诉入口我想连接到哪个服务...但是由于某种原因,它永远都无法解析为ip地址-它似乎没有命中任何东西?

为什么?这是设置不正确吗?

2 个答案:

答案 0 :(得分:0)

hello-kubernetes的服务不应为LoadBalancer类型,因为您希望入口作为Loadbalancer起作用。因此,将hello-kubernetes的服务更改为键入ClusterIP

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes

答案 1 :(得分:0)

很难理解您到底想要什么。您应该更加精确地确定自己想要的东西。

1。。通过ClusterIP进入。

就像Arghya Sadhu写道,在使用Ingress时,您无需指定LoadBalancer

2。进入NodePort

请记住,您也可以将NodePortIngress一起使用。 here可以很好地说明例子。

3。。入口YAML 根据官方Kubernetes Docs,最小的Ingress资源如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

在您的Ingress中找不到spec.rules.http.paths.path

4。 LoadBalancer的IP地址

同样重要的是您的集群在哪里。如果您使用的是On-Prem(例如GKE,AWS,AZURE等),那么您的LoadBalancer将自动获得externalIP,使您可以从外部连接到集群。但是,如果您使用的是本地计算机,则需要使用MetalLB

此外,请查看有关Connect a Front End to a Back End Using a Service的kubernetes文档。

也请检查this tutorial,这可能会对您有所帮助。