最近更新时间: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
以下通过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)。完整注释请参考后文附表。
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的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以逗号分隔。例如"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
金山云负载均衡支持容器(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的监听器
纯净模式