一、前言 kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源Service,就是就是asetofPod,作用是提供一个稳定的IP,给集群外访问。 本文所需要的ingresscontroller的mandatory。yaml文件:https:www。syjshare。comres6BFS49US 本文所有涉及的Service的两种部署方式(NodePort和ClusterIP)yaml文件:https:www。syjshare。comresZLYV4RE7 Service暴露服务的方式一共有四种,如下: ClusterIP:通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问。这也是默认的ServiceType。 NodePort:通过每个节点上的IP和静态端口(NodePort)暴露服务。NodePort服务会路由到自动创建的ClusterIP服务。通过请求节点IP:节点端口,你可以从集群的外部访问一个NodePort服务。 LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。外部负载均衡器可以将流量路由到自动创建的NodePort服务和ClusterIP服务上。 ExternalName:通过返回CNAME和对应值,可以将服务映射到externalName字段的内容(例如,foo。bar。example。com)。无需创建任何类型代理。 其中,最常见的两种是ClusterIP和NodePort,本文实践这种两种方式。二、NodePort2。1新建命名空间 当我们需要开始做一件事情的时候,最好重新建一个命名空间,这样不干扰之前的,如下: 2。2切换命名空间切换命名空间kubectlconfigsetcontext(kubectlconfigcurrentcontext)namespacemyns 2。3新建Pod和Service并测试 ServiceapiVersion:appsv1kind:Deploymentmetadata:name:whoamideploymentlabels:app:whoamispec:replicas:3selector:matchLabels:app:whoamitemplate:metadata:labels:app:whoamispec:containers:name:whoamiimage:jwilderwhoamiports:containerPort:8000apiVersion:v1kind:Servicemetadata:name:whoamiservicespec:ports:port:81默认就是访问80端口curlserviceIp就好protocol:TCPtargetPort:8000映射到targetPort为8000就是上面pod那个selector:app:whoamiselector匹配上模板上的label 要搞清楚podservice的关联关系 pod使用的是jwilderwhoami镜像,这个是公开的镜像,没问题 pod和service通过labelselector关联起来,pod中定义app:whoami这个标签,然后servie中通过selector:app:whoami这个选择器找到这个标签,selectorlabel标签选择器绑定完成之后,就是端口绑定,然后service使用的是80端口映射到所绑定的pod的8000的端口,就是访问service的80端口,就是访问pod的8000端口。 要搞清楚pod的ip地址service的ip地址宿主机的ip地址的关联关系 集群内端口 集群内ip 外网ip 外网port pod ports:containerPort:8000指定(只能集群内访问) 自动分配(只能集群内访问) 无 无 service ports:port:80指定(只能集群内访问)其中的targetPort:8000映射到pod 自动分配(只能集群内访问) 宿主机静态IP 自动分配30000以上 三、Ingress3。1总述 ingress和ingresscontroller是两个不同东西,是两个不同的配置文件 ingressingresscontrollerservicepod 3。2实践3。2。1新建ingressControllerkubectllabelnodemnameingresskubectlapplyfmandatory。yamlkubectlgetallningressnginx mandatory。yaml这个yaml文件太大了,不好放在博客里面,读者可以从https:www。syjshare。comres6BFS49US下载获得。 另外,注意这个ingresscontroller使用HostPort方式运行,所以mandatory。yaml文件中有hostNetwork:true这句。3。2。2创建tomcat的pod和service 创建tomcat的pod和servicevitomcat。yamlkubectlapplyftomcat。yamlkubectlgetsvckubectlgetpodsapiVersion:appsv1kind:Deploymentmetadata:name:tomcatdeploymentlabels:app:tomcatspec:replicas:1selector:matchLabels:app:tomcattemplate:metadata:labels:app:tomcatspec:containers:name:tomcatimage:tomcatports:containerPort:8080apiVersion:v1kind:Servicemetadata:name:tomcatservicespec:ports:port:80protocol:TCPtargetPort:8080selector:app:tomcat 3。2。3创建Ingress以及定义转发规则 创建Ingress以及定义转发规则kubectlapplyfnginxingress。yamlkubectlgetingresskubectldescribeingressnginxingressingress这个就是extensionsv1beta1,不要修改apiVersion:extensionsv1beta1kind:Ingressmetadata:name:nginxingressspec:rules:host:tomcat。jack。comhttp:paths:path:backend:serviceName:tomcatserviceservicePort:80 3。2。4测试 chrome浏览器访问这个就好了 3。2。5再搞一个测试apiVersion:appsv1kind:Deploymentmetadata:name:whoamideploymentlabels:app:whoamispec:replicas:3selector:matchLabels:app:whoamitemplate:metadata:labels:app:whoamispec:containers:name:whoamiimage:jwilderwhoamiports:containerPort:8000apiVersion:v1kind:Servicemetadata:name:whoamiservicespec:ports:port:81默认就是访问80端口curlserviceIp就好protocol:TCPtargetPort:8000映射到targetPort为8000就是上面pod那个selector:app:whoamiselector匹配上模板上的label 成功 四、尾声 Service暴露的两种方式,完成了。 ClusterIP直译就是集群内ip,所以就是不暴露外部端口,是默认方式; NodePort直译就是节点端口,所以就是虚拟机宿主机的端口,就是暴露外部端口。 一般来说,ClusterIP是默认的服务类型,所以使用这种更好,但是比较复杂,需要配置ingress和ingresscontrolller,将ingress作为入口。 天天打码,天天进步!!