Kubernetes

Published: 06 Dec 2018 Category: docker

一、K8S是什么

Kubernetes([kubə’netis],重音在第三个音节,读音:库伯耐踢死) 是Google 开源的容器集群管理系统,是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。

通过应用容器化使应用简单、快捷的方式更新和发布,也能实现热更新、迁移等操作。使用Kubernetes能确保程序在任何时间、任何地方运行,还能扩展更多有需求的工具/资源。

如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

使用Kubernetes可以:

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 将容器组织成组,并且提供容器间的负载均衡
  • 很容易地升级应用程序容器的新版本
  • 提供容器弹性,如果容器失效就替换它

1.1 K8S重要组成

总体架构:

K8S简单架构

图中有两种节点:

  • Master 节点主要负责控制和维护整个集群的状态,比如创建资源、删除资源。
  • Node 节点主要负责运行任务,比如启动容器。

K8s 将集群中所有的任务抽象成资源,比如一个 Deployment 资源、一个 Pod 资源。用户面向的是一个一个资源,客户端只能通过操作这些资源来控制整个集群。这样的设计,有几个明显的好处:

  • 第一就是模型非常简单和一致,对于开发者来说,只需要理解了这种资源的模式,就很容易维护 K8s 里边的任何代码。
  • 第二就是通过资源这个抽象层,将模块与模块之间做了很好地隔离,从而很容易做到各模块之间的对接和独立升级维护。

集群内部涉及的组件有:

  • Pod:K8s 的基本运行单元;
  • ReplicaSet:Pod 的集合;
  • Deployment:提供更新支持;
  • StatefulSets:提供有状态支持;
  • Volume:数据卷;
  • Labels:标签,资源间的关联一般通过这个来实现。

1.1.1 Master 相关组件

Master 提供集群的管理控制中心,通常情况下,Master 会独立部署,不在上面跑用户容器,以保证整个集群的稳定性和安全。当然可以跑多个 Master 来达到高可用。

Master 主要组件包括:Kube-apiserver、Kube-controller-manager、Etcd。

  • Kube-apiserver:用于暴露 Kubernetes API。任何的资源请求/调用操作都是通过 Kube-apiserver 提供的接口进行。
  • Kube-controller-manager:运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。
  • Etcd:Etcd 是 Kubernetes 提供默认的存储系统,保存所有集群数据。所以一般推荐使用时要为 Etcd 数据提供备份计划。

1.1.2 Node 相关组件

Node 节点负责从 Master 处接收任务并执行,适当地时候调整自己的状态或删除过期的负载。

Node 主要组件包括:Kubelet、Kube-proxy、Docker/Rkt。

  • Kubelet: kubelet 是工作节点主要的程序,它会监视已分配给节点的 pod,具体功能包括:

    • 创建 Pod 所需的数据卷;
    • 创建 Pod 所需的网络;
    • 下载 Pod 的Secrets;
    • 启动 Pod 中运行的容器;
    • 定期执行容器健康检查;
    • 上报节点状态。
  • Kube-proxy: 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务抽象。
  • Docker/Rkt: 用于运行容器。

1.2 K8S的全生命周期管理

在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。

1.2.1 创建集群

在创建Deployment时,Kubernetes会创建了一个Pod来托管应用。Pod是Kubernetes中一个抽象化概念,由一个或多个容器组合在一起得共享资源。

1.2.2 部署应用

[/node/bin$]$ ./kubectl run nginx --image=nginx --replicas=2 --port=80 --expose=true
service "nginx" created
deployment "nginx" created
[/node/bin$]$ ./kubectl get pods
NAME                     READY     STATUS    RESTARTS   AGE
nginx-7587c6fdb6-9sd9d   0/1       Pending   0          5s
nginx-7587c6fdb6-kvfsq   0/1       Pending   0          5s
[/node/bin$]$ ./kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   51m
nginx        ClusterIP   10.0.0.40    <none>        80/TCP    11s

通过指定容器镜像、副本数量及端口,就可以启动一个应用。

1.2.3 发布应用

导出服务让外部可访问. 通过 kubectl run 创建的应用,默认情况下服务是一个虚拟IP,从集群外部访问是访问不到的,这时需要用到 NodePort 类型的服务,将节点端口映射到容器内部。

[/node/bin$]$ ./kubectl expose deployment nginx --type=NodePort --name=nginx-nodeport
service "nginx-nodeport" exposed
[/node/bin$]$ ./kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     2         2         2            0           5m
[/node/bin$]$ ./kubectl get pods
NAME                     READY     STATUS    RESTARTS   AGE
nginx-7587c6fdb6-9sd9d   0/1       Pending   0          5m
nginx-7587c6fdb6-kvfsq   0/1       Pending   0          5m
[/node/bin$]$ ./kubectl get svc
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.0.0.1     <none>        443/TCP        57m
nginx            ClusterIP   10.0.0.40    <none>        80/TCP         5m
nginx-nodeport   NodePort    10.0.0.67    <none>        80:30147/TCP   8s

通过 http://localhost:30147 访问应用.

二、K8S使用

2.1 常见kubectl命令

  • 查看主控状态:kubectl cluster-info
  • 启动Controller-manager:kube-controller-manager --master http://127.0.0.1:8080
  • 启动schedluer:kube-scheduler --master http://127.0.0.1:8080
  • 启动Apiserver: kube-apiserver --etcd-servers http://127.0.0.1:2379 --insecure-bind-address 192.168.139.190 --insecure-port 8080
  • 启动 Kubelet 服务: kubelet --fail-swap-on=false --kubeconfig ./kubeconfig --containerd
  • 启动 Kube-proxy 服务: kube-proxy --master http://127.0.0.1:8080
  • 查看节点状态: kubectl get nodes

Kubeconfig 文件示例如下:

[/node/bin$]$ cat kubeconfig 
current-context: test-context
apiVersion: v1
clusters:
- cluster:
    api-version: v1
    server: http://127.0.0.1:8080
  name: test-cluster
contexts:
- context:
    cluster: test-cluster
    namespace: default
  name: test-context
kind: Config
preferences:
    colors: true

REF

http://docs.kubernetes.org.cn https://gitbook.cn/books/5aadcf4f984e353193a90ddb/index.html?utm_source=dl18041002