kubernetes之service详解

  1. Service详解
  2. Service定义

    我们已经多次提到,Service作为Kubernetes的一种抽象资源类型,它的最大作用就是代理后端的Pod,把后端多个Pod整合使外部访问时感觉到只是一个服务而不是多个Pod,避免了使用Pod或者NodePort地址去访问服务(这两者IP往往不够稳定)。Service与Pod是基于Label来关联的。

    下面是一份Service模板:

  3. Service的创建

    定义一个RC,用来创建几个pod,配置如下

    现在创建这个RC对象

    kubectl create -f frontend-nginx-rc.yaml

    使用get查看

    kubectl get pod –-selector app=nginx

    然后创建Service,配置如下

    通过定义文件创建Service:

    kubectl create -f frontend-nginx-service.yaml

    直接使用expose也可以创建一个服务

    kubectl expose rc frontend-nginx –-name=frontend-nginx-service –-port=80 –-target-port=80

     

    查看服务

    kubectl get service frontend-nginx-service

    kubectl describe service frontend-nginx-service

     

  4. 集群外访问

    集群外访问服务方式有四种方式,一种是端口转发,用于调试较好,一种是Nodeport,另一种是负载均衡服务,还有ingress方式。我们来看看如何使用负载均衡给外部暴露一个服务。

     

    1.在集群中运行一个hello world程序

    kubectl run hello-world --replicas=5 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0 --port=8080

    以上命令创建一个 Deployment 对象和一个关联的 ReplicaSet 对象。ReplicaSet 有五个 Pods,每个Pods都运行Hello World应用程序。

     

    2.显示有关deployment的信息

    kubectl get deployments hello-world

    kubectl describe deployments hello-world

     

    1. 显示有关RS的信息

    kubectl get replicasets

    kubectl describe replicasets

     

    1. 使用deployment创建暴露的service对象

    kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --port=80 --target-port=8080

     

    1. 查看service

    NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE

    my-service 10.3.245.137 104.198.205.71 8080/TCP 54s

    外部IP地址为104.198.205.71。还要注意Port的值

     

    1. 显示有关service详细信息

    Name: my-service

    Namespace: default

    Labels: run=load-balancer-example

    Selector: run=load-balancer-example

    Type: LoadBalancer

    IP: 10.3.245.137

    LoadBalancer Ingress: 104.198.205.71

    Port: <unset> 8080/TCP

    NodePort: <unset> 32377/TCP

    Endpoints: 10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more...

    Session Affinity: None

    Events:

     

    1. 该服务有多个端点:10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more…。这些是运行Hello World应用程序的pod的内部地址。要验证这些是pod地址,请输入以下命令

      kubectl get pods --output=wide

       

    2. 就会返回相关的信息。

       

    9. 要删除服务,请输入以下命令

    kubectl delete services my-service

    要删除DeploymentReplicaSet和运行Hello World应用程序的Pods,请输入以下命令

    kubectl delete deployment hello-world

     

  5. ingress负载网络

    在通常情况下,service和pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到 service在节点暴露的NodePort上,然后再由 kube-proxy将其转发给相关的Pod。而Ingress就是为进入集群的请求提供路由规则的集合。

    Ingress可以给service 提供集群外部访问的URL、负载均衡、SSL终止、HTTP路由等。为了配置这些Ingress规则,集群管理员需要部署一个Ingress controller,它监听Ingress和service的变化,并根据规则配置负载均衡并提供访问入口。

    为什么需要 Ingress,因为在对外访问的时候,NodePort类型需要在外部搭建额外的负载均衡,

    而LoadBalancer要求kubernetes必须跑在特定的云服务提供商上面。

    定义一个Ingress如下:

    每个Ingress都需要配置 rules,目前Kubernetes仅支持http规则。上面的示例表示请求/testpath 时转发到服务test的80端口中。

    根据 Ingress Spec配置的不同,Ingress可以分为以下几种类型。

    1. 单服务Ingress即该ingress仅指定一个没有任何规则的后端服务。

    单服务还可以通过配置service.Type=NodePort或者Service.Type=LoadBalancer来对外暴露。

     

    1. 多服务ingress

    路由到多服务的Ingress即根据请求路径的不同转发到不同的后端服务上,比如可以通过下面的Ingress来定义:

    上面例子中,如果访问的是/foo,则路由转发到sl服务,如果是/bar则转发到s2服务。

     

    1. 虚拟主机ingress

    虚拟主机Ingress即根据名字的不同转发到不同的后端服务上,而它们共用同 一个IP地址,一个基于Host header路由请求的Ingress如下:

    根据域名路由到不同的后端服务

    1. ingress更新

    可以通过kubectl edit ing name的方法来更新Ingress:

    kubectl edit ing test

    这会使用编辑器打开一个已有的ingress的yaml定义文件,修改并保存就会将其更新到kubernetes API server,进而触发ingress Controller重新配置负载均衡;

    当然,也可以使用kubectl replace -f new ingress.yaml来更新。

posted @ 2022-01-24 11:18  头发重要  阅读(585)  评论(0)    收藏  举报