本来想在我的 linux 主机上创建 3 个虚拟机,然后手工搭建一个拥有 3 个节点的 k8s 集群。

但是翻了翻网上的各种教程,发现每个教程都是巨复杂,给我一种 “即使我跟着教程千辛万苦敲完所有命令,也不一定能运行” 的感觉。最后,我发现了 minikube 这个东西,可以方便的搭建一个单机版 k8s。

麻雀虽小五脏俱全,即便是这样一个简单的 k8s,目前也足够我学习一些基本知识了。

本文记录一下安装 minikube 的具体步骤,并在 k8s 中部署一个简单的服务。

安装 minikube

开局一张图,先展示一下 minikube 的整个架构。

zone1

首先是准备工作,更新系统,安装必要组件。

sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get upgrade

然后安装 virtualbox,

sudo apt install virtualbox virtualbox-ext-pack

安装 minikube

wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube-linux-amd64
sudo mv minikube-linux-amd64 /usr/local/bin/minikube

添加 kubectl 源

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

值得注意的是,我的主机是 ubuntu 18.04,代号 bionic,而安装的源却是 xenial,对应 ubuntu 16.04。 这是因为 kubernetes 源还没有为 18.04 更新,不过旧的源仍然可以用,亲测有效。

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

最后安装 kubectl

sudo apt update
sudo apt -y install kubectl

到这里所有安装都结束,现在用 minikube 命令启动一个单机版的 k8s

$ minikube start
😄  minikube v1.3.0 on Ubuntu 18.04
🔥  Creating virtualbox VM (CPUs=2, Memory=2000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.15.2 on Docker 18.09.8 ...
🚜  Pulling images ...
🚀  Launching Kubernetes ...
⌛  Waiting for: apiserver proxy etcd scheduler controller dns
🏄  Done! kubectl is now configured to use "minikube"

kubectl 是一个控制 k8s 集群的命令行工具,通过它我们可以了解 k8s 集群内部的各种状态。

kubectl cluster-info
kubectl config view
kubectl get nodes
kubectl get svc

而 minikube 的命令主要是控制这个单机虚拟环境,其中 ssh 可以进入到 virtualbox 创建的虚拟机中。

minikube ssh
minikube stop
minikube delete

另外,minikube 还提供了一个网页版的图形界面,

$ minikube addons list
$ minikube dashboard

$minikube dashboard --url
http://192.168.39.117:30000

可以通过上面的 url 访问一个类似 google cloud 界面的控制面板。

部署一个服务

有了 kubernetes 之后,我们再来尝试部署一个服务。所有运行在 k8s 中的程序都必须是容器化的,这里我们直接用 gcr 上的 echoserver 。

1)首先创建一个 Pod,Pod 中运行的镜像是 k8s.gcr.io/echoserver:1.4

kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080

用 kubectl get pod 命令可以查看 k8s 集群中运行着哪些 Pod

$ kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
hello-minikube-64c7df9db-zg9m9   1/1     Running   2          24h

现在, echoserver 程序在我们的 k8s 中运行着,但是在我的 host 主机上却无法访问,因为还需要 k8s 把这个 Pod 的 service 暴露给外部。

2)expose 给外部

kubectl expose deployment hello-minikube --type=NodePort

其中除了 NodePort 方式外还有 LoadBalancer等方式,将在其他文章介绍

$ kubectl get svc
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.97.187.70   <none>        8080:31089/TCP   24h
kubernetes       ClusterIP   10.96.0.1      <none>        443/TCP          24h

当 k8s 把 service 暴露给外部后,我们用 minikube 的命令来查看 url


$ minikube service hello-minikube --url
http://192.168.99.100:31089

然后就可以用 curl 命令访问这个地址,看它会返回什么了。

接下来的几篇文章中,将尝试在 k8s 中部署一个自己的程序,以及通过 Deployment.yaml 和 Service.yaml 来部署。

参考资料