「Kubernetes」- 使用服务(Service)

(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

如果想访问该服务,可以在另外一个终端运行代理:

# kubectl proxy

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来验证:

# kubectl run busybox –image busybox -it — /bin/sh

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