如何从 Kubernetes 集群外访问集群内的容器服务
HostNetwork
将pod设置为hostNetwork的,即直接使用宿主机网络。hostNetwork类型的pod与宿主机共享网络协议栈。
缺点:
假如pod重建,pod可能会调度到其他node上,这时pod的ip就改变了,那么客户端的配置很可能需要更改
与宿主机共享网络协议栈,需要考虑端口冲突的问题。如果此类型的pod太多,端口会冲突,运维成本高
1、编写pod 的yaml,文件名为:hostnet.yaml
apiVersion: v1 kind: Pod metadata: name: my-nginx spec: hostNetwork: true containers: - name: my-nginx image: myapp:v1
2、创建pod
kubectl apply -f hostnet.yaml
3、查看pod创建情况
kubectl get pods -o wide
4、访问容器内的服务
curl 192.168.49.2
HostPort
将pod中某个容器的端口映射到宿主机端口上,然后通过访问宿主机ip+宿主机端口来访问pod
缺点:
假如pod重建,pod可能会调度到其他node上,这个时候node的ip就改变了,那么客户端的配置很可能需要更改
因为需要把容器的端口映射到宿主机上,所以需要考虑端口冲突的问题
1、编写pod 的yaml,文件名为:hostport.yaml
apiVersion: v1 kind: Pod metadata: name: hostport-nginx spec: containers: - name: hostport-nginx image: myapp:v1 ports: - containerPort: 80 hostPort: 8081
2、创建pod
kubectl apply -f hostport.yaml
3、查看pod创建情况
kubectl get pods -o wide
4、访问容器内的服务
curl http://192.168.49.2:8081
NodePort service
可以通过创建NodePort类型的Service来将pod暴露到 Kubernetes 集群外。当我们创建一个NodePort类型的service时, Kubernetes 会自动分配一个node port,
并且会在所有的k8s node上创建相应的iptables规则,用户可以通过访问任一k8s node的ip+node port,即可访问后端服务。
缺点:
当创建一个NodePort类型的service, Kubernetes 会自动分配一个端口,并且在所有的k8s node上配置针对该端口的dnat规则
需要考虑访问哪个node的ip,选择的node宕机了怎么办
1、在 Kubernetes 集群中部署后端服务
2、创建NodePort类型的service,并且上面创建的pod
3、集群外访问server
[maomao@wangwu kuber]$ kubectl create deployment myappv1 --image=myapp:v1 # 在 Kubernetes 集群中部署后端服务 deployment.apps/myappv1 created [maomao@wangwu kuber]$ kubectl get deployment,pods -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.apps/myappv1 1/1 1 1 14s myapp myapp:v1 app=myappv1 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/myappv1-56f6fc49cf-tfdzv 1/1 Running 0 14s 172.17.0.4 minikube <none> <none> [maomao@wangwu kuber]$ [maomao@wangwu kuber]$ kubectl expose deployment myappv1 --name=myappv1-svc --type=NodePort --port=80 --target-port=80 # 创建NodePort类型的service,并且上面创建的pod service/myappv1-svc exposed [maomao@wangwu kuber]$ kubectl get deployment,svc,pods -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.apps/myappv1 1/1 1 1 2m2s myapp myapp:v1 app=myappv1 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h52m <none> service/myappv1-svc NodePort 10.103.238.146 <none> 80:30111/TCP 9s app=myappv1 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/myappv1-56f6fc49cf-tfdzv 1/1 Running 0 2m2s 172.17.0.4 minikube <none> <none> [maomao@wangwu kuber]$ curl 192.168.49.2:30111 # 集群外访问 <h3>nginx test.</h3>
LoadBalancer service
LoadBalancer service 是一个比较理想的选择。这个需要cloud-provider的支持,
各个云服务提供商基于自己的LB服务对接实现 Kubernetes LoadBalancer service。
当用户创建LoadBalancerservice时,cloud-controller-manager会自动创建一个LB实例,分配一个VIP,
并且会自动维护后端pod列表和LB的配置更新。然后我们可以访问VIP:port来访问后端服务
缺点:存在成本
Ingress
用户也可以通过创建Ingress资源来将服务暴露到 Kubernetes 集群外。