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/
找到你对应的平台,执行对应的命令就可以了。
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通常会回显它所执行的每一条命令,这对于调试和理解构建过程很有帮助。
# 定义一个伪目标,表示接下来的指令不依赖于文件系统中的同名文件
.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来启动管理我们的服务了
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到服务了!
评论区