Service(ClusterIP)

简介

通过集群内部IP地址暴露服务,此地址仅在集群内部可达,而无法被集群外部的客户端访问

clusterIP 主要在每个 node 节点使用 iptables,将发向 clusterIP对应端口的数据,转发到 kube-proxy 中。然后 kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个 service 下对应 pod的地址和端口,进而把数据转发给对应的 pod 的地址和端口

Service(ClusterIP)_第1张图片

为了实现图上的功能,主要需要以下几个组件的协同工作:

1、apiserver:用户通过 kubectl命令向 apiserver发送创建 service的命令, apiserver接收到请求后将数据存储到 etcd中

2、kube-proxy: Kubernetes的每个节点中都有一个叫做 kube-porxy的进程,这个进程负责感知 service、 pod的变化,并将变化的信息写入本地的 iptables规则中

3、iptables:使用 NAT等技术将 virtualIP的流量转至 endpoint中

操作实践

创建deployment资源

# cat myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx 
        ports:
        - containerPort: 80
          name: http

创建ClusterIP资源

# cat svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: ClusterIP # 类型设置为ClusterIP
  selector:
    app: myapp # 标签选择器,匹配deployment资源
  ports:
  - name: http
    port: 80   # service端口
    protocol: TCP  # 协议
    targetPort: 80 # deployment资源端口

查看service信息

[root@k8s-master service]# kubectl get svc
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes           ClusterIP   10.96.0.1                443/TCP        20d
myapp                ClusterIP   10.100.144.143           80/TCP         9m21s
nginx-svc-nodeport   NodePort    10.99.24.165             80:30080/TCP   2d

访问验证

[root@k8s-master service]# curl 10.100.144.143



Welcome to nginx!

结果分析

查看pod ip信息,可以发现,endpoints的ip端口信息与pod的ip端口信息完全一致

Service(ClusterIP)_第2张图片

  • 查看kube-proxy,查看ipvs规则,可以发现,ipvs规则与pod的ip和端口完全一致Service(ClusterIP)_第3张图片

你可能感兴趣的:(Kubernetes,kubernetes)