2016-06-16 11 views
0

Ich versuche auch, eine mysql-Serverinstanz auf einer lokalen kubernetes-Installation (1 Master und ein Knoten, beide auf oracle linux) verfügbar zu machen, aber nicht auf den Pod zugreifen zu können .Remote-Zugriff auf Kubernetes-Pod bei lokaler Installation aktivieren

Die pod Konfiguration ist dies:

apiVersion: v1 
kind: Pod 
metadata: 
    name: mysql 
    labels: 
    name: mysql 
spec: 
    containers: 
    - resources: 
     limits : 
      cpu: 1 
     image: docker.io/mariadb 
     name: mysql 
     env: 
     - name: MYSQL_ROOT_PASSWORD 
      value: 123456 
     ports: 
     - containerPort: 3306 
      name: mysql 

und der Service-Datei:

apiVersion: v1 
kind: Service 
metadata: 
    labels: 
    name: mysql 
    name: mysql 
spec: 
    type: NodePort 
    ports: 
    - port: 3306 
     targetPort: 3306 
     nodePort: 30306 
    selector: 
    name: mysql 

Ich kann sehen, dass der Pod läuft:

# kubectl get pod mysql 
NAME  READY  STATUS RESTARTS AGE 
mysql  1/1  Running 0   3d 

Und der Service ist verbunden mit einem Endpunkt:

# kubectl describe service mysql 
Name:   mysql 
Namespace:  default 
Labels:   name=mysql 
Selector:  name=mysql 
Type:   NodePort 
IP:   10.254.200.20 
Port:   <unset> 3306/TCP 
NodePort:  <unset> 30306/TCP 
Endpoints:  11.0.14.2:3306 
Session Affinity: None 
No events. 

Ich kann auf Netstat sehen, dass Kube-Proxy auf Port 30306 für alle eingehenden Verbindungen abgehört.

tcp6  6  0 :::30306    :::*     LISTEN  53039/kube-proxy 

Aber irgendwie bekomme ich keine Antwort von MySQL sogar auf dem localhost.

# telnet localhost 30306 
Trying ::1... 
Connected to localhost. 
Escape character is '^]'. 

Während einer normalen MySQL-Installation reagiert mit etwas von den folgenden:

$ telnet [REDACTED] 3306 
Trying [REDACTED]... 
Connected to [REDACTED]. 
Escape character is '^]'. 
N 
[REDACTED]-log�gw&TS(gS�X]G/Q,(#uIJwmysql_native_password^] 

Beachten Sie die mysql in der letzten Zeile Teil.

Ein letzter Punkt gibt es diese kubectl Ausgabe:

$ kubectl get service 
NAME   CLUSTER-IP  EXTERNAL-IP PORT(S) AGE 
kubernetes 10.254.0.1  <none>  443/TCP 9d 
mysql  10.254.200.20 nodes   3306/TCP 1h 

Aber ich verstehe nicht, was „Knoten“ bedeutet in der Spalte EXTERNAL-IP.

Also was ich will, ist, den Zugriff auf den MySQL-Dienst über die Master-IP zu öffnen (vorzugsweise). Wie mache ich das und was mache ich falsch?

Antwort

1

bin ich immer noch nicht sicher, wie Kunden auf einem einzigen Server verbinden zu machen, die transparent Routen alle Verbindungen zu den Schergen .

-> Dazu brauchen Sie einen Load Balancer, der leider kein Standard Kubernetes Building Block ist.

Sie müssen einen Reverse-Proxy einrichten, der den Datenverkehr an den Minion sendet, wie einen Nginx-Pod und einen Dienst, der hostPort: <port> verwendet, der den Port an den Host bindet. Das bedeutet, dass der Pod auf diesem Knoten bleiben muss, und dazu sollten Sie eine DaemonSet verwenden, die beispielsweise den Knotennamen als Selektor verwendet.

Offensichtlich ist dies nicht sehr fehlertolerant. Sie können also mehrere Reverse Proxys einrichten und DNS-Round-Robin-Auflösung verwenden, um Datenverkehr an einen der Proxy-Pods weiterzuleiten.

Irgendwo, irgendwann, brauchen Sie eine feste IP, um mit Ihrem Dienst über das Internet zu sprechen, also müssen Sie sicherstellen, dass es einen statischen Pod irgendwo gibt, um damit umzugehen.

1

Der NodePort ist auf jedem Knoten in Ihrem Cluster über den Kube-Proxy-Dienst verfügbar. Verwenden Sie zum Anschluss die IP des Hosts (node01) zu verbinden:

telnet [IpOfNode] 30306

+0

Aus irgendeinem Grund störte die Firewall mit Kubernetes-Proxy, ich konnte über Telnet auf dem Port verbinden, aber ich bekam keine Antwort vom Server. Ich bin mir immer noch nicht sicher, wie man Clients dazu bringt, sich mit einem einzigen Server zu verbinden, der alle Verbindungen zu den Minions transparent leitet. –