Kubernetes 入门知识

基本概念

  • Service
  • Pod
  • Deployments(RC)

Service

表示业务系统中的一个“微服务”,每个具体的Service背后都有分布在多个机器上的进程实例来提供服务,这些进程实例在Kubernetes里被封装为一个个Pod,Pod基本等同于Docker Container,稍有不同的是Pod其实是一组密切捆绑在一起并且“同生共死”的Docker Container,从模型设计的角度来说,的确存在一个服务实例需要多个进程来提供服务并且它们需要“在一起” 的情况。

ClusterIP

Kubernetes的Service与我们通常所说的“Service”有一个明显的的不同,前者有一个虚拟IP地址,称之为“ClusterIP”,服务与服务之间“ClusterIP+服务端口”的方式进行访问,而无需一个复杂的服务发现的API

这样一来,只要知道某个Service的ClusterIP,就能直接访问该服务,为此,Kubernetes提供了两种方式来解决ClusterIP的发现问题:

  • 环境变量
    比如定义了一个名称为ORDER_SERVICE的Service ,分配的ClusterIP为10.10.0.3 ,则在每个服务实例的容器中,会自动增加服务名到ClusterIP映射的环境变量,ORDER_SERVICE_SERVICE_HOST=10.10.0.3,于是程序里可以通过服务名简单获得对应的ClusterIP。
  • DNS
    每个服务名与ClusterIP的映射关系会被自动同步到Kubernetes集群里内置的DNS组件里,于是直接通过对服务名的DNS Lookup机制就找到对应的ClusterIP了,这种方式更加直观。

Service与Pod的绑定

Kubernetes是如何绑定Service与Pod的呢?它如何区分哪些Pod对应同一个Service?答案也很简单——“贴标签”。

每个Pod都可以贴一个或多个不同的标签(Label),而每个Service都一个“标签选择器”,标签选择器(Label Selector)确定了要选择拥有哪些标签的对象。

例如:定义了一个称之为ku8-redis-master的Service

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Service
metadata:
name: ku8-redis-master
spec:
ports:
- port: 6379
selector:
app: ku8-redis-master

标签选择器的内容为“app: ku8-redis-master”,表明拥有“app= ku8-redis-master”这个标签的Pod都是为它服务的。

对应的Pod定义

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
name: ku8-redis-master
labels:
app: ku8-redis-master
spec:
containers:
- name: server
image: redis
ports:
- containerPort: 6379
restartPolicy: Never

Pod

  • pause:根容器

Deployments(RC)

Deployments作用是用来告诉Kubernetes,某种类型的Pod(拥有某个特定标签的Pod)需要在集群中创建几个副本实例,Deployment/RC的定义其实是Pod创建模板(Template)+Pod副本数量的声明(replicas)

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: ReplicationController
metadata:
name: ku8-redis-slave
spec:
replicas: 2
template:
metadata:
labels:
app: ku8-redis-slave
spec:
containers:
- name: server
image: devopsbq/redis-slave
env:
- name: MASTER_ADDR
value: ku8-redis-master
ports:
- containerPort: 6379

参考链接