一、将容器应用的端口号映射到物理机二、将Service的端口号映射到物理机上
Pod和Service是K8s集群范围内的虚拟概念,所以集群外的客户端系统无法通过Pod的IP地址或者Service的虚拟IP地址和虚拟端口号访问。为了让外部客户端可以访问这些服务,可以将Pod或Service的端口号映射到宿主机,以使得客户端应用能够通过物理机访问容器应用。
一、将容器应用的端口号映射到物理机1.通过设置容器级别的hostPort,将容器应用的端口号映射到物理机上
pod-hostport.yaml
apiVersion: v1kind: Podmetadata: name: webapp labels: app: webappspec: containers: - name: webapp image: tomcat ports: - containerPort: 8080 hostPort: 8081
通过kubectl create命令创建这个Pod
kubectl create -f pod-hostport.yamlpod "webapp" created
通过物理机的IP地址和8081端口号方位Pod内的容器服务:
curl 192.168.18.3:8081
2.通过设置Pod级别的hostNetwork=true,该Pod中所有容器的端口号都将被直接映射到物理机上。
设置hostNetwork=true时需要注意,在容器的ports定义部分如果不指定hostPort,则默认hostPort等于containerPort,如果指定了hostPort,则hostPort必须等于containerPort的值。
pod-hostnetwork.yaml
apiVersion: v1kind: Podmetadata: name: webapp labels: app: webappspec: hostNetwork: true containers: - name: webapp image: tomcat imagePullPolicy: Never ports: - containerPort: 8080
创建这个Pod
kubectl create -f pod-hostnetwork.yamlpod "webapp" created
通过物理机的IP地址和8080端口号访问Pod内的容器服务
curl 192.168.18.4:8080
二、将Service的端口号映射到物理机上 1.通过设置nodePort映射到物理机,同时设置Service的类型为NodePort
webapp-svc-nodeport.yaml
apiVersion: v1kind: Servicemetadata: name: webappspec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 8081 selector: app: webapp
创建这个Service
kubectl create -f webapp-svc-nodeport.yaml
通过物理机的IP地址和nodePort 8081端口号访问服务:
curl 192.168.18.3:8081
对该Service的访问将被负载分发到后端的多个Pod上。
2.通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址
这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。
下面的例子中,status.loadBalancer.ingress.ip设置的146.148.47.155为云服务商提供的负载均衡器的IP地址。对该Service的访问请求将会通过LoadBalancer转发到后端Pod上,负载分发的实现方式则依赖于云服务商提供的LoadBalancer的实现机制。
kind: ServiceapiVersion: v1metadata: name: my-servicespec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 nodePort: 30061 clusterIP: 10.0.171.239 loadBalancerIP: 78.11.24.19 type: LoadBalancerstatus: loadBalancer: ingress: - ip: 146.148.47.155