关于 Service

Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector(查看下面了解,为什么可能需要没有 selector 的 Service)实现的。

举个例子,考虑一个图片处理 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪个 backend 副本。 然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不应该也没必要知道,而且也不需要跟踪这一组 backend 的状态。 Service 定义的抽象能够解耦这种关联。

对 Kubernetes 集群中的应用,Kubernetes 提供了简单的 Endpoints API,只要 Service 中的一组 Pod 发生变更,应用程序就会被更新。 对非 Kubernetes 集群中的应用,Kubernetes 提供了基于 VIP 的网桥的方式访问 Service,再由 Service 重定向到 backend Pod。

[root@k8s-master ~]# vim nginx-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
    role: web
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 80
  type: NodePort
[root@k8s-master ~]# vim nginx-deployment.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
        role: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80
[root@k8s-master ~]# kubectl create -f nginx-deployment.yaml 
[root@k8s-master ~]# kubectl create -f nginx-service.yaml 

暴露内部端口为10.10.10.239:8080
对外暴露端口为192.168.30.22:44860

[root@k8s-master ~]# kubectl get svc
nginx-service   NodePort    10.10.10.239           8080:44860/TCP   
[root@k8s-node1 ~]# curl 10.10.10.239:8080



Welcome to nginx!
[root@k8s-node2 ~]# curl 10.10.10.239:8080



Welcome to nginx!

service暴露端口发布服务_第1张图片
service暴露端口发布服务_第2张图片