Kubernetes 初学者超级简单入门帖

查看原文

Kubernetes 是 helmsman / pilot 的希腊语,用来做自动部署和容器程序的扩展和管理。它的前身是 Google 内部的类似系统 Borg。将程序放在容器里面简化了运维操作,但是部署还有一箩筐的事情要处理,这就是 Kubernetes 存在的意义。这篇文章介绍了什么是 Kubernetes,什么是 Clusters,如何创建本地 cluster,如何创建生产环境的 cluster,如何部署到 Kubernetes 中,以及一个例子。

  • 你不用操心应用实例是不是在运行,如果挂了,Kubernetes 会自动新建实例。
  • 掌握一些 Kubernetes 的核心概念:
    • Cluster: 一个容器网络,它们之间可以互相通信。
    • Nodes: Cluster 里面跑的的节点。
    • Master:可以控制其他节点,所有操作命令跑在 master 上,Master 决定 Cluster 里面的哪个节点跑应用。
    • Network: Kubernetes 假设你搞好了网络可以让节点互相通信。有很多开源方案可以选择。
    • Kubernetes API: Master 开放出来的接口
    • Kubelet: 每个 Node 上跑着 Kubelet,负责管理当前 Node,以及和 Master 通信。通信使用 Kubernetes API。
    • kubectl: 一个命令行工具,调用 Kubernetes API 和 Master 通信用来管理。
    • kubeadm: 一个用来初始化 cluster 的程序,能给 Cluster 配置好所需要的 add-ons。
    • etcd: 一个分布式 key-value 数据仓库。存储了所有 Cluster Nodes 的信息。
    • Kubernetes objects: 是 cluster 中操作的基本对象,也是会在 Kubernetes 中存储的数据。这些数据用来描述 Cluster 应该处于的状态。包括 deployments, replica sets, services, pods, etc.
    • Pod: 一组容器(比如 docker containers)以及它们之间的关系;它们之间有共享的网络和存储。在网络上,这组容器可以通过一个独立 IP 地址访问。
    • Service: 定义了 Pods 的逻辑分组 以及如何访问它们。因为 Pod 很容易被创建和销毁,Kubernetes 引入了 Service,只要给 Pods 给一个标签,所以流量都会由标签指定的 Service 处理。
    • Deployment: 设定预期状态,如果不符合,Kubernetes 会保证 Cluster 达到这个状态。Deployment 告诉了 Kubernetes 如何创建和更新应用的实例。
  • 好处:支持 rolling updates / zero downtime,节点同一时刻总是有多个实例运行。
  • 还有啥要考虑:数据存储。因为 Docker 是 stateless 的,所以要想好数据存到哪里。
  • 如何搭建本地环境:安装 virtualbox, kubectl, docker, minikube。然后使用 minikube start / minikube stop 就能玩了。
  • 如何搭建生产环境(大约5分钟)
    • 前提是所有机器已经配置好了 VPN
    • 安装 docker, kubelet, kubeadm, kubectl
    • export MASTER_IP=<master_ip>
    • kubeadm init --apiserver-advertise-address $MASTER_IP: 初始化 Cluster,生成一堆配置文件等等。
    • 复制 /etc/kubernetes/admin.conf 到某个地方,设置 export KUBECONFIG= 这个文件。
    • 安装 pod network: sysctl net.bridge.bridge-nf-call-iptables=1; kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    • 可以自由地用 kubectl 玩耍了。
    • 在 Node 节点上跑一下 kubeadm join 命令(可以在 kubeadm init 的输出里找到) 就能加入 Cluster 了。
  • 如何部署应用
    • kubectl run nginx --image=nginx
    • kubectl get deployment nginx
    • kubectl expose deployment nginx --external-ip=$MASTER_IP --port=80 --target-port=80
    • kubectl get service
    • kubectl scale deployment nginx --replicas=6
    • kubectl get pods
    • 可以写一堆 yml 文件,然后用 kubectl create -f xxx.yml 去应用它。