Kubernetes进阶之路(九)Service系列之ClusterIP&NodePort

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes进阶之路(九)Service系列之ClusterIP&NodePort相关的知识,希望对你有一定的参考价值。

参考技术A 在定义Service的时候可以指定一个自己需要的类型的Service,如果不指定的话默认是ClusterIP类型。

可以使用的服务类型如下:

通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的Service类型。ClusterIP类型的service创建时,k8s会通过etcd从可分配的IP池中分配一个IP,该IP全局唯一,且不可修改。所有访问该IP的请求,都会被iptables转发到后端的endpoints中。

通过每个 Node 节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 :,可以从集群的外部访问一个 NodePort 服务。

需要外部支持(GCP and Azure),用户访问service.spec.external-ip,该IP对应到一个外部负载均衡的vip,外部服务对这个vip的请求,会被loadbalancer通过健康检查和转发,发送到一个运行着该服务pod的node上,并同样通过nodePort里的端口映射,发送给容器。

用户可以指定一个任意的名字,作为该service被解析的CNAME,这种类型的servcie不用指定clusterIP,因此kube-proxy不会管理这类service,这类service需要使用1.7版本以上的kubedns。

(1)创建whoami-deployment.yaml文件

(2)运行yaml文件并查看pod以及service

(3)在集群内正常访问

(4)创建whoami的service

注意:该地址只能在集群内部访问

**可以发现有一个Cluster IP类型的service,名称为whoami-deployment,IP地址为10.97.233.149

(5)通过Service的Cluster IP访问

(6)具体查看一下whoami-deployment的详情信息,发现有一个Endpoints连接了具体3个Pod

(7)下面通过deployment对whoami扩容成5个

(8)再次访问:curl 10.97.233.149:8000

(9)再次查看service具体信息:kubectl describe svc whoami-deployment

(10)其实对于Service的创建,不仅仅可以使用kubectl expose,也可以定义一个yaml文件

总结:其实Service存在的意义就是为了Pod的不稳定性,而上述探讨的就是关于Service的一种类型Cluster IP,只能供集群内访问。

因为外部能够访问到集群的物理机器IP,所以就是在集群中每台物理机器上暴露一个相同的IP,从给定的配置范围内(默认:30000-32767)分配端口

(1)根据whoami-deployment.yaml创建pod

(2)创建NodePort类型的service,名称为whoami-deployment

(3)注意上述的端口31999,实际上就是暴露在集群中物理机器上的端口

(4)浏览器通过物理机器的IP访问

使用浏览器访问:

总结:NodePort虽然能够实现外部访问Pod的需求,但这种方法有许多缺点:

1.每个端口只能是一种服务

2.端口范围只能是 30000-32767

3.如果节点/VM 的 IP 地址发生变化,你需要能处理这种情况

基于以上原因,我不建议在生产环境上用这种方式暴露服务。如果你运行的服务不要求一直可用,或者对成本比较敏感,你可以使用这种方法。这样的应用的最佳例子是 demo 应用,或者某些临时应用。

因篇幅太长分为两章来写。

Java开发进阶之路

背景一

我接触Java开发已经一年多了了。

从刚开始生涩地接触语法,惹得编译器报各种语法错误;到接触OOD的思想,封装、继承、多态,懵懵懂懂地听说着它们;再到学习Web开发,想着这些也许并不重要,实际用的无非是Dao、Service、Controller罢了;最后幡然醒悟:就这样,一年已逝。

 

人总是要有些奋斗的目标的,暂且以此篇作为我而后一年的开端,思索一下接下去的学习之路。

技术分享

背景二

我一直在想到底怎么样才能把Java学好,到底要学些什么,从哪里开始学,又要学多深?

我曾想的是,先广而后深。于是,除了培训出来的SSM/SSH,还把Spring Boot、Zookeeper、Dubbo、RocketMQ、ActiveMQ、Kafka、WebSocket、Git、Redis、Linux、FastDFS、Nginx、多线程、JVM、BIO、NIO、AIO、Netty、Docker、SpringCloud、Storm以及常用设计模式给学了个遍。

不过想想就能知道,一个区区一年经验的Java开发,哪来的那么多时间精力把这么多东西学得透彻。到头来无非是都只知皮毛,稍能使用而已。

而且这么多的东西,想必大部分人在的公司都用不到。便如我现在的这家公司,项目也无非就是SSM+Redis,在用Maven分个模块罢了。

我之前逛知乎的时候,看到过一些言论:大部分Java开发程序员所在的公司都不过寻常的小公司,接触的也尽是这些寻常不过的项目,连分布式什么的都接触不到;又谈什么学习技术、升职加薪。

刚开始看到这些,顿觉一股凉意升腾,他并没有说错。可又心有不甘。既然选择了这条路,怎么轻言放弃。机会总是有的。所谓的一命二运三风水,四积阴德五读书,要是真信了,怕真就一语成谶,一为命二为运了。

伊始

如何学习我到现在也只有个大致的思路,写出来,做个分享,也为自己接下去一年的学习设个目标。

上面说的这些技术,虽说我自己学得也不精;但大体都有所了解。虽然感觉略懂无用,但有一点是很重要的,那就是对整个系统的架构能有所了解。能知道所谓分布式系统的大致实现思路,不至于别人说用个Dubbo、Zookeeper,自己却一无所知,不知道这两货是干啥的。

还有最重要的一点,那就是,学这些技术,大多数人的第一步都是先百度。这我也曾做过,结果看了一万篇技术文章,仍旧云里雾里。所以说,千里执行,始于敲打。打一遍,自然就明白了。

其次,Linux真的是很重要。我大学时候倒是学过一些,不过忘光了。但是,到如今,我只能说,JavaWeb开发的,所有东西,都是部署在Linux上的。不学它,你甚至连那些MQ的环境都搭建不起来,谈何学习。

如果想要学习它,其实也不难(每个人对自己会的东西都会这么说。。。),弄个Vmware虚拟机软件,开个三台左右的虚拟机,再弄个xshell,然后就开始照着网上的教程把想学的东西的环境一个一个自己搭建出来,便OK了。当然,最好还是从搭建JDK和Tomcat开始。

正文

大致的学习顺序

  1. 设计模式:熟悉23种设计模式。虽说对于大部分项目来说使用设计模式稍显冗余,不过在某些情况下,这些前人所总结的经验确实能让人大受裨益。当然,先学习它的原因还在于,JDK源码以及其他各类框架,大多数都使用了很多设计模式。倘若对它不熟悉,那么日后看源码的时候自然是不能一蹴而就。
  2. 数据结构和算法:这个东西就显得有些庞大了。对于我而言,我既然选择的是JavaWeb开发,就很显而易见的,我对这些全然无知。但是,推荐把《数据结构和算法》这本书粗看一遍——这个粗是很粗,我是只把有哪些数据结构、排序算法以及数据结构的curd的效率记了下,便作罢了。之所以要了解这个,主要是Java中的一些集合是采用这些结构的,所以至少要知道这些数据结构的大致结构,以及增删改查的效率。
  3. JDK常用包的源码:这个我也正在进行,是从io包开始看的。不过进行到一半便辗转学设计模式去了。阅读JDK源码的好处很多,显而易见的就是,在使用各个类的时候能够大致清楚哪些类有哪些方法能够干什么,以及这些类的大致实现过程。当然,这个也无需看得很细——太细的其实也看不懂。另外,常备一个JDK文档是很重要的。
  4. JVM1:这块以我现在的了解程度,只能说它学无止境。不过至少基本的概念要明白的,就是JVM内存模型,新生代、老生代、GC算法这些。这些东西如果只是粗看的话其实就是硬背而已。此外,很多东西其实都是息息相通的。例如之前学多线程的时候学过一个volatile关键字,刚开始只知道它是保证变量的可见性,每次获取被该关键字注解的变量时,直接从堆栈中获取,不从线程的缓冲区中获取。而后了解了JVM,就知道了所谓的缓冲区就是TLAB,是堆中划分给每个线程的单独的缓冲区。
  5. JVM2:此外,还要明白类的加载方式。这块我暂且还没学习。不过类加载器、包括反射这些其实都是很重要的。明白了这些,才能更透彻地理解我们所写的代码的运行——不说这些虚的,就一点,如果要自己写个好的框架,大多是要用到这些的。我之前看到一本教用GO语言写JVM的书,打算是照着这本书敲一遍的。
  6. JVM3:还有的就是JVM的优化。我目前所知的也就是设置一些参数来减少GC次数。想要了解更多,应该还是要用专门的工具获取JVM的运行状况的——我现在还不了解。
  7. common、guava等各类工具jar:这些我想的是了解就好,能够知道什么功能可以直接使用。而不是一碰到不知道的功能,就跑去自己造轮子,结果写得一团糟。当然,如果日后有闲工夫,也可以仔细地看下这些jar的具体实现。但就我目前来说,感觉还是会用就好。
  8. 各类框架的源码:Spring、SpringMVC、MyBatis等。这些源码肯定都是要好好读一读的。不过我目前都没有读过。具体的不是很清楚
  9. MySQL:数据库的重要性是不言而喻的。之所以不是Oracle的原因是——Oracle太难了。只是作为一个Java开发的话,在自己的本职技术还没有掌握完全的情况下,还是不要好高骛远了。对MySQL的优化以及分库分表、分布式事务等一些相关的技术有所了解就好。至少面试的时候问你关于数据库的优化能说出一二来。
  10. 其他:最后,推荐阅读《Java编程思想》、《effective java》等书——当然除了这些玄——之所以说悬,是因为这些其实是内功——书,一些专门介绍如何使用某类技术的书也是必不可少的。这就如武林高手对决,任凭内功盖世,总得有一技傍身,才能有用武之地。

结尾

最后,关于去哪找这些学习资料。我只想说,作为一个程序员,连这都找不到的话,那就是真的有些过分了。善用搜索引擎,95%的问题,都已经有前人铺路了。

 

以上是关于Kubernetes进阶之路(九)Service系列之ClusterIP&NodePort的主要内容,如果未能解决你的问题,请参考以下文章

测开之路九十五:css进阶之光标和溢出内容处理

Java进阶之路:看完这篇Kubernetes的深入分析后,我完全掌握了这门技术!

Kubernetes 进阶训练营 网络

Kubernetes 进阶训练营 网络

Kubernetes 进阶训练营 网络

Kubernetes第七篇:Pod进阶Controller进阶Resource和Dashboard