一、四层负载均衡Service基本介绍
Service 是 Kubernetes 中的一个资源对象,它定义了一组具有相同标签的 Pod 的逻辑集合,并为 这组 Pod 分配了一个虚拟 IP(Cluster IP)。Service 充当了网络终结点,客户端可以通过访问 Service 的虚拟 IP 来访问后端的 Pod。
k8s集群中的IP地址
二、创建service资源
1.创建ClusterIP类型的Service
简介
ClusterIP(默认模式):
使用Kubernetes内部代理(kube-proxy)来将连接路由到Service的后端Pod。
这是最常用的模式。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
test_pod: nginx
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
name: nginx
labels:
run: nginx
spec:
containers:
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
protocol: TCP
创建ClusterIP类型的Service
---
apiVersion: v1
kind: Service
metadata:
name: clusterip-test
labels:
app: svc
spec:
type: ClusterIP
ports:
port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
检查:
查看podIP
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
#查看service信息
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
#查看负载均衡
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
TCP 10.109.26.178:80 rr
#查看服务端点信息
NAME ENDPOINTS AGE
2.创建 NodePort 类型的 Service
NodePort:
将Service公开为集群节点上的特定端口。
在每个节点上监听Service的特定端口,并将流量转发到后端Pod。
可以通过任何集群节点的IP地址和指定的端口访问Service。
创建nginx Pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-port
spec:
replicas: 3
selector:
matchLabels:
run: NodePort-nginx
template:
metadata:
labels:
run: NodePort-nginx
spec:
containers:
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
创建NodePort类型的Service
---
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
selector:
run: NodePort-nginx
ports:
port: 80
nodePort: 30180
targetPort: 80
protocol: TCP
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
查看service信息
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 28d
查看负载均衡
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
TCP 172.17.0.1:30180 rr
TCP 192.168.1.100:30180 rr
TCP 192.168.122.1:30180 rr
TCP 10.246.73.128:30180 rr
#查看服务端点信息
NAME ENDPOINTS AGE
kubernetes 192.168.1.100:6443 28d
集群内访问:
curl http://10.105.50.230:80
集群外访问(192.168.1.100为K8S节点IP,所有节点都可以):
3.创建 ExternalName 类型的 Service
要实现在不同命名空间下的 Pod 之间进行跨命名空间访问
ExternalName:
将Service映射到集群外部的某个外部域名。
不会为Service分配Cluster IP或任何负载均衡器IP。
只会返回由ExternalName指定的外部域名的CNAME记录。
1、在nginx命名空间创建pod和service资源
创建名为nginx的命名空间
kubectl create ns nginx
编写nginx命名空间pod的yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-pod
namespace: nginx
spec:
replicas: 3
selector:
matchLabels:
name: nginxnginx
template:
metadata:
labels:
name: nginxnginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
编写nginx命名空间service的yaml文件
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: nginx
spec:
selector:
name: nginxnginx
ports:
- port: 80
protocol: TCP
targetPort: 80
在default命名空间下创建pod和service
创建pod:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 3600"]
创建service
apiVersion: v1
kind: Service
metadata:
name: client-svc
spec:
type: ExternalName
externalName: nginx-svc.nginx.svc.cluster.local
ports:
- name: http
port: 80
targetPort: 80
验证:
进入default命名空间中的pod
[root@lx100 svc]
NAME READY STATUS RESTARTS AGE
busybox-6bb56cf754-sx2dt 1/1 Running 0 6m12s
[root@lx100 svc]
/
返回nginx页面则成功
三、代理外部服务
在节点上安装MariaDB数据库
yum install mariadb-server.x86_64 -y
systemctl start mariadb
创建service
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: ClusterIP
ports:
- port: 3306
创建Endpoint
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysql
subsets:
- addresses:
- ip: 192.168.1.110
ports:
- port: 3306
查看service详细信息
kubectl describe svc mysql
Name: mysql
Namespace: default
Labels: none>
Annotations: none>
Selector: none>
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.105.22.22
IPs: 10.105.22.22
Port: 3306/TCP
TargetPort: 3306/TCP
Endpoints: 192.168.1.110:3306 #已经加入
Session Affinity: None
Events: none>
创建一个空的pod尝试连接
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 3600"]
进入pod
kubectl exec -it busybox-6bb56cf754-sx2dt /bin/sh
/ # telnet mysql 3306
Connected to mysql
@Host 'lx120' is not allowed to connect to this MariaDB serverConnection closed by foreign host
连接成功;输出信息为@Host 'lx120'不允许连接到被外部主机关闭的MariaDB服务器