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:
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é.
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.
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.