初试k8s自顶向下的学习kubernetes

38次阅读

共计 3635 个字符,预计需要花费 10 分钟才能阅读完成。

之前就玩过 docker,但是一直不知道怎么把容器运用到生产上。构建一个 docker 镜像,把他 run 起来很简单;难的是容器的部署(CICD),容器的网络,数据持久化等。如果我们像之前一样,打包好镜像,通过 ssh 连接到目标服务器 run 起来,这和打包成二进制传上去似乎也没多大进步。

k8s 就是帮我们解决这些难点的工具。k8s 是 master-node 架构,通过 master 管理 node。首先需要将你的机器组成 k8s 集群,集群机器的内网应该是连通的,这样你的集群就捆绑成了一个整体由 k8s 接管了。你只需要准备好配置文件,用 k8s 的 api 或 cli(命令行)发布镜像即可,k8s 会根据你配置的规则来管理容器,应用场景有:一份镜像需要部署多少个容器(replicaSets),服务的升级策略(滚动更新),服务的容灾策略(某个 node 挂了可以在其他 node 补上缺失的容器),弹性伸缩(监控 CPU 等指标达到临界值后自动增加容器)等。

怎么样?是不是觉得很 cool,你可能迫不及待的想去把 k8s 用起来了,可是你打开 k8s 官方文档大段大段的英文和各种生疏的概念就把你整懵了。你跟着教程敲了一遍,一大堆 yaml 配置,全是命令行操作,可能你已经被墙给干倒了(天朝 ha);还有一堆概念,什么 Pod, Deployment, ReplicaSet, Service 都是些啥玩意。可能你花了大半天耐心的把文档过了一遍,觉得这个东西根本落不了地啊,这一大堆配置和命令行,这谁顶得住,k8s 这么先进不应该是可视化的点点就完事了吗?我一开始天真的以为 k8s dashboard 能帮帮我,费了点力气把它装好后,发现只有一些监控数据。

下面我想介绍另一种学习思路,自顶向下的学习。其实你一开始不用了解 k8s 的各种概念,只需要看看别人是怎么用 k8s 的就行了(都 9102 年了,那些很潮的公司都已经玩了很久了)。不是说学东西必须得打好基础吗?自顶向下是个什么鬼?拿学开车举例,你开始只是在路上看到别人开车,很拉风可撩妹,比两轮的安全,不怕风吹雨打的,教练我也要开车;你去报了驾校(看到这里你肯觉得我要忽悠你报培训班),你摸到了车看到别人是咋开的,了解了基本知识你就可以在训练场地慢慢蠕动了(测试环境),你甚至不用了解交规,更不用了解汽车的原理,这些后面可以慢慢补。补好基础了你就可以上路,然后你可能需要了解汽车原理,改装它优化它,再练一练排水渠过弯的技巧,成为一代老司机。

回到正题,我们学 k8s 同样可以先看看别人是咋用的,再去了解其中细节,掌握它。咋看呢?一大部分公司还没跟上潮流,这时我们可以借助开源和云服务。
首先我们的思路没有问题,要便捷的使用 k8s 我们需要一个可视化管理平台。
开源的有 rancher、Qihoo360/wayne 等,云服务阿里云、腾讯云、AWS 都提供容器服务管理后台。

这里就拿 rancher 开始吧,毕竟开源免费。值得一提的是,阿里云等的容器服务按量积分,master 可托管,弄一两天低配 node,一天也就几块。

在本地启动 rancher 容器:

sudo docker run -d --restart=unless-stopped -p 8080:80 -p 8443:443 rancher/rancher

打开 https://127.0.0.1:8443 平台,可以看到 cluster, node, namespace, member 等功能。

下面我们需要准备一个 k8s cluster(集群),用 minikube 可以方便的部署一个本地集群。minikube 是通过虚拟机创建集群,支持多种虚拟机,我这里用的 virtualBox。启动很简单,一个命令minikube start,困难的是墙,下面贴一下配置代理的脚本:

function ministart() {
    export HTTP_PROXY=http://192.168.99.1:1089
    export HTTPS_PROXY=http://192.168.99.1:1089
    export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24

    minikube start \
    --docker-env=HTTP_PROXY=$HTTP_PROXY \
    --docker-env=HTTPS_PROXY=$HTTPS_PROXY \
    --docker-env=NO_PROXY=$NO_PROXY \
    --registry-mirror=https://registry.docker-cn.com
}

注意一下这个 ip,不能使用 127.0.0.1,因为虚拟机需要使用宿主的代理,虚拟机跟宿主机通讯是使用虚拟网卡创建的网段,默认宿主的 ip 为 192.168.99.1,虚拟机是 192.168.99.100。你还得把你的梯子监听的地址改改,127.0.0.1->0.0.0.0,监听所有网卡。同样 rancher 里的 ip 也应使用 192.168.99.1,这个 ip 必需是所有集群都能访问到的,如果你是用 docker 自带的 k8s 集群,你可以用 ifconfig 找一个无线网或有线网的 ip,反正不能使用 127.0.0.1。

minikube 下载一些必需镜像后,k8s 集群就在虚拟机里启动了,可以使用 minikube ssh 登录到虚拟机里探查一番。下面我们在 rancher 里引入集群:

集群引入了之后我们来部署我们第一个 app,一个 echo-server:

等了一会儿 k8s 把容器部署好了,上面配置了暴露随机端口值是 32192,我们访问 192.168.99.100:32192 就能看的 echo-sever 返回的信息了。我们觉得一个 pod 不够,点击 + 号,k8s 会帮我们做水平扩容启动第二个 pod,虽然 minikube 是但节点的,但是依靠容器的隔离特性,单节点照样能部署多个相同应用。

体验一下 rancher 的 pipline 功能,集成了 CICD 功能,配置好代码仓库后 run 起来,会启动一个 jenkins pod 来处理构建,还会建一个内置的镜像仓库,还有个 minio 存储 pod,大概是用来存镜像的。等了好一会儿后,可以看到 workloads 里 example-server 部署好了。jenkins 和 registry 都集成了好像挺方便,不过这个镜像如何持久化呢?

ok,下面自行探索一下 rancher 平台提供的一些页面,有 workloads,load blance,service discory,pipline 这些部署常用的,还提供报警、日志、监控、用户权限等功能,这就是一个完善的 k8s 管理平台了,到此你应该了解 k8s 大概有哪些用处了。

下面你需要再把 k8s 官方文档捡起来看一看,或者是一本系统介绍 k8s 的书籍,把你在 rancher 上用到的功能和 k8s 的概念对应起来,现在你才能抓住哪些是重点。

一些概念:
pod:k8s 最小调度单位,可以是一个或多个容器。

service:对内或对外暴露 k8s 服务。

deployment:pods 和 replicaSets 的控制器,通过 deployment 配置的规则来管理 pods。

三个主要的命令行程序:
kubeadm:用了启动 k8s 集群。

kubelet:需要在所以节点上运行,处理集群内部通讯,类似 agent。

kubectl:客户端工具,用户用它来给 k8s 集群发指令,类似 ssh,可配置好秘钥远程访问,默认配置是 ~/.kube/config。

一些常用的命令:

kubectl get all -A
kubectl get namespaces
kubectl get svc
kubectl get pods
kubectl get deployments hello-world

# 暴露服务
kubectl expose deployment hello-world --type=NodePort --name=example-service


# logs
kubectl -n cattle-system logs -l app=cattle-cluster-agent

# exec
# -c --container
kubectl exec -it pod-name -c container-name -- /bin/bash

更多细节日后再慢慢探索,下面总结一下:

k8s 专注于容器部署这一块,它不提供镜像打包(CICD),镜像储存(registry),也没有管理平台,更没有 service mesh(服务通讯管控)。如果你要落地和完善,还有很多东西需要你去搞。那个 rancher 平台看起来很美好,但是实际用起来问题挺多,更适合在其上二次开发,你们团队是否具备这个实力?其实最靠谱的落地方案还是使用云服务,用钱来解决问题,先小规模用起来,摸熟了再研究其他姿势。

本文想表达的一个思想是:学习一个东西,你应该先搞清楚 why(为什么用?有哪些应用场景?别人咋用的?),然后再研究 how(怎么用),这样才能抓住重点,学起来事半功倍。

正文完
 0