EDIT: Der Sinn meines Setups besteht darin, (wenn möglich) Folgendes zu erreichen:
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:
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.
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
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"]}}'
Wenn dies nur zum Testen ist, versuchen Sie es
kubectl port-forward service/nginx-service 80:80
Dann kannst du
curl http://localhost:80
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.
sie können die kube-keepalived-vip-Konfiguration verwenden, um den Verkehr zu routen. https://github.com/kubernetes/contrib/tree/master/keepalived-vip
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.