web-dev-qa-db-fra.com

Comment faire pour que Kubernetes Ingress Port 80 fonctionne sur un cluster à nœud unique baremetal

J'ai un kubernetes en métal nu (v1.11.0) cluster créé avec kubeadm et fonctionnant correctement sans aucun problème. Réseau avec calico et en a fait un cluster à nœud unique en utilisant la commande kubectl taint nodes. (un nœud unique est une exigence).

J'ai besoin d'exécuter l'image statique de site Web mydockerhub/sampleweb sur le port d'hôte 80. Supposons que l'adresse IP du serveur ubuntu exécutant ce kubernetes est 192.168.8.10.

Comment rendre mon site Web statique disponible sur 192.168.8.10:80 ou un nom d'hôte qui lui est mappé sur le serveur DNS local? (Exemple: frontend.sampleweb.local:80). Plus tard, je dois exécuter d'autres services sur un port différent mappé sur un autre sous-domaine. (Exemple: backend.sampleweb.local:80 qui route vers un service exécuté sur le port 8080).

J'ai besoin de savoir:

  1. Puis-je y parvenir sans équilibreur de charge?
  2. Quelles ressources nécessaires pour créer? (entrée, déploiement, etc.)
  3. Quelles configurations supplémentaires sont nécessaires sur le cluster? (politique de réseau, etc.)

    Très apprécié si des exemples de fichiers yaml sont fournis.

Je suis nouveau dans le monde de Kubernetes. J'ai reçu des exemples de déploiements kubernetes (comme sock-shop ) fonctionnant de bout en bout sans aucun problème. J'ai essayé NodePort pour accéder au service mais au lieu de l'exécuter sur un port différent, je dois l'exécuter exactement sur le port 80 sur l'hôte. J'ai essayé de nombreuses solutions d'entrée mais n'ai pas fonctionné.

Capture d'écran de ma configuration:
enter image description here

12
sith

J'ai récemment utilisé traefik.io pour configurer un projet avec des exigences similaires aux vôtres.

Je vais donc montrer une solution de base avec traefik et les entrées.

J'ai dédié tout un espace de noms (vous pouvez utiliser kube-system), appelé traefik, et créé un service kubernetesAccount:

apiVersion: v1
kind: Namespace
metadata:
  name: traefik
---
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: traefik
  name: traefik-ingress-controller

Le contrôleur traefik qui est invoqué par les règles d'entrée nécessite un ClusterRole et sa liaison:

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  namespace: traefik
  name: traefik-ingress-controller

Le contrôleur traefin sera déployé en tant que daemonset (c'est-à-dire par définition un pour chaque nœud de votre cluster) et un service Kubernetes est dédié au contrôleur:

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: traefik
  labels:
    k8s-app: traefik-ingress-lb
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - name: traefik-ingress-lb
        image: traefik
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
---
kind: Service
apiVersion: v1
metadata:
  namespace: traefik
  name: traefik-ingress-service
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

La dernière partie vous oblige à créer un service pour chaque microservice de votre projet, voici un exemple:

apiVersion: v1
kind: Service
metadata:
  namespace: traefik
  name: my-svc-1
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80 
    targetPort: 8080

ainsi que l'entrée (ensemble de règles) qui transmettra la demande au service approprié:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: traefik
  name: ingress-ms-1
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - Host: my-address-url
    http:
      paths:
      - backend:
          serviceName: my-svc-1
          servicePort: 80

Dans cette entrée, j'ai écrit une URL d'hôte, ce sera le point d'entrée dans votre cluster, vous devez donc résoudre le nom de votre nœud K8S maître. Si vous avez plus de nœuds qui pourraient être maîtres, un équilibreur de charge est suggéré (dans ce cas, l'URL de l'hôte sera le LB).

Jetez un œil à la documentation kubernetes.io pour avoir des concepts clairs pour kubernetes. traefik.io est également utile.

J'espère que ceci vous aide.

10
Nicola Ben

En plus de la réponse de Nicola Ben, vous devez définir un externalIPs dans votre service traefik, suivez simplement les étapes de Nicola Ben et ajoutez une section externalIPs au service "my-svc-1".

apiVersion: v1
kind: Service
metadata:
  namespace: traefik
  name: my-svc-1
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80 
    targetPort: 8080
  externalIPs:
  - <IP_OF_A_NODE>

Et vous pouvez définir plus que sur externalIP.

2
mmbenyoub