• k8s 入门到实战--部署应用到 k8s


    5553e1d058aa03fc2c6f08ec988d61de.png

    k8s 入门到实战 01.png


    本文提供视频版:

    背景

    最近这这段时间更新了一些 k8s 相关的博客和视频,也收到了一些反馈;大概分为这几类:

    • 公司已经经历过服务化改造了,但还未接触过云原生。

    • 公司部分应用进行了云原生改造,但大部分工作是由基础架构和运维部门推动的,自己只是作为开发并不了解其中的细节,甚至 k8s 也接触不到。

    • 还处于比较传统的以虚拟机部署的传统运维为主。

    其中以第二种占大多数,虽然公司进行了云原生改造,但似乎和纯业务研发同学来说没有太大关系,自己工作也没有什么变化。

    恰好我之前正好从业务研发的角度转换到了基础架构部门,两个角色我都接触过,也帮助过一些业务研发了解公司的云原生架构

    为此所以我想系统性的带大家以研发的角度对 k8s 进行实践。

    因为 k8s 部分功能其实是偏运维的,对研发来说优先级并不太高;所以我不太会涉及一些 k8s 运维的知识点,比如安装、组件等模块;主要以我们日常开发会使用到的组件讲起。

    计划

    入门

    • 部署应用到 k8s

    • 跨服务调用

    • 集群外部访问

    进阶

    • 如何使用配置

    • 服务网格实战

    运维你的应用

    • 应用探针

    • 滚动更新与回滚

    • 优雅采集日志

    • 应用可观测性

      • 指标可视化

    k8s 部署常见中间件

    • helm 一键部署

    • 编写 Operator 自动化应用生命周期

    d1c38136920e9f810482966c9fc1f128.png这里我整理了一下目录,每个章节都有博客+视频配合观看,大家可以按照喜好选择。

    因为还涉及到了视频,所以只能争取一周两更,在两个月内全部更新完毕。

    根据我自己的经验,以上内容都掌握的话对 k8s 的掌握会更进一步。

    部署应用到 k8s

    首先从第一章【部署应用到 k8s】开始,我会用 Go 写一个简单的 Web 应用,然后打包为一个 Docker 镜像,之后部署到 k8s 中,并完成其中的接口调用。

    编写应用

    1. func main() {  
    2.    http.HandleFunc("/ping"func(w http.ResponseWriter, r *http.Request) {  
    3.       log.Println("ping")  
    4.       fmt.Fprint(w, "pong")  
    5.    })  
    6.   
    7.    http.ListenAndServe(":8081"nil)  
    8. }

    应用非常简单就是提供了一个 ping  接口,然后返回了一个 pong.

    Dockerfile

    1. # 第一阶段:编译 Go 程序  
    2. FROM golang:1.19 AS dependencies  
    3. ENV GOPROXY=https://goproxy.cn,direct  
    4. WORKDIR /go/src/app  
    5. COPY go.mod .  
    6. #COPY ../../go.sum .  
    7. RUN --mount=type=ssh go mod download  
    8.   
    9. # 第二阶段:构建可执行文件  
    10. FROM golang:1.19 AS builder  
    11. WORKDIR /go/src/app  
    12. COPY . .  
    13. #COPY --from=dependencies /go/pkg /go/pkg  
    14. RUN go build  
    15.   
    16. # 第三阶段:部署  
    17. FROM debian:stable-slim  
    18. RUN apt-get update && apt-get install -y curl  
    19. COPY --from=builder /go/src/app/k8s-combat /go/bin/k8s-combat  
    20. ENV PATH="/go/bin:${PATH}"  
    21.   
    22. # 启动 Go 程序  
    23. CMD ["k8s-combat"]

    之后编写了一个 dockerfile 用于构建 docker 镜像。

    1. docker:  
    2.    @echo "Docker Build..."  
    3.    docker build . -t crossoverjie/k8s-combat:v1 && docker image push crossoverjie/k8s-combat:v1

    使用 make docker  会在本地构建镜像并上传到 dockerhub

    编写 deployment

    下一步便是整个过程中最重要的环节了,也是唯一和 k8s 打交道的地方,那就是编写 deployment。

    在之前的视频《一分钟了解 k8s》中讲过常见的组件:6db2cc9c9a55e85558fbe1bc6bfc4687.png

    其中我们最常见的就是 deployment,通常用于部署无状态应用;现在还不太需要了解其他的组件,先看看 deployment 如何编写:

    1. apiVersion: apps/v1  
    2. kind: Deployment  
    3. metadata:  
    4.   labels:  
    5.     app: k8s-combat  
    6.   name: k8s-combat  
    7. spec:  
    8.   replicas: 1  
    9.   selector:  
    10.     matchLabels:  
    11.       app: k8s-combat  
    12.   template:  
    13.     metadata:  
    14.       labels:  
    15.         app: k8s-combat  
    16.     spec:  
    17.       containers:  
    18.         - name: k8s-combat  
    19.           image: crossoverjie/k8s-combat:v1  
    20.           imagePullPolicy: Always  
    21.           resources:  
    22.             limits:  
    23.               cpu: "1"  
    24.               memory: 300Mi  
    25.             requests:  
    26.               cpu: "0.1"  
    27.               memory: 30Mi

    开头两行的 apiVersion  和 kind 可以暂时不要关注,就理解为 deployment 的固定写法即可。

    metadata:顾名思义就是定义元数据的地方,告诉 Pod 我们这个 deployment 叫什么名字,这里定义为:k8s-combat

    中间的:

    1. metadata:  
    2.   labels:  
    3.     app: k8s-combat

    也很容易理解,就是给这个 deployment 打上标签,通常是将这个标签和其他的组件进行关联使用才有意义,不然就只是一个标签而已。

    标签是键值对的格式,key, value 都可以自定义。

    而这里的  app: k8s-combat 便是和下面的 spec 下的 selector 选择器匹配,表明都使用  app: k8s-combat  进行关联。

    而 template 中所定义的标签也是为了让选择器和 template 中的定义的 Pod 进行关联。

    Pod 是 k8s 中相同功能容器的分组,一个 Pod 可以绑定多个容器,这里就只有我们应用容器一个了;后续在讲到 istio 和日志采集时便可以看到其他的容器。

    template 中定义的内容就很容易理解了,指定了我们的容器拉取地址,以及所占用的资源(cpu/ memory)。

    replicas: 1:表示只部署一个副本,也就是只有一个节点的意思。

    部署应用

    之后我们使用命令:

    kubectl apply -f deployment/deployment.yaml

    生产环境中往往会使用云厂商所提供的 k8s 环境,我们本地可以使用 https://minikube.sigs.k8s.io/docs/start/ minikube 来模拟。

    就会应用这个 deployment 同时将容器部署到 k8s 中,之后使用:

    kubectl get pod

    在后台 k8s 会根据我们填写的资源选择一个合适的节点,将当前这个 Pod 部署过去。

    就会列出我们刚才部署的 Pod:

    1. ❯ kubectl get pod
    2. NAME                                READY   STATUS    RESTARTS   AGE
    3. k8s-combat-57f794c59b-7k58n         1/1     Running   0          17h

    我们使用命令:

    kubectl exec -it k8s-combat-57f794c59b-7k58n  bash

    就会进入我们的容器,这个和使用 docker 类似。

    之后执行 curl 命令便可以访问我们的接口了:

    1. root@k8s-combat-57f794c59b-7k58n:/# curl http://127.0.0.1:8081/ping
    2. pong
    3. root@k8s-combat-57f794c59b-7k58n:/#

    这时候我们再开一个终端执行:

    1. ❯ kubectl logs -f k8s-combat-57f794c59b-7k58n
    2. 2023/09/03 09:28:07 ping

    便可以打印容器中的日志,当然前提是应用的日志是写入到了标准输出中。

    总结

    以上就是这一章节的主要内容,重点就是将我们应用程序员打包为 docker 镜像后上传到镜像仓库,再配置好 deployment 由 k8s 进行调度运行。

    下一章主要会涉及服务内部的调用,感兴趣的朋友可以先关注起来。

    相关的源码和 yaml 资源文件都存在这里:

    https://github.com/crossoverJie/k8s-combat

    往期推荐

    使用 SQL 的方式查询消息队列数据以及踩坑指南

    VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

    k8s 常见面试题

    新手如何快速参与开源项目

    f67129d466d77786c242c63e50b51248.png

    点分享

    6ca86152eec7e57b789907ea78a74ffa.png

    点收藏

    ea69b12eb0371dfcab8c0bd2fb587256.png

    点点赞

    5ac784f572fe044c9fdce3befdd755b2.png

    点在看

  • 相关阅读:
    修复微信小程序不能获取头像和昵称的bug,微信小程序新版头像昵称API使用
    多租户shardingSphere+mybatis实现实现
    webrtc的FULL ICE和Lite ICE
    Vue3 Diff算法之最长递增子序列,学不会来砍我!
    Mysql 入门
    Maglev: 一种快速可靠的负载均衡器
    十分钟教你在 k8s 中部署一个前后端应用
    Redis如何实现持久化(AOF、RDB、混合模式)的优缺点
    【总结】I/O接口中的数据线,地址线,控制线,状态线传输什么信息?
    springboot整合其它项目
  • 原文地址:https://blog.csdn.net/qq_18661793/article/details/132726612