Próbuję wdrożyć nginx na kubernetes, wersja kubernetes to 1.5.2, wdrożyłem nginx z 3 replikami, plik YAML jest poniżej,
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
revisionHistoryLimit: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
a teraz chcę ujawnić jego port 80 na porcie 30062 węzła, w tym celu utworzyłem usługę poniżej,
kind: Service
apiVersion: v1
metadata:
name: nginx-ils-service
spec:
ports:
- name: http
port: 80
nodePort: 30062
selector:
app: nginx
type: LoadBalancer
ta usługa działa dobrze, jak powinna, ale jest wyświetlana jako oczekująca nie tylko na pulpicie kubernetes, ale także na terminalu.
źródło
LoadBalancer
jako typu usługi, który jest prawidłowym typem usługi.NodePort
i czyingress
są inne sposoby na zrobienie tego, ale tak naprawdę nie rozwiązują problemu, prawda?LoadBalancer
?Jeśli używasz Minikube, istnieje magiczne polecenie!
Miejmy nadzieję, że ktoś może dzięki temu zaoszczędzić kilka minut.
Link referencyjny https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel
źródło
minikube tunnel
i faktycznie rozwiązujepending
problem, ale nowy zewnętrzny adres IP nie działa: pojawia się błądJeśli nie używasz GCE ani EKS (używałeś
kubeadm
), możesz dodaćexternalIPs
specyfikację do swojej usługi YAML. Możesz użyć adresu IP skojarzonego z podstawowym interfejsem węzła, na przykładeth0
. Następnie możesz uzyskać dostęp do usługi z zewnątrz, używając zewnętrznego adresu IP węzła.źródło
Aby uzyskać dostęp do usługi
minikube
, musisz uruchomić następujące polecenie:Więcej informacji tutaj: Minikube GitHub
źródło
Utworzyłem klaster K8s z jednym węzłem przy użyciu programu Kubeadm. Kiedy próbowałem PortForward i kubectl proxy , pokazała zewnętrznego IP jako oczekujące.
W moim przypadku poprawiłem usługę w ten sposób:
Następnie zaczął udostępniać za pośrednictwem publicznego adresu IP
źródło
Jeśli używasz minikube , nie zapomnij wspomnieć o przestrzeni nazw, jeśli nie używasz default.
usługa minikube << service_name >> --url --namespace = << namespace_name >>
źródło
Jeśli używasz minikube, uruchom poniższe polecenia z terminala,
źródło
Po odpowiedzi @ Javier. Zdecydowałem się na „łatanie zewnętrznego adresu IP” dla mojego modułu równoważenia obciążenia.
Spowoduje to zastąpienie tego „oczekującego” nowym, poprawionym adresem IP, którego możesz używać dla swojego klastra.
Więcej na ten temat. Proszę zobaczyć Karthik na post na wsparcie LoadBalancer z Minikube dla Kubernetes
Nie jest to najczystszy sposób. Potrzebowałem tymczasowego rozwiązania. Mam nadzieję, że to komuś pomoże.
źródło
Dodanie rozwiązania dla tych, którzy napotkali ten błąd podczas pracy na amazon-eks.
Przede wszystkim biegnij:
Następnie przejrzyj
events
pole w przykładowym wyniku poniżej:Przejrzyj komunikat o błędzie:
W moim przypadku przyczyną braku odpowiednich podsieci do utworzenia ELB były:
1: Klaster EKS został wdrożony w niewłaściwej grupie podsieci - podsieci wewnętrzne zamiast publicznych.
(*) Domyślnie usługi typu
LoadBalancer
tworzą publiczne moduły równoważenia obciążenia, jeśli nieservice.beta.kubernetes.io/aws-load-balancer-internal: "true"
podano adnotacji).2: Podsieci nie zostały oznaczone zgodnie z wymaganiami wymienionymi tutaj .
Tagowanie VPC za pomocą:
Oznaczanie podsieci publicznych za pomocą:
źródło
Użyj NodePort:
(Zanotuj port)
(IP-> Get the IP, gdzie master jest uruchomiony)
Twoja usługa jest dostępna pod adresem (IP) :( port)
źródło
ten sam problem:
Jest jednak dostępny pod adresem http://192.168.99.100:30454 .
źródło
Jeśli nie korzystasz z obsługiwanej chmury (aws, azure, gcloud itp.), Nie możesz używać LoadBalancer bez MetalLB https://metallb.universe.tf/, ale jest jeszcze w wersji beta ..
źródło
LoadBalancer ServiceType będzie działać tylko wtedy, gdy podstawowa infrastruktura obsługuje automatyczne tworzenie Load Balancerów i ma odpowiednią obsługę w Kubernetes, tak jak w przypadku Google Cloud Platform i AWS. Jeśli żadna taka funkcja nie jest skonfigurowana, pole adresu IP LoadBalancer nie jest wypełnione i nadal znajduje się w stanie oczekiwania, a Usługa będzie działać tak samo, jak usługa typu NodePort
źródło
Możesz załatać adres IP węzła, na którym hostowane są pody (prywatne IP węzła), jest to łatwe obejście.
Biorąc pod uwagę powyższe posty, następujące działały dla mnie:
usługa poprawki kubectl nazwa-usługi-usługi-obciążenia-obciążenia \ -n przestrzeń-nazw-usługi-lb \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx Private IP serwera fizycznego - węzeł - gdzie wdrażanie jest wykonywane "]}} '
źródło
Jeśli jest to Twój prywatny klaster K8s, MetalLB byłby lepszym rozwiązaniem. Poniżej znajdują się kroki.
Krok 1: Zainstaluj MetalLB w swoim klastrze
Krok 2: Skonfiguruj go za pomocą configmap
Krok 3: Utwórz usługę, aby uzyskać zewnętrzny adres IP (byłby to jednak prywatny adres IP).
FYR:
Przed instalacją MetalLB:
Po instalacji MetalLB:
źródło
Korzystając z Minikube, możesz uzyskać adres IP i port, przez który możesz uzyskać dostęp do usługi, uruchamiając:
Na przykład:
źródło
Sprawdź dzienniki kontrolera Kube. Udało mi się rozwiązać ten problem, ustawiając tagi clusterID na instancję ec2, w której wdrożyłem klaster.
źródło
Istnieją trzy typy udostępniania usługi Nodeport ClusterIP LoadBalancer
Kiedy używamy loadbalancera, zasadniczo prosimy naszego dostawcę usług w chmurze o podanie nam nazw DNS, do których można uzyskać dostęp online. Uwaga: nie nazwa domeny, ale DNS.
Więc typ loadbalancera nie działa w naszym lokalnym środowisku minikube.
źródło
Usunięcie istniejącej usługi i utworzenie tej samej nowej usługi rozwiązało moje problemy. Moje problemy polegają na tym, że zdefiniowany przeze mnie adres IP równoważenia obciążenia jest używany tak, że zewnętrzny punkt końcowy oczekuje. Kiedy zmieniłem nowy adres IP równoważenia obciążenia, nadal nie mógł działać.
Na koniec usuń istniejącą usługę i utwórz nową, rozwiązując mój problem.
źródło
W przypadku, gdy ktoś używa MicroK8: Potrzebujesz modułu równoważenia obciążenia sieciowego.
MicroK8s jest dostarczany z metallb, możesz go włączyć w następujący sposób:
<pending>
powinien zmienić się w rzeczywisty adres IP.źródło