Redis działa na 6379, który nie jest portem HTTP (80,443). Musisz więc włączyć obsługę TCP/UDP w kontrolerze nginx. Dokumentacja minikube tutaj pokazuje, jak to zrobić dla redis.
Zaktualizuj mapy konfiguracji usług TCP i/lub UDP
Zapożyczając się z samouczka na temat konfigurowania usług TCP i UDP za pomocą kontrolera Ingress Nginx, będziemy musieli edytować mapę konfiguracji, która jest domyślnie instalowana po włączeniu dodatku minikube Ingress.
Istnieją 2 mapy konfiguracji, 1 dla usług TCP i 1 dla usług UDP. Domyślnie wyglądają tak:
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
Ponieważ te mapy konfiguracji są scentralizowane i mogą zawierać konfiguracje, najlepiej jest je tylko załatać, a nie całkowicie je nadpisać.
Użyjmy tego wdrożenia redis jako przykładu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
namespace: default
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis
imagePullPolicy: Always
name: redis
ports:
- containerPort: 6379
protocol: TCP
Utwórz plik redis-deployment.yaml
i wklej powyższą zawartość. Następnie zainstaluj wdrożenie redis za pomocą następującego polecenia:
kubectl apply -f redis-deployment.yaml
Następnie musimy stworzyć usługę, która może kierować ruch do naszych podów:
apiVersion: v1
kind: Service
metadata:
name: redis-service
namespace: default
spec:
selector:
app: redis
type: ClusterIP
ports:
- name: tcp-port
port: 6379
targetPort: 6379
protocol: TCP
Utwórz plik redis-service.yaml
i wklej powyższą zawartość. Następnie zainstaluj usługę redis za pomocą następującego polecenia:
kubectl apply -f redis-service.yaml
Aby dodać usługę TCP do kontrolera ruchu przychodzącego nginx, możesz uruchomić następujące polecenie:
kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6379":"default/redis-service:6379"}}'
Gdzie:
6379
:port, którego usługa powinna nasłuchiwać spoza maszyny wirtualnej minikube
default
:przestrzeń nazw, w której zainstalowana jest Twoja usługa
redis-service
:nazwa usługi
Możemy zweryfikować, czy nasz zasób został załatany za pomocą następującego polecenia:
kubectl get configmap tcp-services -n kube-system -o yaml
Powinniśmy zobaczyć coś takiego:
apiVersion: v1
data:
"6379": default/redis-service:6379
kind: ConfigMap
metadata:
creationTimestamp: "2019-10-01T16:19:57Z"
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: tcp-services
namespace: kube-system
resourceVersion: "2857"
selfLink: /api/v1/namespaces/kube-system/configmaps/tcp-services
uid: 4f7fac22-e467-11e9-b543-080027057910
Jedyną wartością, którą musisz sprawdzić, jest to, że pod właściwością danych znajduje się wartość, która wygląda tak:
"6379": default/redis-service:6379
Popraw kontroler Ingress-nginx
Jest jeszcze jeden ostatni krok, który należy wykonać, aby uzyskać łączność z zewnętrznego klastra. Musimy załatać nasz kontroler nginx, aby nasłuchiwał na porcie 6379 i mógł kierować ruch do Twojej usługi. Aby to zrobić, musimy utworzyć plik poprawki.
spec:
template:
spec:
containers:
- name: ingress-nginx-controller
ports:
- containerPort: 6379
hostPort: 6379
Utwórz plik o nazwie ingress-nginx-controller-patch.yaml
i wklej powyższą zawartość.
Następnie zastosuj zmiany za pomocą następującego polecenia:
kubectl patch deployment ingress-nginx-controller --patch "$(cat ingress-nginx-controller-patch.yaml)" -n kube-system