基本概念

高可用

系统中部分节点失效时,其他节点能够接替它继续提供服务,则可认为系统具有高可用性

集群

一个特定领域的软件部署在多台服务器上并作为一个整体提供一类服务,这个整体称为集群。如Zookeeper中的Master和Slave分别部署在多台服务器上,共同组成一个整体提供集中配置服务。在常见的集群中,客户端往往能够连接任意一个节点获得服务,并且当集群中一个节点掉线时,其他节点往往能够自动的接替它继续提供服务,这时候说明集群具有高可用性

负载均衡

请求发送到系统时,通过某些方式把请求均匀分发到多个节点上,使系统中每个节点能够均匀的处理请求负载,则可认为系统是负载均衡的

正向代理和反向代理

系统内部要访问外部网络时,统一通过一个代理服务器把请求转发出去,在外部网络看来就是代理服务器发起的访问,此时代理服务器实现的是正向代理;当外部请求进入系统时,代理服务器把该请求转发到系统中的某台服务器上,对外部请求来说,与之交互的只有代理服务器,此时代理服务器实现的是反向代理。简单来说,正向代理是代理服务器代替系统内部来访问外部网络的过程,反向代理是外部请求访问系统时通过代理服务器转发到内部服务器的过程。

Pod

Pod是Kubernetes的最小调度单元
一个Pod里可以有多个容器,容器共享网络与存储卷,可以通过进程间通信和文件共享。
看一个Pod的资源定义文件:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: k8s-demo
spec:
containers:
- name: k8s-demo
image: k8s-demo:0.1
ports:
- containerPort: 80
1
2
$ kubectl create -f pod.yml
pod "k8s-demo" created

kubectl 把这个文件提交给 Kubernetes API 服务,然后 Kubernetes Master 会按照要求把 Pod 分配到 node 上。用下面的命令可以看到这个新建的 Pod:

1
2
3
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
k8s-demo 1/1 Running 0 5s

虽然这个 pod 已经运行了,但是我们无法从外部直接访问。要把服务暴露出来,我们需要创建一个 Service。

Service

在kubernetes中有三种IP

  • Node IP: node的ip地址
  • Pod IP: pod的ip地址
  • Cluster IP: service的ip地址
    Service 的作用有点像建立了一个反向代理和负载均衡器,负责把请求分发给后面的 pod。
    解决了如何访问pod提供的服务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: Service
    metadata:
    name: k8s-demo-svc
    labels:
    app: k8s-demo
    spec:
    type: NodePort
    ports:
    - port: 80
    nodePort: 30050
    selector:
    app: k8s-demo
    1
    2
    $ kubectl apply -f pod.yml
    pod "k8s-demo" configured
    在正常使用中不会一个一个维护pod。这里就会使用到deployment

    Deployment

    保证了支撑服务的微服务Pod数量,保证了服务的高可用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: k8s-demo-deployment
    spec:
    replicas: 10
    template:
    metadata:
    labels:
    app: k8s-demo
    spec:
    containers:
    - name: k8s-demo-pod
    image: k8s-demo:0.1
    ports:
    - containerPort: 80

    Replication Controller

    副本控制器定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个期望值
    它包括以下三部分:
  • Pod期望的副本数量
  • 用于筛选Pod的Label Selector
  • 当Pod的副本数量小于预期数量,用于创建Pod的Pod模板(template)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    apiVersion: v1
    kind : ReplicationController
    metadata :
    name: frontend
    spec:
    replicas: 1
    selector:
    tier: frontend
    template:
    metadata:
    labels:
    app: app-demo
    tier: frontend
    spec:
    containers:
    - name: tomcat-demo
    image: tomcat
    imagePullPolicy: IfNotPresent
    env:
    -name: GET_HOSTS_FORM
    value: dns
    ports:
    - containerPort: 80
    在运行阶段我们可以通过kubectl scale命令修改RC的副本数量
    1
    $ kubectl scale rc redis-slave --replicas=3

    实战