一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
一、LoadBalancer Service
简介
LoadBalancer Service
是在Node Service
的基础上继续扩展的,类似于Node Service
在Cluster Service
的基础上进行扩展。
ExternalName Service
适用于外部服务使用域名的方式,它的缺点是不能指定端口。
通过任意一个 NodeIP:NodePort
就可以访问集群服务,假如集群有多个 Node
节点,比如 10 个、20 个,如何分配对于这些节点的访问请求呢?
这个时候最好是有一个负载均衡器,外部的客户端请求只需要访问负载均衡器的 IP
地址,然后由外部负载均衡器分配转发流量到后端 Node
的 NodePort
上,具体如下图所示:
LoadBalancer
组件一般是独立于 Kubernetes
集群之外的,大部分的时候是一个硬件的负载均衡器,也可以用软件方式实现,比如:HAProxy
或是 Nginx
。对于每个服务都需要配置一个与之对应的 LoadBalancer
实例,这样会增加工作量和出错的概率。
二、使用 nginx
软件手动实现负载均衡
- 创建
tomact-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
spec:
selector:
matchLabels:
app: tomcat
replicas: 2
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
- 执行创建
$ kubectl create -f tomcat-deployment.yaml
deployment.apps/tomcat created
- 新建
tomcat-svc.yaml
文件
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
type: NodePort
ports:
- port: 80 # 设置 ClusterIP 对应的端口为 80
targetPort: 8080 # Pod 开放的端口为 8080
nodePort: 30001 # 设置在 Node 上开放的端口为 30001
selector:
app: tomcat
- 执行创建
$ kubectl create -f tomcat-svc.yaml
service/tomcat-svc created
# 创建 NodePort 类型的服务成功
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat-svc NodePort 10.98.46.27 <none> 80:30001/TCP 22m
- 试着访问一下
$ curl 10.192.0.2:30001
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/8.5.47</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
...
- 安装并配置
nginx
作为负载均衡器进行模拟
# 查看环境中 `nginx` 版本信息
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
编辑 nginx
配置文件 sudo vim /etc/nginx/nginx.conf
http {
...
# 添加 k8s 集群所有可用的 nodeIP:nodePort
upstream k8snode {
server 10.192.0.2:30001;
server 10.192.0.3:30001;
server 10.192.0.4:30001;
}
# 设置虚拟主机
server {
# 监听 81 端口
listen 81;
location / {
# 反向代理指令,将所有的请求都发送给 k8snode 机器组中的机器
proxy_pass http://k8snode;
}
}
}
保存配置文件,检查配置文件是否有误
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
使配置文件生效
sudo nginx -s reload
可以通过 http://localhost:81
进行访问
\