Kubernetes服务URL获取及Service YAML配置技术咨询
嘿,针对你关于K8s Service的几个疑问,我来逐一给你解答清楚:
一、helloext的Service URL是否可用?
没错!http://10.102.5.44:8080/hello就是helloext的ClusterIP访问地址,这个地址在K8s集群内部(比如其他Pod、Master/Node节点上)可以直接访问。而且重点是:只要Service不被删除重建,这个ClusterIP就不会变——哪怕后端的Pod重启、重建,Service都会自动把流量转发到新的Pod上,完全不用修改客户端的访问地址,这正好解决了你担心的Pod重建后地址变化的问题。
不过要注意:ClusterIP只能在集群内部访问,如果之后需要从集群外部访问helloext,那得考虑用Ingress、或者把Service改成NodePort/LoadBalancer,但就你当前的需求(解决Pod重建后地址不变)来说,ClusterIP在集群内部已经完全够用了。
二、是否需要用YAML重新创建Service?
完全不需要!你已经用kubectl expose命令式创建了helloext的ClusterIP Service,它已经能正常工作了。除非你需要修改Service的配置(比如调整端口、添加标签/注解、修改会话亲和性等),否则没必要重新创建。如果要修改现有配置,用kubectl edit service helloext直接在线修改,或者写好YAML后用kubectl apply -f xxx.yaml更新都可以。
三、命令式创建vs声明式(YAML)创建Service的区别
这两种方式各有适用场景:
- 命令式创建:适合快速测试、临时搭建资源,比如你用
kubectl expose或者kubectl create service这种命令,一步到位。但缺点是配置没有持久化,后续修改只能靠kubectl edit或者重新执行命令,很难追踪配置的变更历史,不太适合生产环境。 - 声明式创建:用YAML文件定义资源的最终期望状态,这是生产环境的推荐方式。你可以把YAML文件存入Git这类版本控制系统,每次变更都有记录,而且用
kubectl apply可以实现增量更新——K8s会自动对比现有资源和YAML定义的差异,只修改需要变更的部分,配置更规范、可维护性更强。
四、YAML模板的填充说明(如果之后需要用声明式管理的话)
先纠正你模板里的几个小错误:matadata应该是metadata,labels和annotations是键值对(不是列表),selector也是键值对(不是数组)。下面是针对helloext的正确填充示例,你可以参考:
apiVersion: v1 kind: Service metadata: name: helloext # Service名称,要和你现有的一致,否则会创建新的Service namespace: default # 命名空间,默认就是default,可省略不写 labels: app: helloext # 自定义标签,方便后续用kubectl筛选资源,格式是key: value annotations: description: "ClusterIP Service for helloext Spring Boot application" # 注解,用来添加额外说明信息,同样是key: value格式 spec: selector: run: helloext # 这是Service和Pod关联的关键!必须和你的helloext Pod上的标签完全匹配,看你kubectl get pods的输出,Pod标签是run=helloext,所以这里填这个 type: ClusterIP # 指定Service类型,这里就是你需要的ClusterIP clusterIP: "" # 一般不用手动指定,K8s会自动分配可用的IP;如果非要手动指定,得用集群Service CIDR范围内未被占用的IP,不推荐手动设置 sessionAffinity: None # 会话亲和性,可选None或ClientIP。ClientIP会把同一个客户端的请求转发到同一个Pod,默认是None ports: - name: http # 端口名称,自定义即可,方便识别这个端口的用途 protocol: TCP # 协议,TCP是最常用的,你的Spring Boot应用用的也是TCP port: 8080 # Service的ClusterIP端口,集群内部访问时用这个端口 targetPort: 8080 # 后端Pod的实际监听端口,你的Spring Boot用8080,所以填这个 # nodePort: # ClusterIP类型不需要这个字段,只有NodePort/LoadBalancer类型才需要(可手动指定或让K8s自动分配) # status字段不需要手动编写,K8s会自动维护这个部分的状态信息
额外补充几个关键点:
selector绝对不能写错,否则Service找不到后端的Pod,会出现访问不通的情况。- 如果之后要用这个YAML更新现有Service,直接执行
kubectl apply -f helloext-service.yaml即可,K8s会自动同步配置。 - 如果你之后想把helloext改成NodePort类型,只需要把
spec.type改成NodePort,并可选添加nodePort字段(不填的话K8s会自动分配30000-32767范围内的端口)。
内容的提问来源于stack exchange,提问作者user84592

