title: 使用port-forward访问集群中的应用程序 #标题tags: port-forward #标签
date: 2020-08-17
categories: k8s # 分类

记录如何使用 kubectl port-forward 访问 Kubernetes 集群中的 redis Server。这种连接方式在实际进行Debug时非常有效。

为redis创建deployment和service

  1. $ cat redis.yaml # 创建yaml文件如下
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: redis-master
  6. labels:
  7. app: redis
  8. spec:
  9. selector:
  10. matchLabels:
  11. app: redis
  12. role: master
  13. tier: backend
  14. replicas: 1
  15. template:
  16. metadata:
  17. labels:
  18. app: redis
  19. role: master
  20. tier: backend
  21. spec:
  22. containers:
  23. - name: master
  24. image: redis
  25. resources:
  26. requests:
  27. cpu: 100m
  28. memory: 100Mi
  29. ports:
  30. - containerPort: 6379
  31. $ kubectl apply -f redis.yaml # 创建deployment

查看pods状态

  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. redis-master-7d557b94bb-fptfd 1/1 Running 0 67s

查看deployment状态

  1. $ kubectl get deployment -n lv
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. redis-master 1/1 1 1 2m28s

查看rs状态

  1. $ kubectl get rs -n lv
  2. NAME DESIRED CURRENT READY AGE
  3. redis-master-7d557b94bb 1 1 1 3m4s

创建redis服务

  1. $ cat redis-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: redis-master
  6. labels:
  7. app: redis
  8. role: master
  9. tier: backend
  10. spec:
  11. ports:
  12. - port: 6379
  13. targetPort: 6379
  14. selector:
  15. app: redis
  16. role: master
  17. tier: backend
  18. $ kubectl apply -f redis-service.yaml

检查service创建结果

  1. $ kubectl get svc| grep redis
  2. redis-master ClusterIP 10.96.15.147 <none> 6379/TCP 84s

验证redis service 已经运行,并监听了6379端口

  1. # 请将 redis-master-7d557b94bb-fptfd 替换成你实际 redis 的名字
  2. $ kubectl get pods redis-master-7d557b94bb-fptfd --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'

转发本地端口到Pod的端口

  1. # 以下几个命令执行任意一个即可
  2. $ kubectl port-forward redis-master-7d557b94bb-fptfd 7000:6379
  3. kubectl port-forward redis-master-7d557b94bb-fptfd 7000:6379
  4. kubectl port-forward pods/redis-master-7d557b94bb-fptfd 7000:6379
  5. kubectl port-forward deployment/redis-master 7000:6379
  6. kubectl port-forward rs/redis-master 7000:6379
  7. kubectl port-forward svc/redis-master 7000:6379

输出如下:

  1. Forwarding from 127.0.0.1:7000 -> 6379

查看本地7000端口是否在监听

  1. $ ss -lnptu | grep 7000
  2. tcp LISTEN 0 128 127.0.0.1:7000 *:* users:(("kubectl",pid=57977,fd=6))

访问redis进行测试

  1. $ redis-cli -p 7000
  2. 127.0.0.1:7000> ping
  3. PONG

总结

本机 7000 端口的连接被转发到集群中 Redis Server 所在 Pod 的 6379 端口。当此连接存在时,可以使用自己的机器上的客户端对部署在集群中的 Redis Server 进行 Debug。

注: 由于一些限制,port-forward 目前只支持 TCP 协议。