Kubernetes 入门

wxvirus2024年4月19日
大约 5 分钟

Kubernetes 入门

基本概念

  • Pod:实例,里面可以安装mysql,等内容。
  • Service: 逻辑上的服务,可以认为这个是你业务上XXX服务的直接映射
  • Deployment: 管理Pod的东西

PodService最简的理解方式:你有一个web应用,部署了 3 个实例,那么就是一个Web Service,对应了 3 个Pod

Deployment最好的理解方式:运维保证Web有 3 个实例,少了就重启一个,多了就删除一个,那么运维就是这个Deployment

提示

这里我们直接使用Docker Desktop里的Kubernetes点击Enable Kubeneteswindows系统的得需要专业版,且开启虚拟化,还得科学上网。

安装kubectl 工具

打开网站https://kubernetes.io/docs/tasks/tools/open in new window,执行对应的命令即可。

使用 Rancher 安装

sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

需要等一段时间,看电脑性能。

使用 K8S 部署web服务器

改造

我们先把依赖的redisMySQL去掉

func main() {
	//db := initDB()
	//server := initWebServer()
	//
	//userHandle := initUserHdl(db)
	//userHandle.RegisterRoutes(server)

	server := gin.Default()
    server.GET("/hello", func(c *gin.Context) {
		c.String(http.StatusOK, "这是 hello world")
	})
	err := server.Run(":9093")
	if err != nil {
		log.Fatalln(err)
		return
	}
}

部署方案

目标是部署 3 个实例,一般 3 个是比较稳定的数据,比较不容易出问题,实际中需要根据自己的业务来判断。

也就是说,需要一个Service,一个Deployment,这个Deployment管着 3 个Pod,每个Pod是一个实例。

准备K8S容器镜像

  • 已知:K8S 调度的是容器
  • 已知:容器里运行的是各种镜像
  • 又知:我们要在 K8S 里运行 xxx

即:我们要把xxx应用打包成镜像

首先在本地完成编译

必须生成一个可在linux平台可执行的xxx可执行的文件

# 必须进入到对应的目录里执行
GOOS=linux GOARCH=arm go build -o xxx .

执行一个Docker命令打包成一个镜像,还需要准备一个Dockerfile

# 指定基础镜像
FROM ubuntu:20.04

# copy 二进制文件
COPY webook /app/webook

# 设置工作目录
WORKDIR /app

# 执行二进制文件
ENTRYPOINT ["/app/webook"]
docker build -t wxvirus/webook:v0.0.1 .
docker images | grep webook            
wxvirus/webook                     v0.0.1    1944c883ad2f   29 seconds ago   75.9MB

封装一个make docker命令

.PHONY: docker
docker:
	@rm webook || true
	@GOOS=linux GOARCH=arm go build -o webook .
	@docker rmi -f wxvirus/webook:v0.0.1
	@docker build -t wxvirus/webook:v0.0.1 .
# 执行命令 一步到位
make docker

如果是windows的,可以写一个.sh一样执行即可。

编写 Deployment

编写第一个K8S的配置文件

参考文档: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/open in new window

k8s-webook-deployment.yaml

apiVersion: apps/v1
kind: Deployment
# 元数据
metadata:
  # 名称
  name: webook
# 规格说明,部署的什么
spec:
  # 副本数量,即让它部署 3 个实例
  replicas: 3
  selector:
    matchLabels:
      app: webook
  # 描述的是你的 pod 是什么样的
  template:
    metadata:
      labels:
        # 要和上面的完全配的上,KS8 都是按照标签寻找的
        app: webook
    # POD 得具体信息
    spec:
      containers:
        - name: webook
          image: wxvirus/webook:v0.0.1
          ports:
            # 对应的你的 webook 启动的端口
            - containerPort: 9093

注意

app: webook对应的应用名称基本都保持一致

kubectl apply -f k8s-webook-deployment.yaml

有提示: deployment.apps/webook created即可。

kubectl get deployments                    
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
webook    3/3     3            3           35s
kubectl get pods | grep webook
webook-5bc7f45d66-qp69t    1/1     Running   0          30s
webook-5bc7f45d66-jt2q7    1/1     Running   0          29s
webook-5bc7f45d66-64drd    1/1     Running   0          28s

apiVersion

K8S简单理解就是一个配置驱动的,或者元数据驱动,我们用户负责提供各种配置,然后K8S根据配置来执行一些动作,就是使用apiVersion来确定如何解读配置。

可以充分利用编辑器的提示来确定使用哪个apiVersion,自动帮你纠正。

spec

Deployment的规格说明,规格说明理解为说明书

  • replicas: 值为 3,意思是这个Deployment里面有 3 个副本,实际上就是 3 个Pod
  • selector: 筛选器,在K8S里一大堆Pod里面知道管理的是哪3 个,标签的keyapp,值叫webook
  • template: 每个Pod长什么样,就是模板,直接按照模板创建

selector

筛选 K8S 所需资源。配置中使用的是machLabels,也就是说Deployment按照标签label来筛选它需要的资源--Pod

它需要的是含有app=webook这个标签的Pod

还有matchExpressions,即根据表达式来筛选。

template

kind不同的时候对应的内容也不同,在Deployment里面是创建的Pod的模板,而templatespec得里面要指定containers,就可以看的出来Pod里面跑的就是容器,而且可以跑多个容器。

image

image就是镜像,我们这里用的是docker构建的镜像

注意

Docker是实现OCI标准的,所以即便现在K8s声称不支持Docker,但这个镜像依旧可以使用。

编写 Service

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

spec里有 2 个字段要注意:

  • type:这里选择的是LoadBalancer,负载均衡,意思是这个Service在逻辑上还要负责负载均衡的问题
    • selector里筛选出来的Pod做负载均衡
  • ports:端口,可以配置多个,还可以额外配置一个HTTPS
    • name:端口的名字,一般用来指示用途,比如http意思就是用来接收HTTP请求,可以随便写
    • port:外部访问的端口
    • protocol:这个端口监听什么协议
    • targetPort:转发请求的时候,应该转发到哪个Pod上的哪个端口
apiVersion: v1
kind: Service
metadata:
  name: webook
spec:
  selector:
    # 筛选的是 deployment 里定义的 pod 的标签
    app: webook
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 9093
  # 当成是一个负载均衡器
  type: LoadBalancer
  

注意,这里我的80端口改成了8081,因为我本地80端口已经被占用了,所以换了一个,对应的targetPort也要换成和Pod实例里面web服务的端口一致。

kubectl apply -f k8s-webook-service.yaml   
service/webook created
kubectl get services                    
NAME         TYPE           CLUSTER-IP        EXTERNAL-IP    PORT(S)                      AGE
webook       LoadBalancer   192.168.194.248   <pending>      80:30038/TCP                 16s

注意,我这里显示了<pending>就是因为上面写的端口是80导致占用的,改了之后就行了。

Loading...