(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访问点,并读取新的规则。然后配置路由,将外部访问分配到具体的服务上。