我试图在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仪表板上也在终端上显示为待定。


当前回答

如果它是您的私有k8s集群,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:使用configmap配置它

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后:

其他回答

如果在minikube上运行,如果不使用default,不要忘记提到namespace。

Minikube service << service_name >>——url——namespace=<< namespace_name >>

如果你正在使用minikube,那么从终端运行下面的命令,

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

对于您的用例,最好的选择是使用NordPort服务而不是loadbalancer类型,因为loadbalancer不可用。

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

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

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

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

minikube service service-name --url

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