Проблемы с контроллером Nginx Ingress - PullRequest
0 голосов
/ 09 ноября 2019

Я установил кластер baremetal k8 (1 главный узел - Intel NUC и 2 рабочих узла на Raspberry pi). Мне удалось настроить балансировку нагрузки metal-lb и входной контроллер nginx. Я запустил два приложения, ghost (прослушивает порт по умолчанию 2368) и nextcloud (прослушивает порт 80 по умолчанию). Я пытаюсь получить доступ к приложениям из общедоступного ip myhomeserver.io (для доступа к приложению-призраку) и nextcloud.myhomeserver.io (для доступа к следующему облачному приложению). Я могу получить доступ к приложению-призраку, но не могу получить доступ к nextcloud. Ниже приведены файлы yaml для доступа и служб. Не уверен, где я иду не так.

kubectl get services --all-namespaces
NAMESPACE       NAME                TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
default         kubernetes          ClusterIP      10.96.0.1        <none>            443/TCP                      98d
ghost           ghost-service       ClusterIP      10.107.116.108   <none>            2368/TCP                     7h37m
ingress-nginx   ingress-nginx       LoadBalancer   10.109.177.223   192.168.178.200   80:31619/TCP,443:30365/TCP   7d23h
kube-system     kube-dns            ClusterIP      10.96.0.10       <none>            53/UDP,53/TCP,9153/TCP       98d
nextcloud       nextcloud-service   ClusterIP      10.105.24.162    <none>            8080/TCP                     137m

=============================================================================================================================
NAMESPACE   NAME                HOSTS                       ADDRESS           PORTS   AGE
ghost       ingress-ghost       myhomeserver.io             192.168.178.200   80      7d22h
nextcloud   ingress-nextcloud   nextcloud.myhomeserver.io   192.168.178.200   80      140m


=============================================================================================================================
cat ingress-object-ghost.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-ghost
  namespace: ghost

spec:
  rules:
  - host: myhomeserver.io
    http:
      paths:
      - backend:
          serviceName: ghost-service
          servicePort: 2368


=============================================================================================================================
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nextcloud
  namespace: nextcloud

spec:
  rules:
  - host: nextcloud.myhomeserver.io
    http:
      paths:
      - backend:
          serviceName: nextcloud-service
          servicePort: 8080

================================================================================================================================

cat ingress-object-nextcloud.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nextcloud
  namespace: nextcloud

spec:
  rules:
  - host: nextcloud.myhomeserver.io
    http:
      paths:
      - backend:
          serviceName: nextcloud-service
          servicePort: 8080
===================================================================================
apiVersion: apps/v1

kind: Deployment
metadata:
  name:
    deployment-nextcloud
  namespace: nextcloud
  labels:
    env: prod
    app: nextcloud-app

spec:
  template:
    metadata:
      name: nextcloud-app-pod
      labels:
        app:  nextcloud-app
        env:  production
    spec:
      containers:
        - name: nextcloud
          image: arm32v7/nextcloud
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
          volumeMounts:
           - mountPath: /var/www/html
             name: nextcloud-data
          securityContext:
            privileged: True


      volumes:
      - name: nextcloud-data
        persistentVolumeClaim:
          claimName: pvc-nextcloud
      nodeSelector:
        kubernetes.io/arch: arm

  replicas: 2
  selector:
    matchLabels:
      app: nextcloud-app


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

1 Ответ

2 голосов
/ 09 ноября 2019

Обратите внимание, что ваш входной контроллер nginx работает в пространстве имен ghost, поэтому он знает только о службе ghost. Вам нужно иметь другой входной контроллер для вашего пространства имен nextcloud, если вы хотите, чтобы вход был там. Если вам не нужен другой входной контроллер, вы можете разрешить службу nextcloud, нацелив ее на dns следующим образом servicename.namespacename.svc.cluster.local

С другой стороны, нет особого смысла так сильно делить ваши приложения. Kubernetes уже предоставляет вам достаточную конфиденциальность среди приложений в одном и том же пространстве имен.

ОБНОВЛЕНИЕ
Вход, который работает для вас, если у вас есть только 1 INGRESS CONTROLLER. Поскольку есть две службы, я добавил правило пути, которое будет переписано в /, чтобы каждая служба получала чистый URI. Используйте myhomeserver.io/ghost для достижения ghost и myhomeserver.io/nextcloud для достижения следующего облака.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-ghost
  namespace: ghost
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myhomeserver.io
    http:
      paths:
      - path: /ghost
        backend:
          serviceName: ghost-service
          servicePort: 2368
      - path: /nextcloud
        backend:
          serviceName: nextcloud-service.nextcloud.svc.cluster.local
          servicePort: 8080

ОБНОВЛЕНИЕ 2 Таким образом, ваш ingress controller работает в пространстве имен-призраков. Таким образом, ваш вход должен быть развернут в пространстве имен ghost. Обратите внимание на правила http для каждого хоста.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-ghost
  namespace: ghost
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myhomeserver.io
    http:
      paths:
      - path: /
        backend:
          serviceName: ghost-service
          servicePort: 2368
  - host: nextcloud.myhomeserver.io
    http:
      - path: /
        backend:
          serviceName: nextcloud-service.nextcloud.svc.cluster.local
          servicePort: 8080
...