前言
k8s 这坑迟早是要入的, 还是早点研究明白比较好。生产中一般都会使用云平台的容器服务,所以暂时不关注二进制的安装, 先在本地搭一个开发环境,便于熟悉各个组件。
本地体验 kubernetes 一般会用 minikube 和 kind
https://github.com/kubernetes/minikube
https://github.com/kubernetes-sigs/kind
比较一下很容易做出选择, 毕竟 minikube 代码是放在 kubernetes 组织下, 并且 start 数明显高出一大截。
前提条件
- MacBook Pro
- 良好的网络条件(你懂的)
- 对 k8s 体系的概念有所了解, 不了解的话先跑起来慢慢补课也行
安装 minikube
官方安装教程: https://kubernetes.io/docs/tasks/tools/install-minikube/
mac 安装 minikube 很简单, 有 brew 包管理工具的话一行命令就搞定
brew install minikube
可能有同学会说,
我的 brew 怎么这么慢呀?
换国内镜像源呀!
换了镜像源怎么还是慢呀?
...
其实笔者并不推荐切换到国内镜像源, 老老实实给终端设置代理比较好,为啥呢?因为切换软件源只能提升软件源列表更新的速度,而大部分软件的真实安装包文件还是从国外下载的, 相当一部分软件的安装包都在 github, github 的 release 文件都放在 aws s3 上, s3 又被墙了,所以... 有一个稳定的代理是相当重要滴,只需要给终端添加一下环境变量就 ok 啦
export HTTP_PROXY=http://192.160.20.147:1087
export HTTPS_PROXY=http://192.160.20.147:1087
export ALL_PROXY=socks5://192.160.20.147:1086
emmm 跑题了
安装后可以检查一下版本
➜ ~ minikube version
minikube version: v1.12.3
commit: 2243b4b97c131e3244c5f014faedca0d846599f5
安装 VirtualBox
咦~ 为啥还要安装 VirtualBox? 因为 minikube 原理就是帮你维护一个虚拟机, 在虚拟机里再帮你搭建 k8s 环境
不用虚拟机也可以,minikube 也支持在 docker 容器里帮你搞一套环境,不过鉴于 mac 版 docker 的辣鸡性能还是选 VirtualBox 吧...
支持的列表有这么多, 不喜欢 VirtualBox 的话自己挑一个
* docker ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/docker/))
* virtualbox ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/virtualbox/))
* podman ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/podman/)) (EXPERIMENTAL)
* vmwarefusion
* kvm2 ([driver installation](https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/))
* hyperkit ([driver installation](https://minikube.sigs.k8s.io/docs/reference/drivers/hyperkit/))
* hyperv ([driver installation](https://minikube.sigs.k8s.io/docs/reference/drivers/hyperv/)) Note that the IP below is dynamic and can change. It can be retrieved with `minikube ip`.
* vmware ([driver installation](https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/)) (VMware unified driver)
* parallels ([driver installation](https://minikube.sigs.k8s.io/docs/reference/drivers/parallels/))
* none (Runs the Kubernetes components on the host and not in a virtual machine. You need to be running Linux and to have [Docker](https://docs.docker.com/engine/) installed.)
开动 minikube
开动 minikube 之前别忘了设置代理,可以省很多麻烦, 不然下载时卡着不动很烦的
export HTTP_PROXY=http://192.160.20.147:1087
export HTTPS_PROXY=http://192.160.20.147:1087
export ALL_PROXY=socks5://192.160.20.147:1087
export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24
NO_PROXY 也很重要, 不然内部访问内部服务还要走代理的话会不通
接下来就可以开动了, 由于第一次运行下载的东西比较多, 即使上代理也会慢,要耐心等待
➜ ~ minikube start --vm-driver=virtualbox
? Darwin 10.15.6 上的 minikube v1.12.3
✨ 根据用户配置使用 virtualbox 驱动程序
? 正在下载 VM boot image...
> minikube-v1.12.2.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
> minikube-v1.12.2.iso: 173.73 MiB / 173.73 MiB [ 100.00% 2.77 MiB p/s 1m3s
? Starting control plane node minikube in cluster minikube
? Downloading Kubernetes v1.18.3 preload ...
> preloaded-images-k8s-v5-v1.18.3-docker-overlay2-amd64.tar.lz4: 104.78 MiB
? Creating virtualbox VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...
? 找到的网络选项:
▪ HTTP_PROXY=http://192.160.20.147:1087
▪ HTTPS_PROXY=http://192.160.20.147:1087
▪ NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24
? 正在 Docker 19.03.12 中准备 Kubernetes v1.18.3…
▪ env HTTP_PROXY=http://192.160.20.147:1087
▪ env HTTPS_PROXY=http://192.160.20.147:1087
▪ env NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24
> kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm: 37.97 MiB / 37.97 MiB [------------] 100.00% 1020.00 KiB p/s 38s
> kubectl: 41.99 MiB / 41.99 MiB [------------] 100.00% 704.44 KiB p/s 1m1s
> kubelet: 108.04 MiB / 108.04 MiB [-----------] 100.00% 1.48 MiB p/s 1m14s
? Verifying Kubernetes components...
? Enabled addons: default-storageclass, storage-provisioner
? 完成!kubectl 已经配置至 "minikube"
下面这个启动命令是从网上找的,会用 docker 来当驱动, 不科学上网也可以很快启动, 不想折腾的可以用这个, 不过要是想在里面再安装 istio 可能会费点劲,贴出来仅供参考。
minikube start --registry-mirror=https://registry.docker-cn.com --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --vm-driver=docker --base-image registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.10
安装后可以运行下面的命令检查一下状态
➜ ~ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 108s v1.18.3
kubernetes dashboard
既然已经跑起来,就像看点画面, k8s 提供了一个中控台, minikube 可以很方便的打开这个页面
➜ ~ minikube dashboard
? 正在开启 dashboard ...
? 正在验证 dashboard 运行情况 ...
? Launching proxy ...
? 正在验证 proxy 运行状况 ...
? Opening http://127.0.0.1:53569/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
终端不要关闭,想要继续学习新开个终端 tab
运行后就会帮你在默认浏览器打开一个页面,大概长这个样子, 暂时不做研究,可以随便点一点看一看
学习任务东西都免不了要来个 hello word, 下面我们在 k8s 里面启动一个 web 服务, 请求的话会回显我们的 http 请求头信息
启动命令
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
检查命令
kubectl get pods
如果结果像我这样就代表成功了
➜ ~ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
deployment.apps/hello-minikube created
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-64b64df8c9-d5lp5 1/1 Running 0 67s
如果 pods 的状态是 ContainerCreating
, 可以稍等一下再运行一次命令, Running
才算成功, 还不行的话,可以用 kubectl logs hello-minikube-64b64df8c9-d5lp5
查看日志。注意你的 name 跟我的可能不一样。
到这里,我们已经启动了一个 web 应用, 但是在外部还不能访问, 需要把它当做服务去公开
kubectl expose deployment hello-minikube --type=NodePort --port=8080
minikube service hello-minikube --url
现在控制台就会打印出一个可以访问的 URl, 例如我的是:http://192.168.99.105:30120
里面会显出出浏览器的 user-agent 和其他信息
体验伸缩服务
现在多次访问 web 服务, 响应中的 Hostname 都不会变, 因为只运行了一个 web 服务, pod 数量是1.
工作中为了高可用一份服务都会部署多套, k8s 尤其擅长这种事,我们可以一键扩缩容。
kubectl scale deployment hello-minikube --replicas=3
执行后 k8s 就会开始进行调度,保证服务有3个实例,多退少补
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-m inikube-64b64df8c9-6tqjv 1/1 Running 0 3m11s
hello-minikube-64b64df8c9-d5lp5 1/1 Running 0 36m
hello-minikube-64b64df8c9-j77fq 1/1 Running 0 3m11s
再次访问http://192.168.99.105:30120 频繁刷新下, 就会发现 Hostname 有所改变,说明我们的请求被随机分配到了 3 个 pod 中, 由多个实例来进行处理。
关闭 minikube
实验完毕可以用 minikube stop
关闭 minikube 下次可以直接用 minikube start
启动, 不想要的话还可以 minikube delete
删除
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。