kubernetes之service详解
- Service详解
- Service定义
我们已经多次提到,Service作为Kubernetes的一种抽象资源类型,它的最大作用就是代理后端的Pod,把后端多个Pod整合使外部访问时感觉到只是一个服务而不是多个Pod,避免了使用Pod或者NodePort地址去访问服务(这两者IP往往不够稳定)。Service与Pod是基于Label来关联的。
下面是一份Service模板:
- 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
- 集群外访问
集群外访问服务方式有四种方式,一种是端口转发,用于调试较好,一种是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
- 显示有关RS的信息
kubectl get replicasets
kubectl describe replicasets
- 使用deployment创建暴露的service对象
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --port=80 --target-port=8080
- 查看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的值
- 显示有关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:
- 该服务有多个端点: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
就会返回相关的信息。
9. 要删除服务,请输入以下命令
kubectl delete services my-service
要删除Deployment,ReplicaSet和运行Hello World应用程序的Pods,请输入以下命令
kubectl delete deployment hello-world
- 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可以分为以下几种类型。
- 单服务Ingress即该ingress仅指定一个没有任何规则的后端服务。
单服务还可以通过配置service.Type=NodePort或者Service.Type=LoadBalancer来对外暴露。
- 多服务ingress
路由到多服务的Ingress即根据请求路径的不同转发到不同的后端服务上,比如可以通过下面的Ingress来定义:
上面例子中,如果访问的是/foo,则路由转发到sl服务,如果是/bar则转发到s2服务。
- 虚拟主机ingress
虚拟主机Ingress即根据名字的不同转发到不同的后端服务上,而它们共用同 一个IP地址,一个基于Host header路由请求的Ingress如下:
根据域名路由到不同的后端服务
- ingress更新
可以通过kubectl edit ing name的方法来更新Ingress:
kubectl edit ing test
这会使用编辑器打开一个已有的ingress的yaml定义文件,修改并保存就会将其更新到kubernetes API server,进而触发ingress Controller重新配置负载均衡;
当然,也可以使用kubectl replace -f new ingress.yaml来更新。












浙公网安备 33010602011771号