k8s Service

1.service介绍

      Kubernetes Service从逻辑上代表了一组Pod,具体是哪些Pod则是由label来挑选的。Service 有自己的IP。而且这个IP是不变的。客户端只需要访问Service的IP,Kubernetes则负责建立和维护Service与Pod的映射关系。无论后端Pod如何变化,对客户端不会有任何影响,因为Service没有变。

2.创建Service

 创建一个deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80

启动 两个Pod ,运行httpd 镜像,label是 run:httpd   Service  会用这个label来挑选Pod

kubectl apply -f  httpd.yml

Pod 分配了各自的IP,这是IP只能被Kubernetes Cluster 中的容器和节点访问

 

 创建Service

apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
spec:
  selector:      #指明label为run:httpd 的Pod作为Service 的后端
    run: httpd
  ports:    #将Service的8081端口映射到Pod的80端口,使用TCP协议
  - protocol: TCP
    port: 8081
    targetPort: 80

 httpd-svc 分配到一个CLUSTER-IP  10.254.23.80  ,可以通过该IP访问后端的httpd Pod

 根据 kubectl describe 查看httpd-svc 与 Pod 的对应关系

3.Cluster IP 的工作原理

Service Cluster IP  是一个虚拟IP ,是由Kubernetes 节点上的 iptables 规则管理的,IPtables 将访问Service 的流量转发到后台Pod ,而且使用了类似轮询的负载均衡策略。

Cluster 的每一个节点都配置了相同的 iptables 规则,这样就确保了整个Cluster 能够通过Service 的Cluster IP  访问Service.

查看 有关httpd-svc的相关信息

iptables-save |grep httpd-svc

4. 外网访问Service

ClusterIP
service 通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可访问,这是默认的Service类型

NodePort
service 通过Cluster节点的静态端口对外提供服务。Cluster 外部可以通过<NodeIP>:<NodePort> 访问Service

LoadBalancer
service利用cloud provider 特有的Load balancer 对外提供服务,cloud provider 负责将load balancer 的流量导向Service。
目前支持的cloud provider有GCP、AWS、Azur等

添加type:NodePort,重新创建httpd-svc

apiVersion: v1
kind: Service
metadata:
  name: httpd-svc-1
spec:
  type: NodePort
  selector:
    run: httpd
  ports:
  - protocol: TCP
    nodePort: 30000   #节点上的监听端口
    port: 8081        #ClusterIP上监听端口
    targetPort: 80    #Pod上监听端口

kubectl apply -f   httpd-svc-1.yml

 测试Node Port 是否正常工作

通过节点IP + 30000端口能够访问到 httpd-svc-1

最终,Node和ClusterIP在各自端口上接收到请求都会通过iptables 转发到Pod的target Port。

5.使用ExternalName将外部服务映射到内部服务

apiVersion: v1
kind: Service
metadata:
  name: my-redis
  namespace: xmc-test
spec:
  type: ExternalName
  externalName: my-redis.default.svc.cluster.loca
  ports:
  - name: redis
    port: 6379

 

参考 

https://www.cnblogs.com/benjamin77/p/9908547.html

 

posted @ 2019-08-20 16:23  xmc_2022  阅读(290)  评论(0编辑  收藏  举报