kubernetes 서비스 외부 IP 보류


142

kubernetes에 nginx를 배포하려고하는데 kubernetes 버전은 v1.5.2이며 3 복제본으로 nginx를 배포했으며 YAML 파일은 다음과 같습니다.

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

이제 노드의 포트 30062에서 포트 80을 노출하려고합니다. 아래에서 서비스를 생성했기 때문입니다.

kind: Service
apiVersion: v1
metadata:
  name: nginx-ils-service
spec:
  ports:
    - name: http
      port: 80
      nodePort: 30062
  selector:
    app: nginx
  type: LoadBalancer

이 서비스는 정상적으로 작동하지만 터미널의 kubernetes 대시 보드뿐만 아니라 보류 중으로 표시됩니다. 터미널 출력대시 보드 상태

이 문제를 해결하도록 도와주세요. 감사 ...

답변:


177

당신이 (사용하여 사용자는 Kubernetes 클러스터를 사용하는 것 같습니다 minikube, kubeadm등). 이 경우 AWS 또는 Google Cloud와 달리 LoadBalancer가 통합되어 있지 않습니다. 이 기본 설정에서는 NodePortIngress Controller 또는 Ingress Controller 만 사용할 수 있습니다 .

Ingress Controller 를 사용하면 포드에 매핑되는 도메인 이름을 설정할 수 있습니다. LoadBalancer수신 컨트롤러를 사용하는 경우 서비스에 유형 을 제공 할 필요가 없습니다 .


정말 감사합니다 @javier 정말 도움이됩니다. 위의 문서에서 내 문제를 해결했습니다.
Pankaj Jackson

9
이 질문에 실제로 대답하지 않습니까? 사용자가 LoadBalancer유효한 서비스 유형 인 서비스 유형으로 사용하고 있습니다. NodePort그리고 ingress그것을하는 다른 방법이지만 실제로 문제를 해결하지는 않습니다.
랩터

2
유효한 서비스 유형이지만 호환되지 않는 플랫폼 (적어도 기본적으로)에서 사용되고 있습니다. LoadBalancer를 사용하려면 포드에 외부 IP를 제공 할 수있는 플랫폼이 있어야합니다. 이는 Google Cloud 또는 AWS에서 수행하는 것입니다.
하비에르 살 메론

2
AWS에서 kubeadm을 사용하고 있습니다. 여전히 그래도 LoadBalancer되나요?
jiashenC

3
minikube를 사용하는 경우 "minikube tunnel"을 실행하십시오. 이제 공용 IP를 얻을 수있는 서비스를 확인하십시오. 자세한 내용은 다음 문서를 참조하십시오. minikube.sigs.k8s.io/docs/tasks/loadbalancer
Ravi

73

Minikube를 사용하는 경우 마술 명령이 있습니다!

$ minikube tunnel

누군가가 이것으로 몇 분을 절약 할 수 있기를 바랍니다.

참조 링크 https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel


시도했지만 minikube tunnel실제로 문제가 pending해결되었지만 새 외부 IP가 작동하지 않습니다. 시간 초과 오류가 발생합니다 ...
a.barbieri

@ a.barbieri는 minikube ip 대신 터널 IP를 사용하고 있는지 확인하십시오. "IP 10.106.102.98로 진입-의 nginx 패치"
피터 저우

2
네, 피터 감사합니다. 시도 할 것이다. 어쨌든 Docker Desktop으로 전환하면 로컬 호스트에서 직접 작동하는 기본 설정 으로이 문제를 극복 할 수있었습니다.
a.barbieri

3
시연을위한 뛰어난 시간 절약 팁!
jgitter

49

GCE 또는 EKS (사용하지 않은)를 사용하지 않는 경우 서비스 YAML에 사양을 kubeadm추가 할 수 있습니다 externalIPs. 와 같은 노드의 기본 인터페이스와 관련된 IP를 사용할 수 있습니다 eth0. 그런 다음 노드의 외부 IP를 사용하여 외부에서 서비스에 액세스 할 수 있습니다.

...
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10

2
누락 된 정보가 있어야합니다. "외부 IP는 Kubernetes에 의해 관리되지 않으며 클러스터 관리자의 책임입니다." ( kubernetes.io/docs/concepts/services-networking/service ). 설치해야 할 "컨트롤러"가 있습니까?
다니엘 Alder

Kubernetes 튜토리얼 ( kubernetes.io/docs/tutorials/stateless-application/guestbook )을 따르고 있으며 kubeadm과 잘 작동했습니다
Eduardo

감사합니다-훌륭하고 예상대로 일했습니다. 클러스터 외부에서 액세스 할 수있는 네트워크의 네트워크 IP에 서비스를 노출했습니다.
Vlad Gulin


21

kubeadm을 사용하여 단일 노드 k8s 클러스터를 만들었습니다. PortForwardkubectl proxy를 시도했을 때 외부 IP가 보류중인 것으로 나타났습니다.

$ kubectl get svc -n argocd argocd-server
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-server   LoadBalancer   10.107.37.153   <pending>     80:30047/TCP,443:31307/TCP   110s

제 경우에는 다음과 같이 서비스를 패치했습니다.

kubectl patch svc <svc-name> -n <namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["172.31.71.218"]}}'

그 후 공개 IP를 통해 서비스를 시작했습니다.

$ kubectl get svc argo-ui -n argo
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
argo-ui   LoadBalancer   10.103.219.8   172.31.71.218   80:30981/TCP   7m50s

11
"172.31.71.218"의 출처는 무엇입니까?
EuRBamarth

마지막으로 패치하는 방법을 제공하는 답변. 공유해 주셔서 감사합니다.
Srikant

5

minikube 에서 실행중인 경우 default 를 사용하지 않는 경우 네임 스페이스를 언급하는 것을 잊지 마십시오.

minikube 서비스 << service_name >> --url --namespace = << namespace_name >>


4

minikube를 사용하는 경우 터미널에서 아래 명령을 실행하십시오.

$ minikube ip
$ 172.17.0.2 // then 
$ curl http://172.17.0.2:31245
or simply
$ curl http://$(minikube ip):31245

2

같은 문제 :

os> kubectl은 svc 오른쪽 세이버 토스 워드 프레스를 얻을

이름 유형 CLUSTER-IP 외부 -IP 포트 (S)
오른쪽 세이버-워드 프레스 세이버 PressBalancer 10.97.130.7 "보류 중"80 : 30454 / TCP, 443 : 30427 / TCP

os> minikube 서비스 목록

| ------------- | ---------------------------- | ------ -------------------------- |

| NAMESPACE | 이름 | URL |

| ------------- | ---------------------------- | ------ -------------------------- |

| 기본 | 쿠 버네 티스 | 노드 포트가 없습니다 |

| 기본 | 오른쪽 sabertooth-mariadb | 노드 포트가 없습니다 |

| 기본 | 오른쪽 세이버 투스 워드 프레스 | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| 구베 시스템 | kube-dns | 노드 포트가 없습니다 |

| 구베 시스템 | 경운기 | 노드 포트가 없습니다 |

| ------------- | ---------------------------- | ------ -------------------------- |

그러나 http://192.168.99.100:30454 를 통해 액세스 할 수 있습니다.


2

@Javier의 답변을 따름. 로드 밸런서에 "외부 IP 패치"를 사용하기로 결정했습니다.

 $ kubectl patch service my-loadbalancer-service-name \
-n lb-service-namespace \
-p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.39.25"]}}'

이것은 'pending'을 클러스터에 사용할 수있는 새로운 패치 된 IP 주소로 대체합니다.

이것에 대한 자세한 내용. Kubernetes 용 Minikube를 사용한 LoadBalancer 지원에 대한 karthik 게시물을 참조하십시오

가장 깨끗한 방법은 아닙니다. 임시 솔루션이 필요했습니다. 이것이 누군가를 돕기를 바랍니다.


1

NodePort를 사용하십시오.

kubectl run user-login --replicas = 2 --labels = "run = user-login"--image = kingslayerr / teamproject : version2 --port = 5000

kubectl 노출 배포 사용자 로그인 --type = NodePort --name = user-login-service

kubectl은 서비스 사용자 로그인 서비스를 설명합니다 (포트를 적어 두십시오).

kubect cluster-info (IP-> 마스터가 실행중인 IP 가져 오기)

귀하의 서비스는 (IP) :( 포트)에서 액세스 할 수 있습니다


1

Minikube를 사용할 때 minikube service kubia-http를 실행하여 서비스에 액세스 할 수있는 IP 및 포트를 얻을 수 있습니다.



1

LoadBalancer ServiceType은 기본 인프라가 자동로드 밸런서 생성을 지원하고 Google Cloud Platform 및 AWS와 마찬가지로 Kubernetes에서 각각 지원하는 경우에만 작동합니다. 이러한 기능이 구성되어 있지 않으면 LoadBalancer IP 주소 필드가 채워지지 않고 여전히 보류 상태에 있으며 서비스는 NodePort 유형 서비스와 동일한 방식으로 작동합니다


1

포드가 호스팅되는 노드의 IP (노드의 개인 IP)를 패치 할 수 있습니다. 이는 쉬운 해결 방법입니다.

위의 게시물을 참조하여 다음과 같이 나를 위해 일했습니다.

kubectl 패치 서비스 my-loadbalancer-service-name \ -n lb-service-namespace \ -p '{ "spec": { "type": "LoadBalancer", "externalIPs": [ "xxx.xxx.xxx.xxx 개인 물리적 서버의 IP-노드-배포가 완료된 위치 "]}} '


0

기존 서비스를 삭제하고 동일한 새 서비스를 작성하여 문제를 해결했습니다. 내 문제는 내가 정의한로드 밸런싱 IP가 외부 엔드 포인트가 보류되도록 사용된다는 것입니다. 새로운로드 밸런싱 IP를 변경해도 여전히 작동하지 않습니다. 마지막으로 기존 서비스를 삭제하고 새 서비스를 만들어 내 문제를 해결하십시오.


0

kube 컨트롤러 로그를 확인하십시오. clusterID 태그를 클러스터를 배포 한 ec2 인스턴스로 설정하여이 문제를 해결할 수있었습니다.


0

개인 k8 클러스터 인 경우 MetalLB가 더 적합합니다. 단계는 다음과 같습니다.

1 단계 : 클러스터에 MetalLB 설치

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

2 단계 : 구성 맵을 사용하여 구성

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.42.42.100-172.42.42.105 #Update this with your Nodes IP range 

3 단계 : 외부 IP를 얻기위한 서비스를 만듭니다 (비공개 IP 일 수도 있음).

FYR :

MetalLB 설치 전 : 여기에 이미지 설명을 입력하십시오

MetalLB 설치 후 : 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


0

실행 중에이 오류가 발생한 사용자를위한 솔루션 추가 .

우선 모든 실행 :

kubectl describe svc <service-name>

그런 다음 events아래 예제 출력 의 필드 를 검토하십시오 .

Name:                     some-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"some-service","namespace":"default"},"spec":{"ports":[{"port":80,...
Selector:                 app=some
Type:                     LoadBalancer
IP:                       10.100.91.19
Port:                     <unset>  80/TCP
TargetPort:               5000/TCP
NodePort:                 <unset>  31022/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                  Age        From                Message
  ----     ------                  ----       ----                -------
  Normal   EnsuringLoadBalancer    68s  service-controller  Ensuring load balancer
  Warning  SyncLoadBalancerFailed  67s  service-controller  Error syncing load balancer: failed to ensure load balancer: could not find any suitable subnets for creating the ELB

오류 메시지를 검토하십시오.

Failed to ensure load balancer: could not find any suitable subnets for creating the ELB

필자의 경우 ELB 작성에 적합한 서브넷이 제공되지 않은 이유는 다음과 같습니다.

1 : EKS 클러스터가 잘못된 서브넷 그룹 (공개 연결 대신 내부 서브넷)에 배포되었습니다.
(*) 기본적으로 주석이 제공 LoadBalancer되지 않은 유형의 서비스는 퍼블릭로드 밸런서를 만듭니다 service.beta.kubernetes.io/aws-load-balancer-internal: "true".

2 : 여기에 언급 된 요구 사항에 따라 서브넷에 태그가 지정되지 않았습니다 .

VPC에 태그 지정 :

Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared

다음을 사용하여 퍼블릭 서브넷 태그 지정 :

Key: kubernetes.io/role/elb
Value: 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.