【问题标题】:Kubernetes kubectl update service selectorKubernetes kubectl 更新服务选择器
【发布时间】:2019-02-17 16:26:39
【问题描述】:

我的 Kubernetes 集群在 Google Cloud 下运行。我有使用端口 443 运行的部署,并且 LoadBalancer 将其暴露给互联网。

我是这样创建的:

kubectl expose deployment my-app --target-port=443 --port=443 --type=LoadBalancer

运行此命令后,负载均衡器指向my-app 部署。现在我创建了my-app2,我想更改负载均衡器以指向新的部署(my-app2)。

注意:删除并重新创建部署正在释放外部 IP 地址,我想避免它。

如何在不丢失外部 IP 的情况下修补现有服务以指向另一个部署

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

    终于找到了解决办法:

    kubectl patch service old-app -p '{"spec":{"selector":{"app": "new-app"}}}'
    

    【讨论】:

      【解决方案2】:

      这在 GKE here 的教程中有所介绍。

      首先,您应该保留一个静态 IP 地址,以便在部署之间重复使用。

      您可以在 GCP 控制台或通过命令执行此操作,如下所示: gcloud compute addresses create helloweb-ip --region us-central1

      然后你可以找到你已经分配的静态IP地址: gcloud compute addresses describe helloweb-ip --region us-central1

      那么你应该在设置LoadBalancer 服务时使用这个IP 地址。在“命令式”命令中,您可以输入:

      kubectl expose deployment my-app --target-port=443 --port=443 --type=LoadBalancer --loadBalancerIP=YOUR.IP.ADDRESS.HERE

      随着设置变得更加复杂,YAML“声明性”表单很方便,也可以保存以备将来重复使用。例如:

      apiVersion: v1
      kind: Service
      metadata:
        name: helloweb
        labels:
          app: hello
      spec:
        selector:
          app: hello
          tier: web
        ports:
        - port: 80
          targetPort: 8080
        type: LoadBalancer
        loadBalancerIP: "YOUR.IP.ADDRESS.HERE"
      

      【讨论】:

        【解决方案3】:

        是的,您可以使用已经存在的服务来指向新的部署。

        您所要做的就是使用新部署的服务标签编辑服务 YAML。

        示例

        假设,您新部署了服务 yaml,如下所示。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nginx-deployment
          labels:
            app: nginx
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: nginx
          template:
            metadata:
              labels:
                app: my-app-2
            spec:
              containers:
              - name: nginx
                image: nginx:1.7.9
                ports:
                - containerPort: 80
        

        标签为

        template:
            metadata:
              labels:
                app: my-app-2
        

        如果您的服务如下:

        kind: Service
        apiVersion: v1
        metadata:
          name: my-app
        spec:
          type: LoadBalancer
          selector:
            app: my-app
          ports:
          - protocol: TCP
            port: 80
            targetPort: 80
        

        您只需要更改服务的选择器部分

        selector:
            app: my-app
        

        selector:
            app: my-app-2
        

        【讨论】:

        • 不错。如果不是新部署(现有)怎么办?
        • 那么您只需将现有部署的标签添加到服务的选择器
        • @No1Lives4Ever 有帮助吗?
        • 是的,这是一种解决方案。我更喜欢这里提到的其他解决方案。感谢您的帮助!
        猜你喜欢
        • 1970-01-01
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 2015-09-19
        相关资源
        最近更新 更多