开发同学如何学习Kubernetes?

学习前首先需要有一个自己的环境

自己搭整个集群进行学习确实会经常遇到资源不足的情况,我几年前最开始学的时候也是被搭环境的第一步。不过后来出了minikube ,我自己的机器是 16g的2016版本的mbp,虽然可以跑起来,但是相当的费劲,后来在公司白嫖了测试机器,如果你是在职开发的话可以看看有没有可以白嫖的物理机,狠狠的当一把工贼。

我不太建议直接买云产商的k8s,这样就少了自己搭建 k8s集群的过程,如果已经搭建了我也觉得可以在自己搭建最的k8s去玩,这样能接触到更多原生的概念,而云厂商会对一些概念进行封装,这样其实不太利于你的学习。

学习相关的资料和实操,下面是我总结出来的一些经验:

想清楚为什么要学

首先kubernetes技术解决什么问题?为什么别的同类技术做不到?为什么是这样解决的? 有没有更好的方式?可以通过 了解k8s 是什么:kubernetes.io/zh-cn/docs/...

技术付费点基本体现在两个地方,一个是,能帮别人"挣钱"的地方;另一个是,能帮别人"省钱"的地方。

在学k8s之前我们最主要的肯定是要了解他为我们解决了什么问题,这是在开始前必须要阅读的。

最主要的解决了服务自动部署回滚、自我修复、水平扩展、服务发现和负载均衡的问题,这里也是挑出来了我们平时研发过程中最频繁使用的几个功能。

原先如果没有 k8s 帮我们解决服务部署的话,那我们需要通过脚本去重启服务并且kill掉原有的服务,并且在流量转发上也需要我们自己通过Nginx或者其他网关来实现,如果要进行水平扩展的话也需要脚本来实现,在线上操作这些内容对于运维人员和开发人员的要求来说都是非常高的,而且相应的我们也需要补充开发许多脚本来实现我们部署回滚、自我修复、水平扩展等功能。

所以 k8s 在很大程度是上为我们去省钱,省下了开发和运维人员的时间,让我们有更多精力去建设业务系统的功能和可用性;并且由于资源的虚拟化,我们可以在相同的物理机上部署更多的服务,从而节省了很大一笔购买服务器的资金。

至于k8s 是否能帮我们挣钱,我觉得也是可以的,由于我们引入了k8s 的自动部署回滚,增加了系统稳定性和可用性,因为有80%的问题是由于变更出现的,所以当出现发布时出问题的时候,流量不会被转发到不健康的服务,并且我们可以通过k8s实现了快速回滚,也让用户更加愿意使用我们的系统,从而提升了业务系统的收入,也是间接帮助我们赚了钱。

同类技术能否做的到的问题,答案同类替代品目前没有k8s完善,而且需要组合其他多种工具才能实现相同的功能,自己也需要编写较多的脚本来辅助实现,所以并没有k8s解决的更直接。

用好官方文档

通过官方中英文档学习是学习新技术难以绕开的一环,中文搜索和gpt 都有比较多的纰漏,所以建议以官方文档的内容为准去进行学习和实践,这里因为官方文档内容较多,我挑出来我学习过程中看的关键的几个文档,然后再遇到费解的地方之后,通过搜索引擎和GPT 辅助去理解。这样也能在自己有一定识别能力的时候去借助三方工具理解,避免了被误导的情况。

k8s的官方文档有多种语言的翻译,如果觉得中文文档理解起来比较费劲,可以切换到英文的文档,这样专业名词看起来也会衔接的更加好

初识 K8s

理解k8s能帮我们创建什么对象来进行部署:kubernetes.io/zh-cn/docs/...

这里只需要对yaml有个大概的认知,明白我们的对象都是通过yaml来描述,然后k8s根据我们的yaml文件进行资源创建,并且创建出来的资源有相应的状态。

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

这里不需要过度深入每一个字段的内容和含义,先建立起一个大概的认知,后续在实际操作中创建具体的资源时,我们再通过参考手册去查询。

这个yaml描述了我们需要创建一个 Deployment 来维护副本为2的 Nginx状态,并且容器暴露的端口为80。

开始动手搭建k8s的环境,这样方便我们展开实操:kubernetes.io/zh-cn/docs/...

搭建好k8s环境后 ,参考这个文档 github.com/bmuschko/ck...

这里面的练习会首先提出问题,然后让我们一步一步操作,并且给出对应的答案,从而帮助我们快速的学会如何操作 kubernetes 集群和如何排查问题等,里面需要创建的内容也会给出相应的 yaml,当我们对字段不清楚是什么意思的时候,可以去官方文档中查询,避免上来就对着一大堆字段和概念懵逼。

通过第一个实操训练,能对核心的资源进行操作,然后部署起来一个nginx 服务,暴露出端口进行使用,也对k8s的操作有了初步的认识。

由于实际生产情况中我们是直接写了yaml文件进行资源描述,所以这里我提供了一个yaml和部署过程。

通过下面的yaml我们描述了一个Nginx资源并且暴露出 Service可以让我们进行访问

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - name: http
      port: 8080
			nodePort: 48080 # 对外暴露的pod
      targetPort: 80

然后通过以下的命令来一步一步创建我们的资源

shell 复制代码
$ kubectl create namespace ckad-prep # 创建namespace

$ kubectl apply -f nginx-test.yaml -n ckad-prep # 创建资源
...
deployment.apps/nginx-deployment created
service/nginx created

$ curl localhost:48080
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="<http://nginx.org/>">nginx.org</a>.<br/>
Commercial support is available at
<a href="<http://nginx.com/>">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

完成实验后清理资源

shell 复制代码
$ kubectl delete -f nginx-test.yaml -n ckad-prep
deployment.apps "nginx-deployment" deleted
service "nginx" deleted

$ kubectl delete namespace ckad-prep
namespace "ckad-prep" deleted

通过上面的操作我们已经对 k8s 有了初步的认识和了解,也能对 k8s 进行使用,接下来就要开始攻克各种资源的知识,让我们能更加理解 k8s 。

更深入的学习各个组件

我们最开始接触到的容器是Docker run 运行一个镜像后,就会产生一个容器,并且通过 docker swarm 也可以单容器有调度、负载均衡等能力,但是存在一个致命的问题是单容器的这种模式难以描述真实世界中复杂的应用架构。

比如一个后端应用需要对日志进行收集,把日志转存到elasticSearch 上,如果是用Docker 进行实现的话,我们需要通过Docker-Compose 启动三个容器,分别是后端服务、日志转发收集服务和日志存储服务(elasticSearch) ,这种实现方式会存在一个问题,后端服务和日志转发服务有可能会被调度到不同的集群上,这个时候就需要通过网络来收集日志文件,我们更加直观的理解是虽然将这两个服务打包成一个容器,这个时候就是kubernetes 中抽象出来的Pod。

通过yaml我们描述如下:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3  # 可以根据需要进行调整
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: backend
        image: your-backend-image
        # 其他后端应用配置...
      - name: log-collection
        image: log-collection-image
        # 其他 配置...

这里就将后端服务和日志收集打包在了一个Pod中,通过 Deployment 来管理我们的Pod,然后处理完后存储下来,这个模式就是容器设计模式里面最常用的Sidecar。

这里我们接触了最核心的Pod的概念

有了Pod后,Pod的生命周期管理及调度的问题,需要有另外的抽象来负责,这个抽象就是Deployment ,它用来管理Pod的对象,比如扩缩容,维持pod数量等。

如果节点不正常 Deployment可以快速将Pod调度到其他的节点上,并且可以通过Deployment快速的扩展Pod的数量来提升系统的响应能力。

在上面Yaml文件中我们创建出来的为Deployment而不是直接创建Pod,也是这个原因。

学习完上面的内容后作为研发经常碰到的内容已经解决了很大一部分,剩下的内容其实就根据自己感兴趣的和工作实际用到的去探索。

我自己的话因为对网络感兴趣,所以会深入的去学习 Service 相关的内容,比如它是如何维护变更的,如何通过 Iptables和 Ipvs去完成负载均衡,在通过源码看kubeproxy如何实现负载均衡的规则维护、长连接在k8s中是怎么样的形态出现。

通过一个感兴趣的点去带出面,不要盲目的东看一块西看一块。

我通过网络也从k8s的应用层学习到了传输层和网络层的协议以及操作系统的功能是如何被k8s使用,这样当K8s底层要更换底层实现的时候,其实我们只要去学习相应的内核功能就可以,这样也不仅仅局限在k8s的学习,更能串联计算机的所有相关知识。

计算机是人造科学,在学的时候一定有遵循一定人的逻辑,而且大神们的逻辑思路也相对清晰,思考大神们是如何思考的也能得到很多启发。

相关推荐
工业甲酰苯胺18 分钟前
k8s 中的 Ingress 简介
云原生·容器·kubernetes
周湘zx1 小时前
k8s中的存储
linux·运维·云原生·容器·kubernetes
Xinan_____4 小时前
Linux——k8s认识
linux·运维·kubernetes
nvd114 小时前
K8S - Access Control 机制介绍
kubernetes
蜗牛^^O^14 小时前
Docker和K8S
java·docker·kubernetes
骅青18 小时前
kubernetes调度2
容器·kubernetes
Alone804619 小时前
K8s中HPA自动扩缩容及hml
云原生·容器·kubernetes
HoweWWW21 小时前
k8s-API 访问控制
云原生·容器·kubernetes
Alluxio官方1 天前
Alluxio Enterprise AI on K8s 部署教程
人工智能·机器学习·kubernetes
小的~~1 天前
k8s使用本地docker私服启动自制的flink集群
docker·flink·kubernetes