背景信息
Kubernetes Service是一组具有相同标签的 Pod 集合的抽象,可以简单地理解为集群内的负载均衡器,集群内外的各个服务可以通过 Service 进行互相通信。不同类型的 Service 适合不同的场景,本文将重点讨论每种类型的 Service 的适用场景以及 kube-proxy 如何实现 Service 的负载均衡。
前提条件
- 确保您已经创建SCE集群,具体操作请参阅创建SCE集群。
- 确保kubectl工具已经连接目标集群。
- 假设您在一个K8S的集群里面发布了两个应用,前端应用frontend和后端应用backend,前端应用要访问后端应用。
- 确保您的SCE集群已安装CoreDNS插件。
实现原理
Service和iptables模式的kube-proxy在kubernetes集群中的工作原理如下:
操作步骤
步骤一:创建后端应用和前端应用
这里使用nginx代表后端应用,部署2个副本;busybox代表前端应用,可以从busybox中访问nginx的80端口。
- 登录容器服务控制台,在左侧菜单栏选择“集群”。
- 在集群列表页面,选择目标集群名称,然后在左侧菜单栏选择“工作负载”下的“无状态”,点击“创建deployment”。
也可以使用yaml创建工作负载,创建nginx工作负载参考如下:
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "nginx-deploy"
namespace: "default"
spec:
replicas: 2
selector:
matchLabels:
name: "nginx-deploy"
template:
metadata:
labels:
name: "nginx-deploy"
source: "CCSE"
spec:
containers:
- image: "registry-vpc-crs-huadong1.ctyun.cn/open-source/nginx:1.25-alpine-amd64"
imagePullPolicy: "IfNotPresent"
name: "nginx"
创建busybox工作负载参考如下:
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "lin-test-3-deploy"
namespace: "default"
spec:
replicas: 1
selector:
matchLabels:
name: "busybox"
template:
metadata:
labels:
name: "busybox"
spec:
containers:
- image: "registry-huadong1.crs-internal.ctyun.cn/open-source/busybox:1.36"
imagePullPolicy: "IfNotPresent"
name: "busybox"
command:
- "tail"
- "-f"
- "/dev/null"
步骤二:为后端nginx工作负载创建service服务
创建service,参考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-deploy
namespace: default
spec:
ports:
- name: tcp80
port: 30002
protocol: TCP
targetPort: 80
selector:
name: nginx-deploy
type: ClusterIP
步骤三:集群内使用应用名进行访问后端实现负载均衡
进入前端busybox容器内部,使用service 域名访问后端应用,一共请求5次。
wget -qO - nginx-deploy:30002
可以看到后端请求分别请求到了2个后端服务中,实现了负载均衡。