kubernetes访问pod

现在已经创建了一个tomcat的pod,接下来练习访问pod。

tomcat默认是8080端口提供服务。

kubectl run mytomcat --image=tomcat --port=8080

这里--port暴露容器的8080端口。

要想访问pod的8080端口,有多种方法。

port-forward

通过端口转发映射本地端口到指定的应用端口。

## kubectl port-forward <pod_name> <local_port>:<container_port>

kubectl port-forward mytomcat-7d68ffdbfb-qbp6p 7001:8080

这里把本地7001端口映射到容器的8080端口。再使用curl http://localhost:7001测试返回。

expose

把pod暴露为service。以service的方式提供对外访问。

kubectl expose deployment/mytomcat --type="NodePort" --port=7000 --target-port=8080

其中:

  • --port是本地端口
  • --target-port是容器暴露的端口

type有多个选项:

  • ClusterIP: 通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。
  • NodePort: 通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求<NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
  • LoadBalancer: 使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
  • ExternalName: 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建,这只有 Kubernetes 1.7 或更高版本的 kube-dns 才支持

这里使用NodePort类型做实验。

执行kubectl expose之后,会新增一个service

# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.152.183.1     <none>        443/TCP          25d
mytomcat     NodePort    10.152.183.222   <none>        7000:31364/TCP   69m

kubernetes使用iptables创建了路由规则

# iptables-save | grep 10.152.183.222
-A KUBE-SERVICES ! -s 10.152.183.0/24 -d 10.152.183.222/32 -p tcp -m comment --comment "default/mytomcat: cluster IP" -m tcp --dport 7000 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.152.183.222/32 -p tcp -m comment --comment "default/mytomcat: cluster IP" -m tcp --dport 7000 -j KUBE-SVC-GUOWFPQH6PYKZNE2

使用curl http://<cluster-ip>:<port>测试,成功返回首页内容

curl http://10.152.183.222:7000

参考

Built with Hugo
Theme Stack designed by Jimmy