|NO.Z.00157|——————————|CloudNative|——|KuberNetes&服务发布.V08|——|service.v04|验证service|
一、验证创建的service是否代理到pod上
### --- 验证service是否代理到对应的pod上
~~~ 查看创建的pod及service地址
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 9 19h 172.25.244.211 k8s-master01 <none> <none>
nginx-66bbc9fdc5-jnzhz 1/1 Running 0 11m 172.18.195.17 k8s-master03 <none> <none>
nginx-66bbc9fdc5-vhq59 1/1 Running 0 11m 172.25.244.214 k8s-master01 <none> <none>
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.101.145.83 <none> 80/TCP,443/TCP 4s
### --- 在同一namespace下去验证通过service访问pod
~~~ 那么我们就可以通过clusterIP访问到应用,但是我们是不建议使用clusterIP反问应用的,
~~~ 我们建议是使用service的name去访问
[root@k8s-master01 ~]# curl 172.18.195.17 // 通过pod的地址是可以访问到pod的页面内容的
<title>Welcome to nginx!</title>
[root@k8s-master01 ~]# curl 10.101.145.83 // 也可以通过service的clusterIP访问到pod的页面的内容
<title>Welcome to nginx!</title>
[root@k8s-master01 ~]# kubectl logs -f nginx-66bbc9fdc5-jnzhz // 查看日志可以看到有人已经请求它的根路径了。
172.25.244.192 - - [20/Apr/2021:10:46:43 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
172.25.244.192 - - [20/Apr/2021:10:47:17 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
二、登录busybox容器验证
### --- 登录busybox容器
[root@k8s-master01 ~]# kubectl exec -ti busybox -- sh // 登入busybox访问该页面验证
/ # wget http://nginx-svc // 访问service名称
Connecting to nginx-svc (10.101.145.83:80)
index.html 100% |*************************************************************************************************************************************| 612 0:00:00 ETA
/ # cat index.html
<title>Welcome to nginx!</title>
### --- 跨namespace访问这个service下的pod:需要加上namespace的名称;
~~~ # 假设这个service不在default的命名空间下,我们该怎么去访问?
~~~ 什么情况下需要用到跨namespace调用呢?
~~~ 一般情况下:应用之间的调用不要使用跨namespace,因为它很容易形成一个网状结构的网络,很不好处理
~~~ 使用到情况:假设我们有一个中间件,比如说Redis,这个Redis可能会跟很多项目去共用数据,
~~~ 这个项目可能部署在好几个namespace下,这个namespace去访问公共的Redis,
~~~ 那么我们就可以把这个中间件或Redis单独的找一个namespace存放,
~~~ 可以为其它的namespace调用。这样就可以使用跨namespace去调用。
/ # wget http://nginx-svc.default // 若是跨namespace需要加上.default
Connecting to nginx-svc.default (10.101.145.83:80)
index.html 100% |*************************************************************************************************************************************| 612 0:00:00 ETA
/ # cat index.html
<title>Welcome to nginx!</title>
三、通过service去访问这个pod的话,这个pod的后端有变化的话;会不会影响到这个service的访问呢?
### --- 通过service去访问这个pod的话,这个pod的后端有变化的话;
~~~ 会不会影响到这个service的访问呢?
~~~ # 查看创建的容器
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-66bbc9fdc5-jnzhz 1/1 Running 0 27m
nginx-66bbc9fdc5-vhq59 1/1 Running 0 27m
~~~ # 删除重启,重启容器
[root@k8s-master01 ~]# kubectl delete po nginx-66bbc9fdc5-jnzhz nginx-66bbc9fdc5-vhq59
pod "nginx-66bbc9fdc5-jnzhz" deleted
pod "nginx-66bbc9fdc5-vhq59" deleted
~~~ # 查看重启的容器,IP地址发生变化
~~~ 删除之前的两个pod,删除之后这两个pod会重建,重建之后它的IP地址会发生变化,
~~~ 那么此刻我们还能不能通过service名去访问到我们需要的资源呢?
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 10 20h 172.25.244.211 k8s-master01 <none> <none>
nginx-66bbc9fdc5-mdlr5 1/1 Running 0 119s 172.25.244.215 k8s-master01 <none> <none>
nginx-66bbc9fdc5-rsxpd 1/1 Running 0 118s 172.18.195.18 k8s-master03 <none> <none>
### --- 验证通过busybox是否可以正常访问到数据
~~~ # 进入到busybox容器访问获取数据
[root@k8s-master01 ~]# kubectl exec -ti busybox -- sh
/ # wget http://nginx-svc //也是可以访问到的
Connecting to nginx-svc (10.101.145.83:80)
index.html 100% |*************************************************************************************************************************************| 612 0:00:00 ETA
~~~ # 查看service地址及pod地址对应的endpoints
~~~ 可以看到它把重建后的地址更新到service针对的ep中。
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
nginx-svc ClusterIP 10.101.145.83 <none> 80/TCP,443/TCP 28m
[root@k8s-master01 ~]# kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.1.11:6443,192.168.1.12:6443,192.168.1.13:6443 10d
nginx-svc 172.18.195.18:443,172.25.244.215:443,172.18.195.18:80 + 1 more... 28m
### --- 删除一个容器,查看service对应的yaml变化
~~~ # 删除一个pod,查看service的yaml文件的变化
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-66bbc9fdc5-mdlr5 1/1 Running 0 119s 172.25.244.215 k8s-master01 <none>
[root@k8s-master01 ~]# kubectl delete po nginx-66bbc9fdc5-mdlr5
pod "nginx-66bbc9fdc5-mdlr5" deleted
[root@k8s-master01 ~]# kubectl get po -owide // 新启的这个Pod的地址是13
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-66bbc9fdc5-766d9 1/1 Running 0 67s 172.17.125.13 k8s-node01 <none>
~~~ # 查看service对应的endpoints变化
~~~ 所以说我们不需要关系service后端应用到底产生了什么样的变化,而是直接可以访问到我们的应用,
~~~ 而且service的名称会更可靠,而且会更有稳定性。
~~~ 服务之间的调用使用service的名称去调用,不要使用clusterIP地址去调用。
[root@k8s-master01 ~]# kubectl get ep nginx-svc -oyaml //可以看到之前的Pod的地址已经不见了,更新为新的Pod的地址
subsets:
- addresses:
- ip: 172.17.125.13
nodeName: k8s-node01
- ip: 172.18.195.18
nodeName: k8s-master03
四、查看定义的service.yaml
### --- 查看定义的service.yaml配置文件
~~~ # 查看创建的service.pod
[root@k8s-master01 ~]# kubectl get svc nginx-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.101.145.83 <none> 80/TCP,443/TCP 19h
~~~ # 查看service.yaml配置文件
~~~ 可以看到这个service定义了2个Pod,这两个pod里面一个是http的一个是https的,
[root@k8s-master01 ~]# kubectl get svc nginx-svc -oyaml
spec:
clusterIP: 10.101.145.83
clusterIPs:
- 10.101.145.83
ports:
- name: http
port: 80 // 这个是service的端口是80
protocol: TCP
targetPort: 80 // 这个是service下pod容器启用的端口号
- name: https
port: 443
protocol: TCP
targetPort: 443
selector: // 这个selector:通过selector查找出当前namespace下的pod,过滤出这个pod之后,会根据这个pod的IP地址生成我们的ep,刷新我们的ep
app: nginx
sessionAffinity: N
type: ClusterIP
status:
loadBalancer: {}
### --- 查看创建的service文件中包含的pod地址及endpoints地址是否一致
~~~ # 查看创建的pod地址
[root@k8s-master01 ~]# kubectl get po -l app=nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-66bbc9fdc5-766d9 1/1 Running 0 19h 172.17.125.13 k8s-node01 <none> <none>
nginx-66bbc9fdc5-rsxpd 1/1 Running 0 19h 172.18.195.18 k8s-master03 <none> <none>
~~~ # 查看创建的endpoints下pod地址
~~~ 这种是k8s下最常用的应用,去访问我们k8s中内部的应用需求的。
[root@k8s-master01 ~]# kubectl get ep nginx-svc
NAME ENDPOINTS AGE
nginx-svc 172.17.125.13:443,172.18.195.18:443,172.17.125.13:80 + 1 more... 19h
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了