kubernetes给service动态增加服务端口
根据kubernetes官方文档的说明,service的ports规则支持merge操作:
ports
ServicePort array
patch strategy: merge
patch merge key: portThe list of ports that are exposed by this service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
Kubernetes API Reference Docs
我们进行以下实验:
一、创建service:
nginx-svc.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
nodePort: 30080
port: 8080
targetPort: 80
name: my80
externalTrafficPolicy: Local
创建:
kubectl apply -f nginx-svc.yaml
查看svc定义:
[work@el7 minikube]$ kubectl get svc nginx -o yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"externalTrafficPolicy":"Local","ports":[{"name":"my80","nodePort":30080,"port":8080,"protocol":"TCP","targetPort":80}],"selector":{"app":"nginx"},"type":"NodePort"}}
creationTimestamp: "2024-10-18T01:46:39Z"
name: nginx
namespace: default
resourceVersion: "104596"
uid: 5dad10d6-f60d-4870-948a-e009066bfef3
spec:
clusterIP: 10.108.12.23
clusterIPs:
- 10.108.12.23
externalTrafficPolicy: Local
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: my80
nodePort: 30080
port: 8080
protocol: TCP
targetPort: 80
selector:
app: nginx
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
访问node的30080端口正常:
[work@el7 minikube]$ curl '192.168.49.3:30080'
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
二、启动压测脚本访问30080端口:
1、压测现有端口30080:
sh curl-press-30080.sh > 30080.log
并发访问30080端口,在日志记录返回的状态码。
2、压测即将新增的端口30081:
sh curl-press-30081.sh > 30081.log
并发访问30081端口,在日志记录返回的状态码。
3、创建到30080的长连接:
telnet 192.168.49.3 30080
观察长连接是否会断开。
三、patch给服务新增端口30081:
nginx-svc-patch.yaml:
spec:
ports:
- protocol: TCP
nodePort: 30081
port: 8081
targetPort: 8001
name: my8001
增加端口:
kubectl patch svc nginx --patch "`cat ./nginx-svc-patch.yaml`"
查看svc定义:
[work@el7 minikube]$ kubectl get svc nginx -o yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"externalTrafficPolicy":"Local","ports":[{"name":"my80","nodePort":30080,"port":8080,"protocol":"TCP","targetPort":80}],"selector":{"app":"nginx"},"type":"NodePort"}}
creationTimestamp: "2024-10-18T01:46:39Z"
name: nginx
namespace: default
resourceVersion: "104725"
uid: 5dad10d6-f60d-4870-948a-e009066bfef3
spec:
clusterIP: 10.108.12.23
clusterIPs:
- 10.108.12.23
externalTrafficPolicy: Local
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: my8001
nodePort: 30081
port: 8081
protocol: TCP
targetPort: 8001
- name: my80
nodePort: 30080
port: 8080
protocol: TCP
targetPort: 80
selector:
app: nginx
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
四、查看压测脚本和长连接的情况:
1、30081.log,在某个时间点http状态码由异常转为200。
2、30080.log,未出现非200状态码。
3、telnet长连接未断开。
五、增加后想删除怎么办?
找到新增端口在/spec/ports/里的索引位置,比如上面新增的my8001在第一个位置,索引为0,那删除操作如下:
kubectl patch svc nginx --type json --patch='[{"op":"remove","path":"/spec/ports/0"}]'
--end--