全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

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

最近更新时间:2024-06-12 12:51:49

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

前提条件

容器服务提供了金山云的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端口,生产环境中可以根据业务实际情况放行)。

    image.png

示例

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

nginx-deployment.yaml如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  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.xx.xx   80:32733/TCP   11s

这里,我们创建了一个名为simple-svc的服务,并通过金山云的LB(指定type为LoadBalancer)将服务暴露出去。通过EXTERNAL-IP(120.92.xx.xx),我们可以访问这个服务。在控制台上,可以看到负载均衡列表里多了一个外网LB(IP地址为120.92.xx.xx,带宽为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类型的负载均衡

创建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

LB直连Pod

金山云负载均衡支持容器(pod)作为后端服务器(Backend Server),在这种模式下,LB直接把流量转发到pod,无需通过kube-proxy中转。

注意:确保安全组入站规则已经放行targetPort对应的端口

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/ksc-loadbalancer-mode: pod
    service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-state: start
    service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-interval: "1"
    service.beta.kubernetes.io/ksc-loadbalancer-healthcheck-timeout: "1"
    service.beta.kubernetes.io/ksc-loadbalancer-healthy-threshold: "3"
    service.beta.kubernetes.io/ksc-loadbalancer-unhealthy-threshold: "3"
  labels:
    app: nginx
  name: svc-using-lb-pod
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: 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-master-slave

当监听器转发方式配置为MasterSlave模式时,用于指明后端服务器,通过逗号隔开,第一个为主机,第二个为备机

主机ID,备机ID

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字段

-

service.beta.kubernetes.io/ksc-loadbalancer-mode

开启直通pod模式,缺省为NodePort模式

-

service.beta.kubernetes.io/ksc-loadbalancer-real-server-count

控制监听器后挂载的后端服务器数量

默认值:100

注意:由KCE通过Service创建的LB和EIP建议通过Service来维护配置变更,创建后到LB或EIP控制台更改的配置无法与集群内Service配置同步,存在被Service配置覆盖的风险。

  • 请不要手动修改Kubernetes通过Service自动创建的EIP

  • 请不要手动删除Kubernetes通过Service自动创建的LB

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

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈