前言

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

运行后就会帮你在默认浏览器打开一个页面,大概长这个样子, 暂时不做研究,可以随便点一点看一看

image.png

学习任务东西都免不了要来个 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 和其他信息

image.png

体验伸缩服务

现在多次访问 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 删除


junbaor
847 声望36 粉丝

广泛涉略,快速学习