关于kubernetes:k8s-入门到实战部署应用到-k8s

51次阅读

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

背景

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

  • 公司曾经经验过服务化革新了,但还未接触过云原生。
  • 公司局部利用进行了云原生革新,但大部分工作是由基础架构和运维部门推动的,本人只是作为开发并不理解其中的细节,甚至 k8s 也接触不到。
  • 还处于比拟传统的以虚拟机部署的传统运维为主。

其中以第二种占大多数,尽管公司进行了云原生革新,但仿佛和纯业务研发同学来说没有太大关系,本人工作也没有什么变动。

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

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

因为 k8s 局部性能其实是偏运维的,对研发来说优先级并不太高;
所以我不太会波及一些 k8s 运维的知识点,比方装置、组件等模块;次要以咱们日常开发会应用到的组件讲起。

打算

入门

  • 部署利用到 k8s
  • 跨服务调用
  • 集群内部拜访

    进阶

  • 如何应用配置
  • 服务网格实战

运维你的利用

  • 利用探针
  • 滚动更新与回滚
  • 优雅采集日志
  • 利用可观测性

    • 指标可视化

k8s 部署常见中间件

  • helm 一键部署
  • 编写 Operator 自动化利用生命周期

这里我整顿了一下目录,每个章节都有博客 + 视频配合观看,大家能够依照爱好抉择。

因为还波及到了视频,所以只能争取一周两更,在两个月内全副更新结束。

依据我本人的教训,以上内容都把握的话对 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。

<iframe src=”//player.bilibili.com/player.html?aid=702346697&bvid=BV1Cm4y1n7yG&cid=1235124452&page=1″ scrolling=”no” border=”0″ frameborder=”no” framespacing=”0″ allowfullscreen=”true”> </iframe>

在之前的视频《一分钟理解 k8s》中讲过常见的组件:

其中咱们最常见的就是 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

结尾两行的 apiVersionkind 能够临时不要关注,就了解为 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

正文完
 0