我试图在kubernetes上部署nginx, kubernetes版本是v1.5.2, 我已经部署了nginx的3个副本,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仪表板上也在终端上显示为待定。


当前回答

我使用kubeadm创建了一个单节点k8s集群。当我尝试PortForward和kubectl代理时,它显示外部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

其他回答

检查kube-controller日志。我能够通过将clusterID标记设置为我部署集群的ec2实例来解决这个问题。

那些正在使用minikube并试图访问NodePort或LoadBalancer类服务的用户。

我们不能通过外部IP访问本地的服务 系统。所以一个好的选择是使用minikube IP

一旦您的服务公开,使用下面的命令获取minikube IP。

minikube service service-name --url

现在使用这个URL来达到你的目的。

如果你不在一个受支持的云上(aws, azure, gcloud等),你不能在没有MetalLB的情况下使用LoadBalancer https://metallb.universe.tf/ 但它还在测试阶段。

我也有同样的问题。 Windows 10 Desktop + Docker Desktop 4.7.1 (77678) + Minikube v1.25.2

根据我这边的官方文件,我决定:

PS C:\WINDOWS\system32> kubectl expose deployment sito-php --type=LoadBalancer --port=8080 --name=servizio-php
service/servizio-php exposed
PS C:\WINDOWS\system32> minikube tunnel
 * Tunnel successfully started

 * NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

 * Starting tunnel for service servizio-php.


PS E:\docker\apache-php> kubectl get service
NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes     ClusterIP      10.96.0.1      <none>        443/TCP          33h
servizio-php   LoadBalancer   10.98.218.86   127.0.0.1     8080:30270/TCP   4m39s

http://127.0.0.1:8080/上的开放浏览器

我在AWS EKS上也有同样的问题

问题是这样解决的:

Amazon虚拟私有云(Amazon VPC)的正确标记 子网 所需的AWS IAM (Identity and Access Management)权限 一个有效的Kubernetes服务定义Load 有足够的空闲IP地址 在子网上

需要确保以下标签 关键:kubernetes.io /集群/ yourEKSClusterName 价值:分享

关键:kubernetes.io /角色/ elb 值:1

关键:kubernetes.io /角色/ internal-elb 值:1

供参考,也确保sts是为您正在工作的区域启用sts设置可以在用户,区域设置下找到。