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
去应用它。