通过金山云负载均衡访问服务

最近更新时间:2020-08-27 14:19:16

您可以使用金山云负载均衡来访问服务

说明

容器服务提供了金山云的cloud-controller-manager,基于此,用户可以通过金山云的负载均衡(LoadBalancer,以下简称LB)把服务暴露出去。在使用之前,请先确认:

  • 集群中已经安装了cloud-controller-manager
    # kubectl get deployments -n kube-system
    NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    cloud-controller-manager   1         1         1            1           3h
  • 集群所属的VPC,安全组【入站规则】中已经放行对应的端口(这里放行了30000-32768端口,生产环境中可以根据业务实际情况放行) 通过金山云负载均衡访问服务

示例

以下通过几个示例,展示一些常见场景下,如何配置和使用LB,来满足不同的需求,首先,创建一个deployment.

nginx-deployment.yaml如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

创建nginx deployment

# kubectl apply -f nginx-deployment.yaml

通过负载均衡向公网暴露服务

这里我们使用金山云负载均衡向公网暴露服务 simple-svc.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: simple-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

创建服务,并获取服务的IP地址。

# kubectl apply -f simple-svc.yaml
# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
simple-svc   LoadBalancer   10.254.171.216   120.92.73.239   80:32733/TCP   11s

这里,我们创建了一个名为simple-svc的服务,并通过金山云的LB(指定type为LoadBalancer)将服务暴露出去。通过EXTERNAL-IP(120.92.73.239),我们可以访问这个服务。在控制台上,可以看到负载均衡列表里多了一个外网LB(IP地址为120.92.73.239,带宽为1m,计费方式为按日月结)。

金山云LB支持丰富的配置参数,为了使用这些配置,需要使用注释(annotations)。

创建HTTP类型的负载均衡

kubernetes的服务配置中,协议Protocol字段只支持TCP和UDP。如果想使用7层负载均衡,可以通过注释 service.beta.kubernetes.io/ksc-loadbalancer-protocol-port,注释的格式是“PROTOCOL:PORT”(PORT必须和spec:ports中的port一致) simple-svc.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/ksc-loadbalancer-protocol-port: "HTTP:80"
  labels:
    app: nginx
  name: simple-http-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

创建HTTPS类型的负载均衡

需要在金山云控制台申请一个证书,然后使用如下annotation创建一个HTTPS类型的LB, https-svc.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/ksc-loadbalancer-protocol-port: "HTTPS:443"
    service.beta.kubernetes.io/ksc-loadbalancer-cert-id: "your-cert-id"  
  labels:
    app: nginx
  name: https-lb
spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: nginx
  type: LoadBalancer

使用已有的负载均衡

通过LB暴露服务时,默认会创建一个新的LB。如果不创建新的而是使用一个已经存在的LB,需要在注释中指定LB的ID(注意,如果指定的LB的PORT已经被占用,在创建服务的过程中会删除此监听器)

支持多个Kubernetes Service复用同一个LB。限制如下:

  • Kubernetes通过Service自动创建的LB不能复用(会导致LB被意外删除)。只能复用您手动在控制台(或调用OpenAPI)创建的LB。

svc-using-existing-lb.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/ksc-loadbalancer-id: "your-lb-id"
  labels:
    app: nginx
  name: svc-using-existing-lb
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

使用内网LB

如果是内部服务,不需要将服务暴露在公网,可以使用内网LB。一种方法,是在控制台先创建好内网LB,然后通过注释指定这个LB的ID(参照上述-使用已有的LB)。另一种方法,在注释中指定LB的类型为internal,同时指定一个终端子网的ID,会新建一个内网LB将服务暴露出去。 internal-svc.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/ksc-loadbalancer-type: "internal"
    service.beta.kubernetes.io/ksc-loadbalancer-subnet-id: ""your-Reserve-id"
  labels:
    app: nginx
  name: internal-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

使用指定Label的worker节点作为后端服务器

多个Label以逗号分隔。例如"k1=v1,k2=v2"。多个label之间是and的关系。 如下所示,lb 只挂载有 "failure-domain.beta.kubernetes.io/zone=cn-beijing-6a" 标签的worker节点

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/ksc-loadbalancer-backend-label: "failure-domain.beta.kubernetes.io/zone=cn-beijing-6a"
  name: nginx
  namespace: default
spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
  selector:
    run: nginx
  type: LoadBalancer

注释列表

注释 描述 默认值
service.beta.kubernetes.io/ksc-loadbalancer-id 负载均衡实例的 ID。通过 loadbalancer-id 指定您已有的 SLB,已有 listener 会被覆盖, 删除 service 时该 SLB 不会被删除。
service.beta.kubernetes.io/ksc-loadbalancer-type 指定LB的类型,参考创建负载均衡OpenAPI中的Type字段。 public
service.beta.kubernetes.io/ksc-loadbalancer-subnet-id 创建内网LB时,需要指定endpoint子网。参考创建负载均衡OpenAPI中的SubnetId字段 -
service.beta.kubernetes.io/ksc-loadbalancer-bandwidth 外网IP的带宽,参考创建弹性IP OpenAPI中的BandWidth字段 1
service.beta.kubernetes.io/ksc-loadbalancer-charge-type 外网IP的计费方式,参考创建弹性IP OpenAPI中ChargeType字段 会根据用户已有的计费方式创建,优先选择后付费的方式PostPaidByDay
service.beta.kubernetes.io/ksc-loadbalancer-purchase-time 外网IP的购买时长,参考创建弹性IP OpenAPI中PurchaseTime字段
service.beta.kubernetes.io/ksc-loadbalancer-protocol-port 指定HTTP、HTTPS等协议。多个值之间由逗号分隔,比如:HTTPS:443,HTTP:80 -
service.beta.kubernetes.io/ksc-loadbalancer-method 监听器的转发方式,参考创建监听器OpenAPI中的Method字段 RoundRobin
service.beta.kubernetes.io/ksc-loadbalancer-cert-id 协议为HTTPS时,指定证书ID。参考创建监听器OpenAPI中的CertificateId字段 -
service.beta.kubernetes.io/ksc-loadbalancer-session-state 是否开启会话保持,参考创建监听器OpenAPI中的SessionState字段 start
service.beta.kubernetes.io/ksc-loadbalancer-session-persistence-period 会话保持超时时间,参考创建监听器OpenAPI中的SessionPersistencePeriod字段 3600
service.beta.kubernetes.io/ksc-loadbalancer-cookie-type 协议为HTTP时,指定cookie类型。参考创建监听器OpenAPI中的CookieType字段 ImplantCookie
service.beta.kubernetes.io/ksc-loadbalancer-cookie-name 协议为HTTP时,指定cookie名字。参考创建监听器OpenAPI中的CookieName字段 -
service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-state 是否开启健康检查,参考创建健康检查 OpenAPI中的HealthCheckState字段 stop
service.beta.kubernetes.io/ksc-loadbalancer-healthy-threshold 健康阈值,参考创建健康检查 OpenAPI中的HealthyThreshold字段 -
service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-interval 健康检查时间间隔,参考创建健康检查 OpenAPI中的Interval字段 -
service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-timeout 健康检查超时时间,参考创建健康检查 OpenAPI中的Timeout字段 -
service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-urlpath HTTP类型监听器健康检查的链接,参考创建健康检查 OpenAPI中的UrlPath字段 -
service.beta.kubernetes.io/ksc-loadbalancer-unhealthy-threshold 不健康阈值,参考创建健康检查 OpenAPI中的UnhealthyThreshold字段 -
service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-hostname HTTP类型健康检查的域名,参考创建健康检查 OpenAPI中的HostName字段 -
service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-is-default-hostname 参考创建健康检查 OpenAPI中的IsDefaultHostName字段 -

备注:

  • 请不要手动删除Kubernetes通过Service自动创建的LB
  • 请不要手动更改Kubernetes通过Service自动创建LB的监听器

金山云,开启您的云计算之旅

免费注册