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

Loading

Facebook评论