026.Kubernetes掌握Service-外部訪問


一 集群外部訪問

由於Pod和Service都是Kubernetes集群范圍內的虛擬概念,所以集群外的客戶端默認情況,無法通過Pod的IP地址或者Service的虛擬IP地址:虛擬端口號進行訪問。通常可以通過以下方式進行訪問Kubernetes集群內的服務。

1.1 外部訪問——映射Pod到物理機

為了讓外部客戶端可以訪問這些服務,可以將Pod或Service的端口號映射到宿主機,以使客戶端應用能夠通過物理機訪問容器應用。
示例1:
[root@k8smaster01 study]# vi pod-hostport.yaml
  1 apiVersion: v1
  2 kind: Pod
  3 metadata:
  4   name: webapp
  5   labels:
  6     app: webapp
  7 spec:
  8   containers:
  9   - name: webapp
 10     image: tomcat
 11     ports:
 12     - containerPort: 8080
 13       hostPort: 8081
[root@k8smaster01 study]# kubectl create -f pod-hostport.yaml
[root@k8smaster01 study]# kubectl get pods -l="app=webapp"
NAME READY STATUS RESTARTS AGE
webapp 1/1 Running 0 2m1
[root@k8smaster01 study]# curl 172.24.8.71:8081
示例2:
[root@k8smaster01 study]# cat pod-hostnetwork.yaml
  1 apiVersion: v1
  2 kind: Pod
  3 metadata:
  4   name: webapp2
  5   labels:
  6     app: webapp2
  7 spec:
  8   hostNetwork: true
  9   containers:
 10   - name: webapp2
 11     image: tomcat
 12     ports:
 13     - containerPort: 8080
 14       hostPort: 8080
提示:通過設置Pod級別的hostNetwork=true,該Pod中所有容器的端口號都將被直接映射到物理機上。在設置hostNetwork=true時需要注意,在容器的ports定義部分如果不指定hostPort,則默認hostPort等於containerPort,如果指定了hostPort,則hostPort必須等於containerPort的值。
[root@k8smaster01 study]# curl 172.24.8.73:8080

1.2 外部訪問——映射Service到物理機

示例1:
[root@k8smaster01 study]# vi webappsvc.yaml
  1 apiVersion: v1
  2 kind: Service
  3 metadata:
  4   name: webapp
  5 spec:
  6   type: NodePort
  7   ports:
  8   - port: 8080
  9     targetPort: 8080
 10     nodePort: 8081
 11   selector:
 12     app: webapp
提示:為了k8s和其他程序不起沖突,默認端口的范圍是:30000-32767,因此默認情況以上yaml可能出現如下告警,可通過如下方式修改:provided port is not in the valid range. The range of valid ports is 30000-32767 #告警
[root@k8smaster01 ~]# vi /etc/systemd/system/kube-apiserver.service #在所有master上修改
  1 ExecStart=/opt/k8s/bin/kube-apiserver \
  2 ……
  3   --service-node-port-range=1-65535 \						#添加此參數
  4 ……
[root@k8smaster01 ~]# systemctl daemon-reload
[root@k8smaster01 ~]# systemctl restart kube-apiserver.service

[root@k8smaster01 study]# kubectl create -f webappsvc.yaml
[root@k8smaster01 study]# curl 172.24.8.71:8081
通過設置LoadBalancer映射到雲服務商提供的LoadBalancer地址。這種用法僅用於在公有雲服務提供商的雲平台上設置Service的場景。
示例2:如下所示status.loadBalancer.ingress.ip設置的146.148.47.155為第三方提供的負載均衡器的IP地址。對該Service的訪問請求將會通過LoadBalancer轉發到后端Pod上,負載分發的實現方式則依賴於第三方提供的LoadBalancer的實現機制。
[root@k8smaster01 study]# vi myoutsvc.yaml
  1 apiVersion: v1
  2 kind: Service
  3 metadata:
  4   name: my-service
  5 spec:
  6   type: LoadBalancer
  7   selector:
  8     app: MyApp
  9   ports:
 10   - protocol: TCP
 11     port: 80
 12     targetPort: 9376
 13     nodePort: 30061
 14   clusterIP: 10.0.171.239
 15 status:
 16   loadBalancer:
 17     ingress:
 18     - ip: 47.96.145.131

clipboard


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM