本来想在我的 linux 主机上创建 3 个虚拟机,然后手工搭建一个拥有 3 个节点的 k8s 集群。
但是翻了翻网上的各种教程,发现每个教程都是巨复杂,给我一种 “即使我跟着教程千辛万苦敲完所有命令,也不一定能运行” 的感觉。最后,我发现了 minikube 这个东西,可以方便的搭建一个单机版 k8s。
麻雀虽小五脏俱全,即便是这样一个简单的 k8s,目前也足够我学习一些基本知识了。
本文记录一下安装 minikube 的具体步骤,并在 k8s 中部署一个简单的服务。
安装 minikube
开局一张图,先展示一下 minikube 的整个架构。
首先是准备工作,更新系统,安装必要组件。
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 来部署。