Kubernetes Kubectl更新服务选择器

时间:2019-02-17 16:26:40

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

我的Kubernetes集群在Google Cloud下运行。我已经部署了使用端口443运行的部署,并且LoadBalancer将其暴露给了Internet。

我是以这种方式创建的:

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

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

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

如何修补现有服务以指向另外一个部署,而又不会失去外部IP?

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

是的,您可以使用现有的服务来指向新的部署。

您需要做的就是使用新部署的服务标签来编辑服务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

答案 2 :(得分:2)

最后,找到了解决方法:

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