CKA [Networking] – Service的使用

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

Service的种类

使用案例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
       ClusterIp: none

    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

    使用案例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

    Loading

    Facebook评论