service的认识
文章目录一、service的概念二、service的类型vip和service代理代理模式的分类1)userspace代理模式2)iptabels代理模式3)ipvs模式1) ClusterIP部署deployment部署svc2) svc-headless3) NodePort查询流程4) LoadBalancer5)ExternalName(将其他连接设置一个集群内部的别名)一、service
文章目录
一、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
更多推荐
所有评论(0)