Conversation
| * **NodePort**:在每个Node上打开一个端口以供外部访问。 | ||
| * **LoadBalancer**:通过外部的负载均衡器来访问。 | ||
|
|
||
| ### ClusterIP && NodePort && LoadBalancer |
| @@ -0,0 +1,181 @@ | |||
| ## Service | |||
| Pod的IP是动态分配在**docker0**所在网段的,当发生重启,扩容等操作时,IP地址会随之变化。当某个Pod(frontend)需要去访问其依赖的另外一组Pod(backend)时,如果backend的IP发生变化时,如何保证fronted到backend的正常通信变的非常重要。为了解决此类问题,Kubernetes设计了Service的概念。 | |||
There was a problem hiding this comment.
这里说了service的一个来历,但是没有说service 是什么。
There was a problem hiding this comment.
多谢提醒,如 @typhoonzero 的建议:#3 (review) 这里的确先从概念的角度上介绍比较合理。
| ## Service | ||
| Pod的IP是动态分配在**docker0**所在网段的,当发生重启,扩容等操作时,IP地址会随之变化。当某个Pod(frontend)需要去访问其依赖的另外一组Pod(backend)时,如果backend的IP发生变化时,如何保证fronted到backend的正常通信变的非常重要。为了解决此类问题,Kubernetes设计了Service的概念。 | ||
|
|
||
| 这里docker0是一个网桥,docker daemon启动container时会根据docker0的网段来划粉container的IP地址[Docker网络](https://docs.docker.com/engine/userguide/networking/dockernetworks/) |
There was a problem hiding this comment.
应该是"Docker的宿主机上"
|
|
||
| 下面我们实际发布一个Service,能够更清晰的了解到Service是如何工作的。 | ||
|
|
||
| ##### 1.1 发布一个rc,并指定replices count为3. |
There was a problem hiding this comment.
rc 作为一个缩写,应该大写。
而且RC有很多含义,remote controller,release candidate。Tutorial里每个概念的第一次出场都应该是全称,后面括号里加注缩写。
|
|
||
| * **apiserver** 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求以后将数据存储到etcd中。 | ||
| * **kube-proxy** kubernetes的每个节点中都有一个叫做kube-proxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables中。 | ||
| * **iptables** 使用NAT等技术将virtualIP的流量转至endpoint中。 |
There was a problem hiding this comment.
这里提到的endpoint跟之前提到的backend是同一个东西吗?如果是的,能否说明下endpoint就是前文提到的backend。不然读到这里突然出现endpoint,backend又不提了,有点奇怪。
或者说介绍service的时候,顺带介绍endpoint一下。
There was a problem hiding this comment.
endpoint也是Kubernetes中的一种资源类型,backend在这里是指的是一组后端服务服务,在这里endpoint指的其实是backend的地址。这里讲的不清楚,我在下一个commit中修复这个问题。
| ##### 1.1 发布一个rc,并指定replices count为3. | ||
|
|
||
| ``` | ||
| yancey@ yancey-macbook kubernetes-1$kubectl create -f rc_nginx.yaml |
There was a problem hiding this comment.
考虑把rc_nginx.yaml和service_nginx.yaml的内容cat出来,或者checkin,并从文章链接一下。后文讲到了“并指定步骤1中的label。”,但是这里并没有出现label是什么(被藏在文件里了),会有一些奇怪。
| ``` | ||
| 查看endpoint信息,发现nginx-service一共有三个endpoint地址,分别对应nginx的三个pod。 | ||
|
|
||
| ##### 1.3. 查看iptables,观察其NAT表中的信息(只截取了部分和这个service有关的信息) |
| status: | ||
| loadBalancer: {} | ||
| ``` | ||
| 观察Iptables中的变化,KUBE-NODEPORTS这个Chain中增加了如下内容 |
There was a problem hiding this comment.
没看出KUBE-NODEPORTS增加了什么内容(是只增加了KUBE-SVC-GKN7Y2BSGW4NJTYL还是KUBE-SVC-GKN7Y2BSGW4NJTYL和KUBE-MARK-MASQ都增加了?)是不是要把之前的KUBE-NODEPORTS内容贴出来一下,或者明确说明增加了如下两条内容。
There was a problem hiding this comment.
是两条都增加了的,的确要说明一下才好。
| spec: | ||
| clusterIP: 10.0.0.229 | ||
| ports: | ||
| - nodePort: 30802 |
There was a problem hiding this comment.
30802和8000我不是特理解,是说这个node对外暴露的端口是8000,30802是做什么的?
There was a problem hiding this comment.
这里nodePort: 30802指的是node对外暴露的端口,而8000是container的端口,我应该在这里解释一下才对:)
| 当发布一个服务之后,我们要使用这个服务,第一个问题就是要拿到这些服务的IP和PORT,kubernetes提供两种方式以便在程序中去动态的获取这些信息。 | ||
|
|
||
| 1. ENV环境变量 | ||
| 在Pod其中之后,kubernetes会将现有服务的IP,PORT以环境变量的方式写入pod中,程序只要读取这些环境变量即可。 |
|
|
||
| 1. ENV环境变量 | ||
| 在Pod其中之后,kubernetes会将现有服务的IP,PORT以环境变量的方式写入pod中,程序只要读取这些环境变量即可。 | ||
| 2. DNS,程序中可以使用server的名称对服务进行访问,在程序启时候,不必预先读取环境变量中的内容。 |
| 当发布一个服务之后,我们要使用这个服务,第一个问题就是要拿到这些服务的IP和PORT,kubernetes提供两种方式以便在程序中去动态的获取这些信息。 | ||
|
|
||
| 1. ENV环境变量 | ||
| 在Pod其中之后,kubernetes会将现有服务的IP,PORT以环境变量的方式写入pod中,程序只要读取这些环境变量即可。 |
There was a problem hiding this comment.
在服务重新创建的时候会变,比如需要修改这个服务的一些配置的情况。变了之后仍然可以通过DNS找到这个服务,所以通常都是用DNS来找到某个服务。对于线上服务来说很少会重新创建服务。
There was a problem hiding this comment.
服务的IP是在创建时被记录下来,并通过kube-proxy进程写在每个node的iptables中,除非重新创建这个service,否则地址是不会被改变的。
typhoonzero
left a comment
There was a problem hiding this comment.
最前面先从概念的角度介绍Service?然后在展开技术细节?
|
已按 @wangkuiyi @helinwang @typhoonzero 的comment做了更新。 |
Kubernetes中Service概念的简介