背景信息
SCE集群不支持NodePort,k8s中的Ingress实现了对外部负载均衡器的自动配置,是对NodePort的替代方案。
前提条件
- 确保您已经创建SCE集群,具体操作请参阅创建SCE集群。
- 确保kubectl工具已经连接目标集群。
- 假设您在一个K8S的集群里面发布了两个应用,前端应用frontend和后端应用backend,要在浏览器访问前端应用。
- 确保您的SCE集群已安装CoreDNS插件。
实现原理
Ingress和Service在kubernetes集群中的工作原理如下:
操作步骤
步骤一:安装nginx-ingress-controller插件
- 登录容器服务控制台,在左侧菜单栏选择“集群”。
- 在集群列表页面,选择目标集群名称,然后在左侧菜单栏选择“插件”下的“插件市场”,点击安装nginx-ingress-controller插件。
- 提交安装插件,稍后会在集群中创建2个nginx-ingress-controller pod。
- 查看nginx-ingress-controller是否正常运行。
步骤二:创建前端应用
这里使用nginx代表前端应用,部署2个副本。
- 登录容器服务控制台,在左侧菜单栏选择“集群”。
- 在集群列表页面,选择目标集群名称,然后在左侧菜单栏选择“工作负载”下的“无状态”,点击“创建deployment”。
也可以使用yaml创建工作负载,创建nginx工作负载参考如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: registry-huadong1.crs-internal.ctyun.cn/open-source/nginx:1.25-alpine
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
步骤三:创建service服务
- 为前端nginx工作负载创建service,参考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
ports:
- port: 30003
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
- 为nginx-ingress-controller pod创建service,由于SCE集群不支持NodePort类型的service,这里创建LoadBalance类型,绑定ELB,参考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-elb
namespace: kube-system
annotations:
service.beta.kubernetes.io/ctyun-loadbalancer-id: lb-5jkwoaxf66 # elb id
service.beta.kubernetes.io/ctyun-loadbalancer-address-type: internet # #私网或公网类型,私网intranet,公网internet
spec:
ports:
- name: nginx-ingress
port: 30002
protocol: TCP
targetPort: 80
selector:
k8s-app: nginx-ingress-controller
type: LoadBalancer
步骤四:为前端应用创建Igress路由
- 创建ingress,参考如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: default
spec:
rules:
- host: myingress.com
http:
paths:
- backend:
service:
name: nginx-service
port:
number: 30003
path: /nginx
pathType: Prefix
步骤五:使用域名访问前端应用实现负载均衡
进入任意pod容器内部,使用myingress.com路由访问前端应用,一共请求5次。
$curl -H "Host:myingress.com" nginx-ingress-elb.kube-system.svc:30002/nginx
可以看到通过myingress.com/nginx域名是能正常请求到前端nginx应用的,并且分别请求到了2个前端nginx服务中,实现了负载均衡。