|NO.Z.00156|——————————|CloudNative|——|KuberNetes&服务发布.V07|——|service.v03|创建service|
一、引入service
### --- 什么是service
~~~ Service可以简单的理解为逻辑上的一组Pod。
~~~ 一种可以访问Pod的策略,而且其他Pod可以通过这个Service访问到这个Service代理的Pod。
~~~ 相对于Pod而言,它会有一个固定的名称,一旦创建就固定不变。
~~~ 在创建service的时候会同步创建一个同名的EndPoint,这个EndPoint里面记录的就是Pod的IP地址
二、查看部署时创建的service和endpoints
### --- 查看创建的service
[root@k8s-master01 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 10d
metrics-server ClusterIP 10.97.177.184 <none> 443/TCP 10d
### --- 查看创建的endpoints
[root@k8s-master01 ~]# kubectl get ep -n kube-system
NAME ENDPOINTS AGE
kube-dns 172.25.92.65:53,172.25.92.65:53,172.25.92.65:9153 10d
metrics-server 172.18.195.1:4443 10d
### --- 查看创建的pod
[root@k8s-master01 ~]# kubectl get po -n kube-system -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-867d46bfc6-sk5dp 1/1 Running 0 10d 172.25.92.65 k8s-master02 <none> <none>
metrics-server-595f65d8d5-slhtd 1/1 Running 1 10d 172.18.195.1 k8s-master03 <none> <none>
三、创建nginx-service.yaml配置文件
### --- 导出service历史创建模板更改配置参数
~~~ 假设新建一个service验证:可以使用正在运行的service,导出来yaml文件,创建即可
[root@k8s-master01 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 10d
metrics-server ClusterIP 10.97.177.184 <none> 443/TCP 10d
### --- 导出历史service模板
[root@k8s-master01 ~]# kubectl get svc -n kube-system kube-dns -oyaml > nginx-svc.yaml
### --- 更改配置参数
[root@k8s-master01 ~]# vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-svc
name: nginx-svc
spec:
ports:
- name: http # Service端口的名称
port: 80 # Service自己的端口, servicea --> serviceb http://serviceb, http://serviceb:8080
protocol: TCP # UDP TCP SCTP default: TCP
targetPort: 80 # 后端应用的端口
- name: https
port: 443
protocol: TCP
targetPort: 443
selector:
app: nginx
sessionAffinity: None
type: ClusterIP
### --- service配置文件参数说明
~~~ # 注释说明;
~~~ clusterIP:在配置的时候不要写clusterIP,因为clusterIP也是自己去生成的,他和我们Pod的IP是一样的,这个地址不要手动去配置,自动配置有可能会冲突,所以创建service的时候让他自己去生成。而且服务间访问不要使用这个clusterIP,clusterIP在删除service之后就会发生变化。
~~~ ports:spec下的ports;是你的service中要开放的端口,开放的端口包括2个,一个是service自己的端口,另外一个是service代理后端的后端应用的端口,这个是要做一个区分的。端口若是配置多个的话,是不要重复的。最好是按照这个端口的用途来区分的。比如说是nginx
~~~ targetPort:是后端应用的端口。这两个端口是可以不一样的。但是targetPort端口一定要写对,不然可能会导致不通。
~~~ name:根据他的属性来命名,不要随便写。需要认识是什么参数
~~~ 他所代理的Pod是谁,就是通过这个selector来定义的,它是通过这个selector来过滤出来本身namespace下的这个Pod,这个service是有namespace隔离的。
[root@k8s-master01 ~]# vim nginx-svc.yaml
selector:
app: nginx
sessionAffinity: None
type: ClusterIP
### --- 查看创建pod所创建的label
~~~ 可以看到这2个Pod的标签是app=nginx,和上面的selector下的app:标签保持一致即可。
~~~ 这样这个service就可以代理这两个pod的流量了。
[root@k8s-master01 ~]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-66bbc9fdc5-jnzhz 1/1 Running 0 7m37s app=nginx,pod-template-hash=66bbc9fdc5
nginx-66bbc9fdc5-vhq59 1/1 Running 0 7m37s app=nginx,pod-template-hash=66bbc9fdc5
四、创建service;使用service代理k8s内部应用
### --- 创建一个service
[root@k8s-master01 ~]# kubectl create -f nginx-svc.yaml
service/nginx-svc created
### --- 查看创建的service
~~~ 这个创建的service的IP地址是10.101.145.83 代理的后端应用的端口是80和443
[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
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内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」