一、service的概念

service 是 k8s 中的一个重要概念,主要是提供负载均衡和服务自动发现。它是 k8s 中最核心的资源之一,每一个Service 就是我们平常所说的一个“微服务”

一组pod能被service访问到,主要是通过label selector管理的。在这里插入图片描述

service只提供4层负载均衡,然而没有七层负载均衡的能力。但有时我们需要等多的规则匹配转发的请求,这点4层负载均衡是不具备的。

ingress具有七层负载均衡的能力。

二、service的类型

`ClusterIP`:kubernetes 默认就是这种方式,是集群内部访问的方式,外部是无法访问的。
其主要用于为集群内 Pod 访问时,提供的固定访问地址,默认是自动分配地址,可使用 ClusterIP 关键字指定固定 IP。

`NodePort`:NodePort是将主机 IP和端口 跟kubernetes 集群所需要暴露的 IP 和端口进行关联,方便其对外提供服务。
内部可以通过ClusterIP进行访问,外部用户可以通过 NodeIP:NodePort的方式单独访问每个Node 上的实例

`LoadBalancer`:LoadBalancer是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现

4)`ExternalName`(将其他连接设置一个集群内部的别名)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

apiserver通过kube-proxy监听服务和端点。
kube-proxy负责监控对应的pod,匹配对应pod的信息。写入到iptables的规则里去。
当客户端访问svc,实际访问的是iptables规则,导向到后端的pod信息。

#访问的流程
客户端访问后端的pod是通过iptables去实现的。
iptables规则是通过kube-proxy写入的。

apiserver通过kube-proxy去进行服务和端点信息的发现

kube-proxy通过标签去发现pod的端点信息是否写入到endpoints中

vip和service代理

在这里插入图片描述

代理模式的分类

1)userspace代理模式

在这里插入图片描述

2)iptabels代理模式

在这里插入图片描述

3)ipvs模式

在这里插入图片描述

在这里插入图片描述

ipvsadm -Ln

1) ClusterIP

在这里插入图片描述
Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则。
在这里插入图片描述

部署deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: stabel
  template:
    metadata:
      labels:
        app: myapp
        release: stabel
        env: test
    spec:
      containers:
      - name: myapp
        image: wangyanglinux/myapp:v2
        imagePullPolicy: IfNotPresent
        ports:
        - name: http

部署svc
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  type: ClusterIP
  selector:
    app: myapp
    release: stabel
  ports:
  - name: http
    port: 80
    targetPort: 80

#这里正常来说会看见rr轮询什么的 有对应的node的ip地址显示
[root@k8s-master-01 mnt]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@k8s-master-01 mnt]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE    IP            NODE          NOMINATED NODE   READINESS GATES
myapp-deploy-5b6f5d558b-6lgcq   1/1     Running   0          5m2s   10.244.2.41   k8s-node-02   <none>           <none>
myapp-deploy-5b6f5d558b-wrqr2   1/1     Running   0          5m2s   10.244.1.34   k8s-node-01   <none>           <none>
myapp-deploy-5b6f5d558b-xwkjn   1/1     Running   0          5m2s   10.244.1.33   k8s-node-01   <none>           <none>

[root@k8s-master-01 mnt]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   8d
myapp        ClusterIP   10.96.174.205   <none>        80/TCP    3s
#curl svc的地址
[root@k8s-master-01 mnt]# curl 10.96.174.205
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

#curl svc的地址可以看见rr轮询策略,代理后端的pod
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-wrqr2
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-wrqr2
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-wrqr2
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-wrqr2
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-xwkjn
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-6lgcq
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html
myapp-deploy-5b6f5d558b-xwkjn
[root@k8s-master-01 mnt]# curl 10.96.174.205/hostname.html

2) svc-headless

apiVersion: v1
kind: Service
metadata:
  name: myapp-headless
  namespace: default
spec:
  selector:
    app: myapp
  clusterIP: "None"
  ports:
  - port: 80
    targetPort: 80

[root@k8s-master-01 mnt]# kubectl get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP   8d
myapp            ClusterIP   10.96.174.205   <none>        80/TCP    99m
myapp-headless   ClusterIP   None            <none>        80/TCP    39m
[root@k8s-master-01 mnt]# kubectl get pods -n kube-system 
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-f68b4c98f-nkqlm                 1/1     Running   0          8d
coredns-f68b4c98f-wzrrq                 1/1     Running   0          8d
etcd-k8s-master-01                      1/1     Running   0          8d
kube-apiserver-k8s-master-01            1/1     Running   0          8d
kube-controller-manager-k8s-master-01   1/1     Running   2          8d
kube-flannel-ds-l5ctd                   1/1     Running   0          8d
kube-flannel-ds-nkfdg                   1/1     Running   0          8d
kube-flannel-ds-sjp8f                   1/1     Running   0          8d
kube-proxy-kl2qj                        1/1     Running   0          8d
kube-proxy-rrlg4                        1/1     Running   0          8d
kube-proxy-tc2nd                        1/1     Running   0          8d
kube-scheduler-k8s-master-01            1/1     Running   2          8d

#查看dns的ip值
[root@k8s-master-01 mnt]# kubectl get pods -n kube-system  -o wide
NAME                                    READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
coredns-f68b4c98f-nkqlm                 1/1     Running   0          9d    10.244.0.2      k8s-master-01   <none>           <none>
coredns-f68b4c98f-wzrrq                 1/1     Running   0          9d    10.244.0.3      k8s-master-01   <none>           <none>
....

#dig -t A servicename.默认的ns.svc.cluster.local @dns的ip值
[root@k8s-master-01 mnt]# dig -t A myapp-headless.default.svc.cluster.local@10.244.0.2

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t A myapp-headless.default.svc.cluster.local@10.244.0.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 18216
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;myapp-headless.default.svc.cluster.local\@10.244.0.2. IN A

;; AUTHORITY SECTION:
.			3600	IN	SOA	a.root-servers.net. nstld.verisign-grs.com. 2021121300 1800 900 604800 86400

;; Query time: 35 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 一 12月 13 22:11:55 CST 2021
;; MSG SIZE  rcvd: 144


3) NodePort

NodePort是将主机 IP和端口 跟kubernetes 集群所需要暴露的 IP 和端口进行关联,方便其对外提供服务。
内部可以通过ClusterIP进行访问,外部用户可以通过 NodeIP:NodePort的方式单独访问每个Node 上的实例

apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  type: NodePort
  selector:
    app: myapp
    release: stabel
  ports:
  - name: http
    port: 80
    targetPort: 80

在这里插入图片描述

在这里插入图片描述

#三台node上对外开放32179端口
[root@k8s-master-01 mnt]# netstat -tnlp|grep 32179
tcp        0      0 0.0.0.0:32179           0.0.0.0:*               LISTEN      16349/kube-proxy    

[root@k8s-node-01 ~]# netstat -tnlp|grep 32179
tcp        0      0 0.0.0.0:32179           0.0.0.0:*               LISTEN      7874/kube-proxy  

[root@k8s-node-02 ~]# netstat -tnlp|grep 32179
tcp        0      0 0.0.0.0:32179           0.0.0.0:*               LISTEN      6620/kube-proxy     

查询流程
ipvsadm -Ln

4) LoadBalancer

#LoadBalancer 是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现。
负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过 Service 的 status.loadBalancer 字段被发布出去。

#测试需要公网弹性IP模板
在这里插入图片描述

5)ExternalName(将其他连接设置一个集群内部的别名)

在这里插入图片描述
在这里插入图片描述


apiVersion: v1
kind: Service
metadata:
  name: baidu  #定义的别名
spec:
  externalName: www.baidu.com  #给谁定义别名
  type: ExternalName    #类型


[root@k8s-master-01 mnt]# kubectl apply -f ex.yaml 
service/baidu created
[root@k8s-master-01 mnt]# kubectl get svc
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
baidu            ExternalName   <none>          www.baidu.com   <none>         4s
kubernetes       ClusterIP      10.96.0.1       <none>          443/TCP        9d
myapp            NodePort       10.96.174.205   <none>          80:32179/TCP   8h
myapp-headless   ClusterIP      None            <none>          80/TCP         7h51m
[root@k8s-master-01 mnt]# dig -t A myapp-headless.default.svc.cluster.local.@10.244.0.3

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t A myapp-headless.default.svc.cluster.local.@10.244.0.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 61284
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;myapp-headless.default.svc.cluster.local.\@10.244.0.3. IN A

;; AUTHORITY SECTION:
.			1987	IN	SOA	a.root-servers.net. nstld.verisign-grs.com. 2021121300 1800 900 604800 86400

;; Query time: 51 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 一 12月 13 23:28:57 CST 2021
;; MSG SIZE  rcvd: 145

[root@k8s-master-01 mnt]# dig -t A baidu.default.svc.cluster.local.@10.244.0.3

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t A baidu.default.svc.cluster.local.@10.244.0.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 32440
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.default.svc.cluster.local.\@10.244.0.3. IN A

;; AUTHORITY SECTION:
.			3600	IN	SOA	a.root-servers.net. nstld.verisign-grs.com. 2021121300 1800 900 604800 86400

;; Query time: 45 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 一 12月 13 23:29:06 CST 2021

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐