不少Kubernetes的初学者对Kubernetes里面三种不一样的IP地址和工做机制理解得不是很清楚。html
本文咱们经过一个最简单的例子来学习。node
用以下命令行建立一个基于nginx的deployment:nginx
kubectl run nginx --image=nginx:maxlinedocker
用kubectl get deploy查当作功生成的名为nginx的deployment:api
此时这个deployment里的nginx pod还没法对外界提供服务。浏览器
咱们建立一个service让外界可以消费。使用命令行建立这样的一个service:服务器
kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80网络
type的类型选择为LoadBalancer, --port指定的是80端口,意思是这个service对外界暴露出来的服务端口是80,--target-port=80,这个端口是pod内部的nginx docker容器提供服务的工做端口,默认为80。这里实际上创建了向外界开发的80端口同nginx容器内部端口的一个映射关系。ide
执行完毕后,咱们调用下面的命令行,看到了建立的service的Cluster IP和External IP。学习
其中external IP很好理解,这个service经过external IP加上咱们前面介绍的被映射到80端口向外界提供服务:
浏览器里输入External IP http://35.241.173.27:80, 能成功访问nginx服务器的index.html:
而咱们经过Service的Cluster IP是没法访问这个Service提供的功能的。
咱们知道Kubernetes里的全部pod均可以彼此通讯,而不须要经过网络地址转换(Network Address Translation-NAT),全部的节点也能够与全部的pod通讯。而Service的Cluster IP,是一个内部的IP地址,专门用于同Cluster内部的节点或者pod通讯。同外界通讯,仍是经过External IP进行。
再试试NodePort。
kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80
注意看下图的PORT栏下面显示的类型为NodePort的端口:31375
这个端口号是Kubernetes expose命令自动生成的,范围在30000到32767之间。若是须要修改,能够编辑api server的配置文件:/etc/kubernetes/apiserver:
有了这个端口号,咱们随便使用一个node的IP地址,后面拼接上:31375便是外部能够消费的完整地址。
使用命令行kubectl get nodes -o wide, 在结果里选择任意节点的External-IP,后面加上:31375:
测试:
测试经过。
值得一提的是,有时咱们出于测试的目的,须要一种简单的办法查看一个pod是否能正常提供服务。若是每次经过kubectl的方式建立service就太麻烦了。
这里介绍一种简单的办法:pod的端口转发功能(port forward)。
好比咱们想测试下图get pods返回的第一个pod的功能,名称为nginx-6f754dd4b9-74jdn:
执行命令行 kubectl port-forward pod/nginx-6f754dd4b9-74jdn 8080:80
看到提示信息Forwarding from 127.0.0.1:8080 -> 80, 意思是把当前主机的8080端口映射到nginx pod的80工做端口:
最后,就可以经过localhost:8080直接访问nginx pod提供的服务了:
要获取更多Jerry的原创文章,请关注公众号"汪子熙":