当前位置: 首页 > news >正文

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 中,并完成其中的接口调用。

编写应用

func main() {  http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {  log.Println("ping")  fmt.Fprint(w, "pong")  })  http.ListenAndServe(":8081", nil)  
}

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

Dockerfile

# 第一阶段:编译 Go 程序  
FROM golang:1.19 AS dependencies  
ENV GOPROXY=https://goproxy.cn,direct  
WORKDIR /go/src/app  
COPY go.mod .  
#COPY ../../go.sum .  
RUN --mount=type=ssh go mod download  # 第二阶段:构建可执行文件  
FROM golang:1.19 AS builder  
WORKDIR /go/src/app  
COPY . .  
#COPY --from=dependencies /go/pkg /go/pkg  
RUN go build  # 第三阶段:部署  
FROM debian:stable-slim  
RUN apt-get update && apt-get install -y curl  
COPY --from=builder /go/src/app/k8s-combat /go/bin/k8s-combat  
ENV PATH="/go/bin:${PATH}"  # 启动 Go 程序  
CMD ["k8s-combat"]

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

docker:  @echo "Docker Build..."  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 如何编写:

apiVersion: apps/v1  
kind: Deployment  
metadata:  labels:  app: k8s-combat  name: k8s-combat  
spec:  replicas: 1  selector:  matchLabels:  app: k8s-combat  template:  metadata:  labels:  app: k8s-combat  spec:  containers:  - name: k8s-combat  image: crossoverjie/k8s-combat:v1  imagePullPolicy: Always  resources:  limits:  cpu: "1"  memory: 300Mi  requests:  cpu: "0.1"  memory: 30Mi

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

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

中间的:

metadata:  labels:  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:

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

我们使用命令:

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

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

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

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

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

❯ kubectl logs -f k8s-combat-57f794c59b-7k58n
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

点在看

相关文章:

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

k8s 入门到实战 01.png 本文提供视频版: 背景 最近这这段时间更新了一些 k8s 相关的博客和视频,也收到了一些反馈;大概分为这几类: 公司已经经历过服务化改造了,但还未接触过云原生。公司部分应用进行了云原生改造&…...

编程语言新特性:instanceof的改进

以前也写过类似的博文,可能重复。 要判断一个对象是哪个类或父类的实例,JAVA用到instanceof,其实语言也有类似语法。而类一般是多层继承的,有时就让人糊涂。所以我提出改进思路: instanceof:保持不变。ins…...

数据挖掘的学习路径

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...

逻辑回归Logistic

回归 概念 假设现在有一些数据点,我们用一条直线对这些点进行拟合(这条直线称为最佳拟合直线),这个拟合的过程就叫做回归。进而可以得到对这些点的拟合直线方程。 最后结果用sigmoid函数输出 因此,为了实现 Logisti…...

Flink提交jar出现错误RestHandlerException: No jobs included in application.

今天打包一个flink的maven工程为jar,通过flink webUI提交,发现居然报错。 如上图所示,提示错误为: Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: No jobs included in application. …...

【数仓基础(一)】基础概念:数据仓库【用于决策的数据集合】的概念、建立数据仓库的原因与好处

文章目录 一. 数据仓库的概念1. 面向主题2. 集成3. 随时间变化4. 非易失粒度 二. 建立数据仓库的原因三. 使用数据仓库的好处 一. 数据仓库的概念 数据仓库的主要作用: 数据仓库概念主要是解决多重数据复制带来的高成本问题。 在没有数据仓库的时代,需…...

电商类面试问题--01Elasticsearch与Mysql数据同步问题

在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。 全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进…...

天线材质介绍--FPC天线

...

vue3 的 ref、 toRef 、 toRefs

1、ref: 对原始数据进行拷贝。当修改 ref 响应式数据的时候&#xff0c;模版中引用 ref 响应式数据的视图处会发生改变&#xff0c;但原始数据不会发生改变 <template><div>{{refA}}</div> </template><script lang"ts" setup> impor…...

WebRTC中 setup:actpass、active、passive

1、先看一下整个DTLS的流程 setup:actpass、active、passive就发生在Offer sdp和Anser SDP中 Offer的SDP是setup:actpass,这个是服务方&#xff1a; v0\r o- 1478416022679383738 2 IN IP4 127.0.0.1\r s-\r t0 0\r agroup:BUNDLE 0 1\r aextmap-allow-mixed\r amsid-semanti…...

ModuleNotFoundError: No module named ‘lavis‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

双指针的问题解法以及常见的leetcode例题。

目录 介绍&#xff1a; 问题1&#xff1a;双指针 剑指offer57 和为S的两个数字。 问题2&#xff1a;剑指Offer 21. 调整数组顺序使奇数位于偶数前面 问题3&#xff1a;连续奇数子串&#xff08;笔试遇到的真题&#xff09; 问题4&#xff1a;滑动窗口的最大值 介绍&#…...

python容器模块Collections

Python附带一个模块&#xff0c;它包含许多容器数据类型&#xff0c;名字叫作collections defaultdict defaultdict与dict类型不同&#xff0c;你不需要检查key是否存在&#xff0c;所以我们能这样做&#xff1a; from collections import defaultdict colours ((Yasoob, Y…...

排序算法学习记录-快速排序

快速排序 快速排序关键在于确定一个中间值&#xff0c;使得小于这个中间值的数在左边&#xff0c;大于这个中间值的数在右边。那么中间值该如何确定呢&#xff1f;有以下几种做法 首元素&#xff0c;也就是arr[l]尾元素&#xff0c;也就是arr[r]中间元素&#xff0c;也就是ar…...

安装windows版本的ros2 humble的时候,最后报错

"[rti_connext_dds_cmake_module][warning] RTI Connext DDS environment script not found (\resource\scripts\rtisetenv_x64Win64VS2017.bat). RTI Connext DDS will not be available at runtime, unless you already configured PATH manually." 意思是没找到。…...

Nginx 学习(十)高可用中间件的配置与实现

一 Keepalived热备 1 概述 调度器出现单点故障&#xff0c;如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的&#xff0c;专门监控各服务器节点的状态Keepalived后来加入了VRRP功能&#xff0c;防止单点故障 2 运行原理 Keepalived检测每个服务器节点状…...

[刷题记录]牛客面试笔刷TOP101

牛客笔试算法必刷TOP101系列,每日更新中~ 1.合并有序链表2023.9.3 合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com) 题意大致为: 将两个链表中的元素按照从小到大的顺序合并成为一个链表. 所给予的条件: 给出的所要合并的链表都是从小到大顺序排列的. 思路: 创建一…...

降水预报之双重惩罚

在降水预报中&#xff0c;通常会出现 "双重惩罚问题 "的指标或度量包括那些常用于预报验证的指标或度量。当假阴性&#xff08;漏报降水事件&#xff09;和假阳性&#xff08;误报&#xff09;受到同等惩罚或加权时&#xff0c;就会出现双重惩罚问题&#xff0c;这在…...

一条SQL语句的执行过程(附一次两段式提交)

一条SQL语句的完整执行过程是怎样的呢&#xff1f;我们用select和update语句来举例。 注意在mysql8后&#xff0c;进入服务层后&#xff0c;取消了去查询缓存(属于Server服务层)这个步骤&#xff0c;缓存中key是SQL语句&#xff0c;value是值&#xff0c;这样其实并不会提升性…...

Python基础知识详解:数据类型、对象结构、运算符完整分析

文章目录 python基础知识数据类型类型检查对象&#xff08;object&#xff09;对象的结构变量和对象类型转换运算符(操作符)1. 算术运算符2. 赋值运算符3. 比较运算符&#xff08;关系运算符&#xff09;4. 逻辑运算符5. 条件运算符&#xff08;三元运算符&#xff09; 总结 py…...

AI工程实践简报:如何用高质量信号提升技术决策效率

1. 项目概述&#xff1a;一份真正“够用”的AI资讯简报&#xff0c;到底长什么样&#xff1f;“This AI newsletter is all you need #38”——光看标题&#xff0c;你可能以为这又是一份泛泛而谈的行业 roundup&#xff0c;或是堆砌热点、浮于表面的“信息快餐”。但作为连续三…...

解决Keil MDK中Arm Compiler V6.6.1许可错误

1. 问题现象解析当你在Keil MDK-Plus或Essential版本中尝试使用Arm Compiler V6.6.1 Long Term Maintenance&#xff08;长期维护版&#xff09;编译项目时&#xff0c;会遇到以下错误提示&#xff1a;ARMClang.exe: error: CT.CompilerEM66 is not available with the current…...

别再只会用默认库了!用OrCAD Capture CIS高效创建Homogeneous与Heterogeneous复合器件

高效设计复杂芯片&#xff1a;OrCAD Capture CIS中Homogeneous与Heterogeneous器件的进阶实践 在电子设计领域&#xff0c;面对日益复杂的芯片架构&#xff0c;工程师们常常陷入一个两难境地&#xff1a;当芯片包含多个功能单元时&#xff0c;是应该逐个绘制每个部分&#xff…...

Linux grep 文本过滤与正则实战——日志筛选、文本匹配神器

前言grep 是 Linux 最核心的文本搜索、日志过滤命令&#xff0c;排查报错、筛选日志、过滤配置、批量匹配全部靠它。本文从基础用法到正则实战&#xff0c;全覆盖工作高频场景&#xff0c;看完彻底掌握 grep。一、grep 核心作用从文件/管道流中匹配包含指定关键词的行&#xff…...

从选刊到综述:GPT到底在学术写作上升级了什么?

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 导师把选题报告打回来,批注栏里写着:“创新点不够清晰,建议重新梳理研…...

ISTA 3B-2013 全解析|零担货物 (LTL) 综合模拟运输测试标准(CSDN 完整版)前言

前言 ISTA 3B-2013 是 ISTA 3 系列高级综合模拟测试&#xff0c;专门针对零担货物运输&#xff08;LTL&#xff09; 的包装件。 零担运输的特点是多货混装、多次中转、人工 / 叉车交叉搬运、环境复杂&#xff0c;因此 3B 是工业、设备、家电、汽配、大型包装最贴近真实物流的测…...

为AI智能体项目选择与接入高性价比大模型API服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为AI智能体项目选择与接入高性价比大模型API服务 在构建AI智能体或自动化工作流时&#xff0c;开发者面临的核心挑战往往集中在两个…...

视频理解新范式:COOT模型实现对象-场景联合建模的视频描述生成

1. 项目概述&#xff1a;让视频自己“开口说话”的底层逻辑你有没有遇到过这样的场景&#xff1a;手头有一段3分钟的产品演示视频&#xff0c;需要快速生成一段精准的图文摘要发给客户&#xff1b;或者在做无障碍内容开发时&#xff0c;得为一段教学视频配上逐帧语义描述&#…...

Claude Mythos:首个具备自主渗透能力的通用AI安全模型

1. 这不是一次普通升级&#xff1a;Mythos 的能力跃迁到底意味着什么 如果你过去三年一直在跟进大模型的演进节奏&#xff0c;大概率会记得2023年Claude 2发布时那种“稳扎稳打”的观感——推理更连贯、长文本更可靠、代码能力有提升&#xff0c;但整体仍属于渐进式优化。2024年…...

为什么92%的团队误用Gemini做Java审查?资深架构师拆解3个致命配置陷阱及修复命令集

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Gemini Java代码审查的真相与误区 Gemini 并非专为 Java 代码审查设计的工具&#xff0c;其底层模型&#xff08;如 Gemini 1.5 Pro&#xff09;虽具备强大的自然语言理解与代码生成能力&#xff0c;但缺乏静…...