前面我们学习了K8S中service对象中ClusterIP和NodePort,今天来学习剩下的两种LoadBalancer和ExternalName。
service的另外两种方式
LoadBalancer:
大多是在公有云托管集群中使用,可以理解为在NodePort的前面再增加了一个公有云的负载均衡,这样就隐藏了真实的NodeIP。
Yaml文件例子
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 8082
targetPort: 80
nodePort: 30080
clusterIP: 10.10.30.30
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 1.1.1.1
①标签选择器,通过app:nginx来选择用有这个标签的pod
②转发的协议为TCP
③service的port为8082
④选择的pod的端口为80
⑤service的IP为10.10.30.30
⑥service的nodeport为30081
⑦类型为LoadBalancer
⑧公有云LVS负载的IP为1.1.1.1 这里一般是通过创建了公有云负载均衡后后填写,本例只是演示
应用这个yaml文件后可以通过查看pod和svc的方式得知,loadbalancer的IP和端口都为我们之前指定的,数据流量就是从LVS(1.1.1.1)--> node节点的端口(30081)--> service的端口(8082)--> pod的端口(80)
由于没有实际购买lvs,这里get请求测试这里不做演示。
ExternalName:
ExternalName指定外部访问域名
ExternalName类型的Service用于引入集群外部的服务,它通过externalName属性指定外部一个服务的地址,然后在集群内部访问此service就可以访问到外部的服务了。在本例中,将外部域名www.qq.com定义为内部的 enqq。在pod中访问enqq就可以直接访问www.qq.com了
Yaml文件
apiVersion: v1
kind: Service
metadata:
name: enqq
spec:
type: ExternalName
externalName: www.qq.com
①内部域名 nsqq
② 类型为ExternalName
③外部域名 www.qq.com
应用后进入pod通过ping查看解析是否生效
由于nginx镜像默认没有ping命令,这里通过kubectl run命令创建一个ubuntu镜像来测试。
# 进入任意一个pod容器
# kubectl exec -it nginx-deploy-6c74c565d8-52jkm /bin/sh
# 默认镜像没有ping功能,这里需要先apt update 然后安装ping组件
apt-get update
apt install -y iproute2
apt install -y iputils-ping
# 通过ping enqq 和 www.qq.com
可以发现两个解析的地址是一样的