it-swarm.com.de

Weisen Sie einem Kubernetes-Dienst eine externe IP zu

EDIT: Der Sinn meines Setups besteht darin, (wenn möglich) Folgendes zu erreichen:

  • Ich habe mehrere K8s-Knoten
  • Wenn ich eine IP-Adresse (vom Netzwerk meines Unternehmens) kontaktiere, sollte sie an einen meiner Container/Pods/Services/was auch immer weitergeleitet werden.
  • Ich sollte in der Lage sein, diese IP-Adresse problemlos einzurichten (wie in meiner Service-.yml-Definition)

Ich führe einen kleinen Kubernetes-Cluster (mit kubeadm erstellt) aus, um zu überprüfen, ob ich mein Docker (altes) Swarm-Setup auf k8s verschieben kann. Die Funktion, die ich unbedingt brauche, ist die Möglichkeit, Containern IP zuzuweisen, wie ich es mit MacVlan mache.

In meinem aktuellen Docker-Setup verwende ich MacVlan, um einigen Containern IP-Adressen aus dem Netzwerk meines Unternehmens zuzuweisen, sodass ich direkt (ohne Reverse-Proxy) wie einen physischen Server erreichen kann. Ich versuche mit k8s etwas Ähnliches zu erreichen.

Ich habe herausgefunden, dass:

  • Ich muss Service verwenden
  • Ich kann den Typ LoadBalancernicht verwenden, da dies nur für kompatible Cloud-Anbieter (wie GCE oder AWS) gilt.
  • Ich sollte ExternalIPs verwenden
  • Ingress Resources sind eine Art Reverse Proxy?

Meine yaml-Datei lautet:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
      name: nginx-deployment
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - A.B.C.D

Ich habe gehofft, dass mein Dienst die IP A.B.C.D (die zu meinem Firmennetzwerk gehört) erhält. Meine Bereitstellung funktioniert, da ich meinen nginx-Container aus dem k8s-Cluster heraus mit ClusterIP erreichen kann.

Was vermisse ich ? Oder zumindest wo finde ich Informationen zum Netzwerkverkehr, um zu sehen, ob Pakete kommen?

EDIT:

$ kubectl get svc
NAME            CLUSTER-IP     EXTERNAL-IP       PORT(S)   AGE
kubernetes      10.96.0.1      <none>            443/TCP   6d
nginx-service   10.102.64.83   A.B.C.D           80/TCP    23h

Vielen Dank.

11
Jérôme Pin

Eine Lösung, die funktionieren könnte (und nicht nur zum Testen , obwohl sie ihre Mängel aufweist ), besteht darin, den Pod so einzustellen, dass er das Host-Netzwerk mit dem hostNetwork Spezifikationsfeld auf true gesetzt.

Dies bedeutet, dass Sie keinen Service benötigen, um Ihren Pod verfügbar zu machen, da er auf Ihrem Host immer über einen einzelnen Port (den containerPort, den Sie im Manifest angegeben haben) verfügbar ist. In diesem Fall muss kein DNS-Zuordnungsdatensatz geführt werden.

Dies bedeutet auch, dass Sie nur eine einzige Instanz dieses Pods auf einem bestimmten Knoten ausführen können (es geht um Mängel ...). Daher ist es ein guter Kandidat für ein DaemonSet -Objekt.

Wenn Ihr Pod weiterhin auf interne Kubernetes-Hostnamen zugreifen/diese auflösen muss, müssen Sie das Feld dnsPolicy spec auf ClusterFirstWithNoHostNet setzen. Mit dieser Einstellung kann Ihr Pod auf den K8S-DNS-Dienst zugreifen.

Beispiel:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx-reverse-proxy
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      tolerations:  # allow a Pod instance to run on Master - optional
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - image: nginx
        name: nginx
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

EDIT: Ich wurde dank der Ingress-Nginx-Dokumentation auf diese Spur gebracht

4
edouardtheron

Sie können einfach eine externe IP patchen

CMD: $ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'

Z.B:- $ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'

3
Manoj Gudipati

Wenn dies nur zum Testen ist, versuchen Sie es

kubectl port-forward service/nginx-service 80:80

Dann kannst du

curl http://localhost:80
2
Chuk Lee

Führen Sie zunächst diesen Befehl aus:

kubectl get -n namespace services

Der obige Befehl gibt die folgende Ausgabe zurück:

 NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
backend   NodePort   10.100.44.154         <none>          9400:3003/TCP   13h   
frontend        NodePort   10.107.53.39     <none>        3000:30017/TCP   13h

Aus der obigen Ausgabe geht hervor, dass den Diensten noch keine externen IPs zugewiesen sind. Führen Sie den folgenden Befehl aus, um dem Dienst Back-End externe IP-Adressen zuzuweisen.

 kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

und um frontend service eine externe IP zuzuweisen, führen Sie diesen Befehl aus.

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

Lassen Sie nun den Namespace-Service entweder die externe IP-Zuweisung überprüfen:

kubectl get -n namespace services

Wir bekommen eine Ausgabe wie diese:

NAME     TYPE     CLUSTER-IP     EXTERNAL-IP    PORT(S)             AGE
backend  NodePort 10.100.44.154  192.168.0.194  9400:3003/TCP       13h
frontend NodePort 10.107.53.39   192.168.0.194  3000:30017/TCP      13h

Prost!!! Kubernetes Externe IPs werden jetzt vergeben.

2
Umar Hayat

sie können die kube-keepalived-vip-Konfiguration verwenden, um den Verkehr zu routen. https://github.com/kubernetes/contrib/tree/master/keepalived-vip

1
sfgroups

Sie können versuchen, "type: NodePort" in Ihre yaml-Datei für den Dienst einzufügen. Anschließend haben Sie einen Port, über den Sie über den Webbrowser oder von außen darauf zugreifen können. Für meinen Fall hat es geholfen. 

0
Abu Shoeb