在编排kubernetes时,Deployment的Pod项有containerPort,Service文件里的port,targetPort, nodePort,这些port概念有些时候可能会让人感到非常困惑,这里通过示例来简单介绍各种port的含义
- deploy yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb
namespace: test
spec:
replicas: 2
selector:
matchLabels:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080 # 容器内部需要暴露出去的Port
---
apiVersion: v1
kind: Service
metadata:
name: myweb
namespace: test
spec:
type: NodePort
ports:
- port: 9000 # service暴露在cluster ip上的端口,通过<cluster ip>:port访问服务,通过此端口集群内的服务可以相互访问
targetPort: 8080 # 对应映射到backend后端pod上的端口,需要和containerPort保持一致,否则访问出错。如果targetPort和port一致,则可以缺省。
nodePort: 30001 # 对应映射到Node节点上的端口
selector:
app: myweb
---
应用yaml
$ kubectl apply -f service.yaml
$ kubectl get svc,pod -n test -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/myweb NodePort 10.98.233.194 <none> 9000:30001/TCP 2m47s app=myweb
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/myweb-d5fbd67cd-gm4hj 1/1 Running 0 2m47s 10.1.2.69 docker-desktop <none> <none>
pod/myweb-d5fbd67cd-q7cjz 1/1 Running 0 2m47s 10.1.2.68 docker-desktop <none> <none>
端口映射关系如下图所示:
此时,可以通过以下三种方式进行访问:
## endpoint的方式 需在pod网络内 使用的是pod ip
curl 10.1.2.69:8080
## 服务方式 集群内 使用的是cluster ip
curl 10.98.233.194:9000
## 外网方式 集群外 使用的是node ip
curl 192.168.0.101:30001(curl localhost:30001)