由于Pod和Service是kubernetes集群范围内的虚拟概念,所以集群外的客户端系统无法通过Pod的IP
地址或者Service的虚拟IP地址和虚拟端口号访问到它们。为了让外部客户端可以访问这些服务,可以将
Pod或Service的端口号映射到宿主机,以使得客户端应用能够通过物理机访问容器应用。
将容器应用的端口号映射到物理机
(1) 通过设置容器级别的hostPort,将容器应用的端口号映射到物理机上:
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
app: webapp
spec:
containers:
- name: webapp
image: tomcat
ports:
- containerPort: 8080
hostPort: 8081 # 通过物理机的IP地址和8081端口访问Pod的tomcat服务
(2) 通过设置Pod级别的hostNetwork=true,改Pod中所有容器的端口号都将被直接映射到物理机上。设置hostNetwork=true时需要注意,在容器的ports定义部分如果不指定hostPort,则默认hostPort等于containerPort,如果制定了hostPort,则hostPort必须等于containerPort的值。
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
app: webapp
spec:
hostNetwork: true
containers:
- name: webapp
image: tomcat
ports:
- containerPort: 8080 # 通过物理机的IP地址和8080端口访问Pod的tomcat服务
将Service的端口号映射到物理机
(1) 通过设置nodePort映射到物理机,同时设置Service的类型为NodePort:
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
type: NodePort
ports:
- port: 8080 # service 所需的端口号
targetPort: 8080 # 后端pod的端口号
nodePort: 8081 # 与service端口号映射的物理节点的端口号,通过物理机的IP地址和8081端口访问Pod的tomcat服务
selector:
app: webapp
(2) 通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种方法仅用于在公有云服务提供商的云平台上设置Service的场景。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targerPort: 9376
nodePort: 30001
clusterIP: 10.0.171.239
loadBalancerIP: 78.11.24.19
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 146.148.47.155 # 云服务商提供的负载均衡器的IP地址