(1)集群内的 POD 通讯
(2)应用程序如何互相发现对方
(3)如何公开 POD,以便从集群外访问
Service 为 Pod 提供 VirtualIP。即使移除 Pod 或者添加 Pod,Service 也会保证客户端能够访问 Pod 中运行的容器。
VirtualIP 的作用是为了将访问发送到一个或多个 Pod。
kube-proxy 负责 VIP 和 Pod 之间的映射,每个节点都有该进程。kube-proxy 查询 apiserver 以获知集群中的新服务,并更新 iptables 规则。
5.1. Creating a Service to Expose Your Application
创建部署:kubectl run nginx –image nginx
创建服务:kubectl expose depoly/nginx –port 80
查看服务:kubectl describe svc/nginx
如果想访问该服务,可以在另外一个终端运行代理:
Starting to server on 127.0.0.1:8001
然后浏览器反问,http://localhsot:8001/api/v1/proxy/namespaces/default/services/nginx/
或者可以使用 YAML 文件来创建服务:
kind: Service
apiVersion: v1
metadata:
name: nginx
spec:
selector:
run: nginx
ports:
- port: 80
通过 selector 来选择匹配条件(与 Pod 的标签相同)的 Pod。并且,kubernetes 根据 Service 来配置所有节点的防火墙,从而使节点能够访问构成该服务的容器。
!!!如果服务运行出现问题,可以检查 selector 中的标签,并确认kubectl get endpoints可以返回一组访问点。如果不能,则很可能是 selector 没有找到可以匹配的 Pod。
!!!Pod 的监控程序(部署、副本控制器等等)可以直接操作服务。监控程序和服务可以通过标签找到 Pod,但是他们的只能不同:监控程序负责管理 Pod 的健康并中期 Pod,而服务则负责提供访问渠道。
5.2. Verifying the DNS Entry of a Service
默认的服务类性是 ClusterIP,并通过集群内部 IP 公布服务。如果 DNS 集群插件正常工作,可以通过$SERVICENAME.$NAMESPACE.svc.cluster.local 的形式访问服务。
可以使用 busybox 来验证:
# nslookup nginx
5.3. Changing the Type of a Service
修改服务类型。还可以使用 NodePort 或者 LadBalancer,默认是 ClusterIP 类型。
编辑服务:kubectl edit svc/webserver
获取服务:kubectl get svc/webserver / kubectl get svc/webserver -o yaml
!!!服务类型可以修改,但是某些类型会有隐藏的规则,比如 LoadBalancer,可能会触发公有云基础设施组件的配置,如果不知情,可能会造成昂贵的开销。
5.4. Deploying an Ingress Controller on Minikube
使用 Ingress 对象,可以在外部访问服务,而不需要 NodePort 和 LoadBalancer 类型的服务。
5.5. Making Services Accessible from Outside the Cluster
创建 Ingress 对象:
# ingress-foo.yaml
kind: Ingress
apiVersion: extensions/v1beat1
metadata:
name: nginx-pulibc
annotations:
ingress.kubernetes.io/rewirite-target: /
spec:
rules:
- hosts:
http:
paths:
- path: /web
backend:
serviceName: nginx
servicePOrt: 80
!!!一般来说,Ingress 的工作方式如下:Ingress 控制器监听 API 服务器的 /ingresses 访问点,并读取新的规则。然后配置路由,将外部访问分配到具体的服务上。