目 录CONTENT

文章目录
Go

Kubernetes 入门一波~

Hello!你好!我是村望~!
2024-07-10 / 0 评论 / 0 点赞 / 79 阅读 / 2,201 字
温馨提示:
我不想探寻任何东西的意义,我只享受当下思考的快乐~

Kubernetes 是一个开源的容器编排平台,简称 K8s。

换句话来说,是管容器的。

举例来说:

  • 学生是容器,那么老师就是 K8s。

  • 你是容器,那么你老板就是 K8s。

    既然是管理容器的,所以 K8s 既可以管理 Docker 产 生的容器,也可以管理不是 Docker 产生的容器。

Kubernetes 入门:基本概念

最开始学习的时候,你只需要记住几个基本的东西 就可以:

  • Pod:实例。

  • Service:逻辑上的服务,可以认为这个是你业务上 XXX 服务的直接映射。

  • Deployment:管理 Pod 的东西。

    Pod 和 Service 最简单的理解方式:

• 假如说你有一个 Web 应用,部署了三个实例,

那么就是一个 Web Service,对应了三个 Pod。

Deployment 最好的理解方式:
• 你跟运维说要保证我的 Web 有三个实例,少了

运维就重启一个,多了运维就删除一个,运维就 是那个 Deployment。

Kubernetes 入门:Docker 启用 K8s 支持

你只需要在 Docker 里面开启 Enable Kubernetes 功 能就可以了。

安装 kubectl 工具

https://kubernetes.io/docs/tasks/tools/

找到你对应的平台,执行对应的命令就可以了。

image-20240625073241977

image-20240625073513894

brew install kubectl

==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles-portable-ruby/portable-ruby-3.3.3.arm64_big_sur.bottle.tar.gz
############################################################################################################################################################################### 100.0%
==> Pouring portable-ruby-3.3.3.arm64_big_sur.bottle.tar.gz
==> Fetching kubernetes-cli
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/kubernetes-cli-1.30.2.arm64_sonoma.bottle.tar.gz
############################################################################################################################################################################### 100.0%
==> Pouring kubernetes-cli-1.30.2.arm64_sonoma.bottle.tar.gz
==> Caveats
zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
==> Summary
🍺  /opt/homebrew/Cellar/kubernetes-cli/1.30.2: 236 files, 54.3MB
==> Running `brew cleanup kubernetes-cli`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
➜  markdown-note-total git:(master) ✗ brew cleanup kubernetes-cli
➜  markdown-note-total git:(master) ✗ brew install kubectlkubectl version --client


➜  markdown-note-total git:(master) ✗ kubectl version --client

Client Version: v1.29.1
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
➜  markdown-note-total git:(master) ✗ 

K8s 部署实战

1. 准备服务镜像

在我们部署 K8s 的时候,是要告诉这个 K8s 里面跑的是什么东西。

已知:K8s 调度的是容器。 已知:容器里面运行的是各种镜像。 又知:我们要在 K8s 里面运行 xx服务。

答案:要把 xx服务 打包成镜像。

这里我们准备一个最简单的小服务的镜像!

package web

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func Bootstrap() {
	server := gin.Default()
	server.GET("/justHello", func(ctx *gin.Context) {
		ctx.String(http.StatusOK, "hello k8s!")
	})
	server.Run(":8888")
}

首先通过make file编写打包脚本打包我们的程序

【 额外知识点】

在Makefile中,命令前加上@符号是为了抑制Make默认的行为——即在执行命令之前先将其打印到标准输出(通常是终端)。

Make通常会回显它所执行的每一条命令,这对于调试和理解构建过程很有帮助。image-20240628112342374

# 定义一个伪目标,表示接下来的指令不依赖于文件系统中的同名文件
.PHONY: docker

docker:
    # 如果存在,则安全地删除旧的webook可执行文件
    @rm webook || true
    
    # 更新并整理Go项目的依赖关系,确保构建时使用最新依赖
    @go mod tidy
    
    # 交叉编译Go项目为Linux/arm架构,附加k8s标签,并生成名为webook的可执行文件
    @GOOS=linux GOARCH=arm go build -tags=k8s -o webook .
    
    # 强制删除已存在的flycash/webook:v0.0.1 Docker镜像,避免构建时出现冲突
    @docker rmi -f flycash/webook:v0.0.1
    
    # 使用当前目录下的Dockerfile构建一个新的Docker镜像,标记为flycash/webook:v0.0.1
    @docker build -t flycash/webook:v0.0.1 .

然后里面构建了镜像 ,下面是我们的docker镜像脚本

# 使用Ubuntu 20.04作为基础镜像
FROM ubuntu:20.04

# 将本地的webook可执行文件复制到新镜像的/app目录下
COPY webook /app/webook

# 设置容器内部的工作目录为/app 之后的命令默认将在这个目录下执行,容器启动时的工作目录也是这里
WORKDIR /app

# 定义容器启动时运行的命令
# 这里设置为执行/app目录下的webook可执行文件
# 当使用docker run命令启动容器时,如果不指定其他命令,则自动执行此CMD指令
CMD ["/app/webook"]

执行后,构建好了镜像就可以 用k8s来启动管理我们的服务了

image-20240628112725501

2. 编写deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  # 部署的名称
  name: weebook
spec:
  # 副本数设置为3,意味着会有3个Pod副本运行
  replicas: 3
  # 选择器,确保Deployment仅管理带有标签app=weebook的Pod
  selector:
    matchLabels:
      app: weebook
  # Pod模板,定义了Pod的结构
  template:
    metadata:
      # 给Pod添加标签,便于通过selector匹配
      labels:
        app: weebook
    spec:
      # 容器规范
      containers:
      - name: weebook
        # 使用的容器镜像及其版本
        image: flycash/webook:v0.0.1
        # 资源限制
        resources:
          limits:
            memory: "128Mi"   # 最大内存使用限制为128MiB
            cpu: "500m"       # 最大CPU使用限制为0.5核
        # 容器端口配置,指定容器内部应用监听的端口
        ports:
        - containerPort: 8888 # 应用在容器内监听的端口为8888
  • apiVersion K8s 简单理解就是一个配置驱动的,或者元数 据驱动,或者声明式的框架,我们用户只负责提供各种配置,然后 K8s 根 据配置来执行一些动作。利用 apiVersion 来确定怎么解读不同版本的配置文件。

  • spec,也就是 Deployment 的规格说明,规格说明你就 直接理解为说明书。

    • replicas:值为 3,也就是我这个 Deployment 有三个副本,实际上就是三个 Pod。

    • selector:筛选器,就是在 K8s 的一大堆 Pod 里面,我怎么知道哪些是我管理的那三个。

      我们配置 selector 使用的是 matchLabels。也就是说,Deployment 按照标签 (label)来筛选它需要的资源——Pod。

      常用的除了 matchLabels 还有 matchExpressions(你也可以设计自己 的 selector,不过很复杂。)

    • template:我该怎么创建每个 Pod,或者说每个Pod 长什么样。有了 template(模板),我就可以 照猫画虎直接创建出来了。

  • selector 筛选器,它在 K8s 里面被用来筛选所需资源,我们配置 selector 使用的是 matchLabels。也就是说,Deployment 按照标签 (label)来筛选它需要的资源——Pod。

  • image 就是镜像,显然这里我们用的是 Docker 构建的 镜像。(注意,Docker 是实现 OCI 标准的,所以即便现在 K8s 声称不支持 Docker,但这个镜像依旧可以用。)

启动 deployments

➜  weebook git:(master) ✗ kubectl apply -f webook-deployment.yaml

deployment.apps/weebook created
➜  weebook git:(master) ✗ kubectl get deployments.apps           

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
weebook   3/3     3            3           9s

3. 编写 service

此时,只有 Deployment 你是没办法从外面访问的,你需要将 Pod 封装为一个逻辑上的服务,即 Service。

apiVersion: v1
kind: Service
metadata:
  # 服务的名称
  name: weebook
spec:
  # 服务类型为LoadBalancer,适用于需要对外暴露服务的场景,Kubernetes会尝试为此Service创建一个外部负载均衡器(在云提供商支持的情况下)
  type: LoadBalancer
  # 选择器,用于确定哪些Pod应该接收此Service的流量,这里与Deployment中的标签匹配
  selector:
    app: weebook
  # 端口映射配置
  ports:
  - # Service监听的端口
    port: 80
    # Pod中容器实际监听的端口,流量会被转发到这里
    targetPort: 8888

请注意,使用type: LoadBalancer时,实际的负载均衡器资源是由Kubernetes所运行的云服务商(如AWS、GCP、Azure等)创建和管理的,可能会产生额外费用,并且需要云平台支持这一特性。对于不支持或不需要云负载均衡器的环境,可以考虑使用NodePort类型的服务。

➜  weebook git:(master) ✗ kubectl apply -f webook-service.yaml   
service/weebook created
➜  weebook git:(master) ✗ kubectl get services                

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        24h
weebook      LoadBalancer   10.102.103.73   localhost     80:32142/TCP   7s

➜  weebook git:(master) ✗ curl localhost/justHello
hello k8s!%                                                                                                                                                                                                                 

可以看到已经可以访问成功!我们部署到k8s到服务了!

0

评论区