CKA [Networking] – Service的使用
Kubernetes Service 是一层抽象,用来将一组具有相同功能的 Pod(通常由 Deployment、StatefulSet 等控制器管理)暴露为一个稳定的网络端点,提供服务发现、负载均衡和跨 Pod 通信能力。Service 拥有一个持久的 ClusterIP(对集群内部)或可选的外部访问方式(NodePort、LoadBalancer),从而屏蔽 Pod 的动态扩缩与重建,让客户端无需关心 Pod 的具体 IP 和副本数变化即可稳定访问应用 。

ClusterIP使用案例1 – 手动绑定
制作一个前端和后端的pod,然后使用前端访问service,然后把流量带到后端pod当中。
手动绑定service和pod的ip。

1. 运行backend pod
kubectl run backend-pod --image=nginx
2. 运行frontend pod
-- sleep 36000
的作用就是让容器内直接执行 Linux 的 sleep
命令,并让它“暂停”或“挂起”自身运行 36000 秒(约 10 小时)。这样做的目的,是让这个 Pod 一直保持“运行”状态,而不会因为主进程(没有其它命令)立即退出而导致容器终止。
kubectl run frontend-pod --image=ubuntu --command -- sleep 36000
3. 查看创建的结果
kubectl get pods

4. 进入frontend pod然后安装curl
【进入frontend pod】
kubectl exec -it frontend-pod -- bash
【安装curl】
apt-get update && apt-get install -y curl
5. 查看backend pod的ip , 查到的ip是10.244.0.79
kubectl get pods -o wide

6. 创建service
kubectl apply -f service.yaml
apiVersion: v1
kind: Service
metadata:
name: simple-service
spec:
ports:
- port: 80
targetPort: 80
7. 查看创建的service
kubectl describe service simple-service

7. 创建endpoint,把pod的ip和service绑定在一起
kubectl apply -f endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: simple-service
subsets:
- addresses:
- ip: 10.244.0.79
ports:
- port: 80
8. 查看service endpoint的结果
kubectl describe service simple-service

9. 进入frontend pod 然后对准service的ip来访问测试
【进入frontend pod】
kubectl exec -it frontend-pod -- bash
【curl backend pod】
curl 10.96.125.158
【curl service dns】
curl simple-service



8. 清理,删除service, 当你删除service的时候,endpoint也会跟着一起删除,所以需要再次手动删除endpoint
【删除service】
kubectl delete service simple-service
【查看endpoint】
kubectl get endpoints

域名访问service

ClusterIP使用案例2 – Selector绑定
根据以上的使用案例1我们需要手动创建endpoint绑定service和pod,接下来这个使用案例是使用selector,让service和pod自动绑定

1. 创建service , 这个service是有selector的
kubectl apply -f service.yaml
apiVersion: v1
kind: Service
metadata:
name: simple-service
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 80
2. 创建service之后我们查看这个service的endpoint是空的,因为pod还没上label

3. 为backend pod加上label
kubectl label pod backend-pod app=backend

4. 查看service是有绑定了endpoint

5. 从frontend pod curl查看service
【进入frontend pod】
kubectl exec -it frontend-pod -- bash
【curl backend pod】
curl simple-service.default

6. 如果我们把backend pod的label给去除掉的话,那么service的endpoint再次解绑,再次清空
【backend pod 解绑label】
kubectl label pod backend-pod app-
【查看service】
kubectl describe service simple-service

Service的种类
创建service type有以下4中,如果命令行创建没有指定种类的话,那么默认就是ClusterIP了

命令行创建Service案例
1. 使用命令行创建, 如果你忘了怎么写可以使用help
【查看service可以创建哪些type】
kubectl create service
【使用help查看细节】
kubectl create service --help


2. 使用命令行创建或输出yaml
【命令行创建 service cluster ip】
kubectl create service clusterip simple-service --tcp=80:80
【命令输出yaml】
kubectl create service clusterip simple-service --tcp=80:80 --dry-run=client -o yaml > service.yaml
使用命令行创建selector只能是默认app=service名,如果想要更改的话应该导出yaml然后进行手动更改

NodePort的介绍
NodePort是在worker node当中开启一个port好让外部可以直接访问worker node的 ip 从而 访问到service当中 。port 可用范围为 30000 – 32767。
访问地址是 <node ip> : <node port>

NodePort缺点
端口段受限:仅能使用有限的高位端口,可能与其他服务冲突;
安全暴露面大:直接暴露所有节点 IP 及端口,不易做细粒度控制;
无跨节点智能负载均衡:只能做简单的轮询转发,不具备云厂商 LoadBalancer 那样的健康检查与全球调度;
依赖 kube-proxy:若以 iptables 模式运行,kube-proxy 宕机后已有规则仍生效,但新 Service 不会被添加规则;若以 IPVS 模式,行为亦略有不同。
NodePort使用案例
1. 使用命令行创建nodeport service , selector是app=test-nodeport
【创建 nodeport service】
kubectl create service nodeport test-nodeport --node-port=31000 --tcp=80:80
【查看创建好的nodeport service】
kubectl describe service test-nodeport

2. 创建nginx pod , 暴露80port , set好label
【创建nginx pod】
kubectl run nginx-pod --image=nginx:latest --labels='app=test-nodeport' --port='80'

3. 查看workernode的访问IP , 然后使用browser访问31000端口
【查看workernode的访问IP】
kubectl get nodes -o wide

