Estou tentando implantar o nginx no kubernetes, a versão do kubernetes é v1.5.2, implantei o nginx com 3 réplicas, o arquivo YAML está abaixo,
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
e agora quero expor sua porta 80 na porta 30062 do nó, para isso criei um serviço abaixo,
kind: Service
apiVersion: v1
metadata:
name: nginx-ils-service
spec:
ports:
- name: http
port: 80
nodePort: 30062
selector:
app: nginx
type: LoadBalancer
este serviço está funcionando bem como deveria, mas está sendo exibido como pendente não apenas no painel do kubernetes, mas também no terminal.
então, por favor me ajude a resolver esse problema. Obrigado ...
fonte
LoadBalancer
como um tipo de serviço que é um tipo de serviço válido.NodePort
eingress
existem outras maneiras de fazer isso, mas realmente não resolvendo o problema, certo?LoadBalancer
?Se você estiver usando o Minikube, há um comando mágico!
Espero que alguém possa economizar alguns minutos com isso.
Link de referência https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel
fonte
minikube tunnel
e ele realmente resolve opending
problema, mas, em seguida, o novo IP externo não funciona: eu recebo um erro de tempo limite ...Se você não estiver usando GCE ou EKS (você usou
kubeadm
), poderá adicionar umaexternalIPs
especificação ao seu serviço YAML. Você pode usar o IP associado à interface principal do seu nó, comoeth0
. Você pode acessar o serviço externamente, usando o IP externo do nó.fonte
Para acessar um serviço
minikube
, é necessário executar o seguinte comando:Mais informações aqui: Minikube GitHub
fonte
Criei um cluster k8s de nó único usando o kubeadm. Quando tentei o PortForward e o proxy kubectl , ele mostrou o IP externo como pendente.
No meu caso, corrigi o serviço assim:
Depois disso, ele passou a servir pelo IP público
fonte
Se estiver executando no minikube , não esqueça de mencionar o namespace se você não estiver usando o padrão.
serviço minikube << service_name >> --url --namespace = << namespace_name >>
fonte
Se você estiver usando o minikube, execute os comandos abaixo no terminal,
fonte
o mesmo problema:
É, no entanto, acessível através desse http://192.168.99.100:30454 .
fonte
Seguindo a resposta de @ Javier. Eu decidi ir com "corrigindo o IP externo" para o meu balanceador de carga.
Isso substituirá o 'pendente' por um novo endereço IP corrigido que você pode usar para o seu cluster.
Para mais sobre isso. Consulte a publicação de karthik no suporte ao LoadBalancer com o Minikube for Kubernetes
Não é a maneira mais limpa de fazer isso. Eu precisava de uma solução temporária. Espero que isso ajude alguém.
fonte
Use o NodePort:
kubectl executar login do usuário --replicas = 2 - etiquetas = "executar = login do usuário" --image = kingslayerr / teamproject: version2 --port = 5000
kubectl expõe a implantação user-login --type = NodePort --name = user-login-service
O kubectl descreve os serviços user-login-service (Observe a porta)
informações do cluster kubect (IP-> Obter o IP onde o mestre está sendo executado)
Seu serviço está acessível em (IP) :( porta)
fonte
Ao usar o Minikube, você pode obter o IP e a porta através da qual pode acessar o serviço executando o serviço minikube kubia-http.
fonte
Se você não estiver em uma nuvem suportada (aws, azure, gcloud etc.), não poderá usar o LoadBalancer sem o MetalLB https://metallb.universe.tf/, mas ainda está na versão beta ..
fonte
O LoadBalancer ServiceType funcionará apenas se a infraestrutura subjacente suportar a criação automática de balanceadores de carga e tiver o respectivo suporte no Kubernetes, como é o caso do Google Cloud Platform e da AWS. Se nenhum desses recursos estiver configurado, o campo Endereço IP do LoadBalancer não será preenchido e ainda estará no status pendente, e o Serviço funcionará da mesma maneira que um Serviço do tipo NodePort
fonte
Você pode corrigir o IP do nó em que os pods estão hospedados (IP privado do nó), essa é a solução fácil.
Tomando referência às postagens acima, a seguir funcionou para mim:
serviço de patch kubectl my-loadbalancer-service-name \ -n lb-service-namespace \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx particular IP do servidor físico - Nó - onde a implantação é feita "]}} '
fonte
excluir o serviço existente e criar um mesmo novo serviço resolveu meus problemas. Meu problema é que o balanceamento de carga que Ip I define é usado para que o endpoint externo esteja pendente. Quando alterei um novo IP de balanceamento de carga, ele ainda não funcionava. Por fim, exclua o serviço existente e crie um novo resolvido meu problema.
fonte
Verifique os logs do controlador kube. Consegui resolver esse problema definindo as tags clusterID na instância ec2 na qual implantei o cluster.
fonte
Se for o seu cluster privado do k8s, o MetalLB seria mais adequado. Abaixo estão os passos.
Etapa 1: instalar o MetalLB no seu cluster
Etapa 2: Configure usando um configmap
Etapa 3: crie seu serviço para obter um IP externo (seria um IP privado).
ARJ:
Antes da instalação do MetalLB:
Após a instalação do MetalLB:
fonte
Adicionando uma solução para aqueles que encontraram esse erro enquanto executavam no amazon-eks.
Antes de tudo, execute:
E revise o
events
campo no exemplo de saída abaixo:Revise a mensagem de erro:
No meu caso, o motivo pelo qual não foram fornecidas sub-redes adequadas para a criação do ELB foi:
1: O cluster EKS foi implantado no grupo de sub-redes errado - sub-redes internas em vez de voltadas para o público.
(*) Por padrão, serviços do tipo
LoadBalancer
criam balanceadores de carga voltados para o público se nenhumaservice.beta.kubernetes.io/aws-load-balancer-internal: "true"
anotação foi fornecida).2: As sub-redes não foram marcadas de acordo com os requisitos mencionados aqui .
Marcando a VPC com:
Marcando sub-redes públicas com:
fonte