Kubernetes入门

Kubernetes是什么

Kubernetes是用来自动化部署,扩展,管理容器应用的工具.

Kubernetes架构

Kubernetes主要由Master和Node两部分组成.
Architecture

Master

Kubernetes集群包含至少一个Master节点和多个Node节点.Master节点主要用来暴露API,调度部署和管理整个集群.

Node

Node是工作节点,Node可能是物理机器也可能是虚拟机,每个节点上都提供了容器的运行环境,比如说Docker,rkt.

Kubernetes对象

Kubernetes对象持久化在kubernetes系统中,Kubernetes用这些对象来描述集群的状态,比如:

  • 部署的应用
  • 应用的行为,比如重启,升级策略
  • 应用程序可用的资源

描述Kubernetes对象

我们通常会通过.yaml来描述Kuberntes对象,Kubernetes客户端会将yaml文件转成JSON来调用API.
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

我们可以通过下面的命令来创建Kubernetes对象:

1
kubectl create -f docs/user-guide/nginx-deployment.yaml --record

字段说明

在yaml文件中,你需要声明以下字段:

  • apiVersion - 调用的API版本
  • kind - 对象类型
  • metadata - 用于查找对象的字段,比如名称,UID,命名空间

一些常见的kubernetes对象有:

  • Pod
  • Deployments
  • Service
  • Ingress

Pod对象

Pod对象是最小的布署单元,包含了一个或多个容器.通常我们不会单独使用Pod.
Controller对象可创建多个Pod,常风的Controller对象有:

  • Deployment
  • StatefulSet
  • DaemonSet

Deployments对象

Deployments对象可以创建Pod,在Deployments对象中你只需要描述你需要的状态,Deployments对象会将当前状态改变成你所需要的状态.

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

上面的描述文件创建了3个运行Nginx的Pod对象.

通过下面命令来部署和查看Deployments对象:

1
2
kubectl create -f docs/user-guide/nginx-deployment.yaml --record
kubectl get deployment

Service对象

Service对象将Pod对象抽像成一种服务,并定义了访问这些Pod对象的策略,类似于负载均衡(Loadbalancer).Service对象会通过选择器来选择Pod对象.

例:

1
2
3
4
5
6
7
8
9
10
11
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376

Ingress对象

Ingress对象定义了外部请求如何转发到Service,类似于反向代理.
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: s1
servicePort: 80
- path: /bar
backend:
serviceName: s2
servicePort: 80

上面的描述文件定义了Service的访问规则,foo上下文路径会被转发到名为s1的Service,bar上下文路径转发到名为s2的Service.

简而言之:

  • Deployments定义了怎样部署应用(应用image,部署多少实例,启动策略等);
  • Service定义了如何抽像Deployments为服务,类似于负载均衡;
  • Ingress定义了请求如何转发到Service,类似反向代理,如nginx.