Kubernetes - 自动化的容器部署、扩展和管理

Kubernetes 是一个生产级别的容器编排系统,用于自动部署,扩展和管理容器化应用程序。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。

对象

  • Pod : Kubernetes的基本构建块,是创建或部署的对象模型中最小和最简单的单元。一个Pod封装了应用程序容器,存储资源和唯一的网络IP。
  • Service : 定义了Pod的逻辑集合以及访问它们的策略
  • Volume : 一个卷就是一个目录,包含一些数据,可以通过一个容器中的容器访问。
  • Namespace : 由同一物理集群支持的多个虚拟集群。 这些虚拟集群被称为命名空间。

组件

Master Node

Master 提供集群控制,作出集群的全局决策,检测并响应群集事件。

Master 组件可以运行在集群的任意一台机器上。但一般来说,运行 Master 组件的机器不会运行用户级容器。

  • kube-apiserver : kube-apiserver 用于暴露 Kubernetes API。
  • etcd : etcd 用作群集数据的一致性且高可用的键值存储。
  • kube-scheduler : 监控新创建但没有被分配至 node 的 Pod
  • kube-controller-manager : 一个循环控制器,通过 apiserver 监视集群的共享状态,并进行更改,试图将当前状态移动到所需的状态。

Worker Node

Worker Node 组件运行在每一个 Worker node 上,维持 pods 的运行。 Master node 控制每一个 Worker node 。

  • kubelet : 保证容器运行在 pod 上。
  • kube-proxy : 维持主机上的网络规则并执行连接转发
  • Container Runtime : Kubernetes 支持的运行时: Docker, rkt, runc

安装

系统需求:

  • Debian 9
  • RAM - minimum 2GB, Swap disabled
  • CPU - minimum 2 cores
  • docker - 17.03+

安装 kubeadm, kubelet 和 kubectl

  • kubeadm : 初始化集群的命令
  • kubelet : 在集群中所有主机上运行,用于启动 pods
  • kubectl : 用于管理集群的命令行工具

确保 kubeadm, kubelet 和 kubectl 的版本匹配

apt update && apt install -y apt-transport-https

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

apt update

apt install -y kubelet kubeadm kubectl

kubelet 使用的 Cgroup Driver 需要和 Docker 的 Cgroup Driver 默认值 cgroupfs 一致 [1]

master node 初始化

kubeadm init --pod-network-cidr=10.244.0.0/16

输出:

You can now join any number of machines by running the following on each node
as root:

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

为了使用 kubectl 命令行工具,需要运行以下命令:

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

安装 pod 网络

为了 pod 之间可以通讯,必须安装 pod 网络。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

运行 kubectl get pods -n kube-system ,查看 kube-dns 和 kube-flannel 是否处于运行状态:

NAMESPACE     NAME                       READY     STATUS    RESTARTS   AGE
kube-system   etcd-                      1/1       Running   0          6m
kube-system   kube-apiserver-            1/1       Running   0          6m
kube-system   kube-controller-manager-   1/1       Running   0          6m
kube-system   kube-dns-                  3/3       Running   0          7m
kube-system   kube-flannel-              1/1       Running   0          4m
kube-system   kube-proxy-                1/1       Running   0          7m
kube-system   kube-scheduler-            1/1       Running   0          6m

使 master node 参与调度

默认情况下, master node 不参与 pod 调度。如果希望 master node 参与调度,需要运行以下命令:

kubectl taint nodes --all node-role.kubernetes.io/master-

加入其他 nodes

在其他 nodes 上运行 kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

输出:

Node join complete:
* Certificate signing request sent to master and response
  received.
* Kubelet informed of new secure connection details.

参考文献

[1]Configure cgroup driver used by kubelet on Master Node