--昨夜西风凋碧树,独上高楼,望尽天涯路
-
Service小试牛刀
Controller会通过动态创建和销毁Pod来保证整体的健壮性。由于每个Pod都有自己的IP地址,当Controller用新的Pod替代发生故障的Pod时,新Pod会分配到新的IP地址,这样由于IP变化就导致了客户端无法访问该Pod。
Kubernetes通过Service来解决这个问题。
创建一个Deployment:
启动三个Pod,label是run:httpd,Service将会用这个label来挑选Pod
Pod分配了各自的IP,这些IP只能被Kubernetes Cluster中的容器和节点访问
创建Service:
kind指定类型为Service,selector选择label为run:httpd,port指定Service的端口,targetPort指定Pod的端口
运行Service:
该service分配到10.105.68.228这个Ip
访问成功,并且通过kubectl describe查看service发现内部的Endpoint映射到了3个Pod的80端口。
-
DNS访问Service
查看当前的service
当前环境采用的是coredns每当有新的Service被创建,DNS服务器会添加该Service的DNS记录。Cluster中的Pod可以通过<SERVICE_NAME>.<NAMESPACE_NAME>访问Service
启动一个临时的busybox来测试,通过Service name来访问pod(注意,由于没有指定namespace默认都使用的是default namespace,所以不加.namespace来访问。):
加上namespace之后发现无法连接,必须加namespace全名才可以正常访问:
新建配置文件,可以在一个配置文件中同时部署,只需要用---隔开就可以。指定namespace为kube-public,为Pod配置Service:
运行应用,并且查看Pod和Service(由于制定了namespace,查看的时候必须加namespace,否则会去找default):
在default命名空间下运行busybox应用,并且测试DNS访问:
-
外网访问Service
Kubernetes提供了多种类型的Service,默认是ClusterIP
1)ClusterIP
Service通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可访问。
2)NodePort
Service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过<NodeIP>:<NodePort>访问Service
3)LoadBalancer
Service利用cloud provider特有的load balancer对外提供服务(目前支持cloud provider有GCP、AWS等)。
新建Service应用和pod应用:
查看当前Pod和Service,并且通过host ip查看发现外网访问成功:
上面的方式是Kubernetes随机从30000~32767中间分配一个可用的端口,还可以指定host端口,修改配置文件:
nodePort:host主机的端口
port:Service的端口
targetPort:Pod的端口
运行新的Service,并且查看、测试: