Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kubernetes service tutorials #3

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from

Conversation

Yancey1989
Copy link
Collaborator

Kubernetes中Service概念的简介

* **NodePort**:在每个Node上打开一个端口以供外部访问。
* **LoadBalancer**:通过外部的负载均衡器来访问。

### ClusterIP && NodePort && LoadBalancer
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

&& ==> ,

@@ -0,0 +1,181 @@
## Service
Pod的IP是动态分配在**docker0**所在网段的,当发生重启,扩容等操作时,IP地址会随之变化。当某个Pod(frontend)需要去访问其依赖的另外一组Pod(backend)时,如果backend的IP发生变化时,如何保证fronted到backend的正常通信变的非常重要。为了解决此类问题,Kubernetes设计了Service的概念。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里说了service的一个来历,但是没有说service 是什么。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

多谢提醒,如 @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/)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

“这里”指代的是什么?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

应该是"Docker的宿主机上"


下面我们实际发布一个Service,能够更清晰的了解到Service是如何工作的。

##### 1.1 发布一个rc,并指定replices count为3.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rc 作为一个缩写,应该大写。

而且RC有很多含义,remote controller,release candidate。Tutorial里每个概念的第一次出场都应该是全称,后面括号里加注缩写。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

明白了,多谢指正!


* **apiserver** 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求以后将数据存储到etcd中。
* **kube-proxy** kubernetes的每个节点中都有一个叫做kube-proxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables中。
* **iptables** 使用NAT等技术将virtualIP的流量转至endpoint中。
Copy link

@helinwang helinwang Mar 6, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里提到的endpoint跟之前提到的backend是同一个东西吗?如果是的,能否说明下endpoint就是前文提到的backend。不然读到这里突然出现endpoint,backend又不提了,有点奇怪。
或者说介绍service的时候,顺带介绍endpoint一下。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

endpoint也是Kubernetes中的一种资源类型,backend在这里是指的是一组后端服务服务,在这里endpoint指的其实是backend的地址。这里讲的不清楚,我在下一个commit中修复这个问题。

##### 1.1 发布一个rc,并指定replices count为3.

```
yancey@ yancey-macbook kubernetes-1$kubectl create -f rc_nginx.yaml

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

考虑把rc_nginx.yamlservice_nginx.yaml的内容cat出来,或者checkin,并从文章链接一下。后文讲到了“并指定步骤1中的label。”,但是这里并没有出现label是什么(被藏在文件里了),会有一些奇怪。

```
查看endpoint信息,发现nginx-service一共有三个endpoint地址,分别对应nginx的三个pod。

##### 1.3. 查看iptables,观察其NAT表中的信息(只截取了部分和这个service有关的信息)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

赞👍,讲的很详细。

status:
loadBalancer: {}
```
观察Iptables中的变化,KUBE-NODEPORTS这个Chain中增加了如下内容

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没看出KUBE-NODEPORTS增加了什么内容(是只增加了KUBE-SVC-GKN7Y2BSGW4NJTYL还是KUBE-SVC-GKN7Y2BSGW4NJTYL和KUBE-MARK-MASQ都增加了?)是不是要把之前的KUBE-NODEPORTS内容贴出来一下,或者明确说明增加了如下两条内容。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是两条都增加了的,的确要说明一下才好。

spec:
clusterIP: 10.0.0.229
ports:
- nodePort: 30802

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

30802和8000我不是特理解,是说这个node对外暴露的端口是8000,30802是做什么的?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里nodePort: 30802指的是node对外暴露的端口,而8000是container的端口,我应该在这里解释一下才对:)

当发布一个服务之后,我们要使用这个服务,第一个问题就是要拿到这些服务的IP和PORT,kubernetes提供两种方式以便在程序中去动态的获取这些信息。

1. ENV环境变量
在Pod其中之后,kubernetes会将现有服务的IP,PORT以环境变量的方式写入pod中,程序只要读取这些环境变量即可。

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

需要空一行,否则显示出来没有换行。


1. ENV环境变量
在Pod其中之后,kubernetes会将现有服务的IP,PORT以环境变量的方式写入pod中,程序只要读取这些环境变量即可。
2. DNS,程序中可以使用server的名称对服务进行访问,在程序启时候,不必预先读取环境变量中的内容。

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DNS之后空一行吧。

当发布一个服务之后,我们要使用这个服务,第一个问题就是要拿到这些服务的IP和PORT,kubernetes提供两种方式以便在程序中去动态的获取这些信息。

1. ENV环境变量
在Pod其中之后,kubernetes会将现有服务的IP,PORT以环境变量的方式写入pod中,程序只要读取这些环境变量即可。

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好奇服务的IP在pod运行过程中有可能变吗?要是变了怎么办。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

在服务重新创建的时候会变,比如需要修改这个服务的一些配置的情况。变了之后仍然可以通过DNS找到这个服务,所以通常都是用DNS来找到某个服务。对于线上服务来说很少会重新创建服务。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

服务的IP是在创建时被记录下来,并通过kube-proxy进程写在每个node的iptables中,除非重新创建这个service,否则地址是不会被改变的。

Copy link
Collaborator

@typhoonzero typhoonzero left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

最前面先从概念的角度介绍Service?然后在展开技术细节?

@Yancey1989
Copy link
Collaborator Author

已按 @wangkuiyi @helinwang @typhoonzero 的comment做了更新。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants