提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 基本概念
- kubectl工具
- 部署web服务
- 生成镜像
- 编写deployment
- 编写service
- 启动服务
- k8s部署mysql
- 编写pvc
- 编写pv
- 编写service
- 部署redis
- 集成部署mysql和redis
前言
这篇文章梳理一下关于Kubernetes的一些基本概念,通过k8s来对mysql,redis和我们的服务进行部署。
基本概念
k8s是一个容器编排工具,简单来讲就是管理容器的。这里的容器可以是docker生成的,也可以不是docker生成的。在k8s中有几个基本的概念。
- pod实例,就是我们运行的一个服务实例。
- service,就逻辑上的服务,可以理解是我们业务服务的一个映射。
- deployment,它是用来管理我们实例pod的。
kubectl工具
通过这个网站来进行安装。kubectl是一个命令行工具,我们需要通过它来进行k8s部署。
https://kubernetes.io/docs/tasks/tools/
部署web服务
我们先部署一个简单的web服务,这个web服务中去除对mysql和redis的依赖。
前面我们提到了,k8s是管理容器的,所以我们需要把我们的web服务通过docker进行打包,构建一个镜像。
生成镜像
首先我们需要编译我们的源代码,将其生成一个可执行文件。使用docker对其生成镜像。
编写我们的Dockerfile文件,我们执行docker build -t就是依靠这个文件来生成镜像的。
FROM ubuntu:20.04
COPY webook /app/webook
WORKDIR /app
ENTRYPOINT ["/app/webook"]
编写deployment
其中最后containers中的ports中的containerport就是我们web服务实际监听的端口。
这里的image就是我们通过docker生成的镜像。
编写service
这边和deplpyment的编写都差不多,这里有一个很重要的点就是这里的type。
这里的type有三个选项:
- LoadBalancer负载均衡,通过这个选项我们访问我们的pod实例就是通过这里的port端口来访问的。
- NodePort,通过这个选项我们就要指定一个nodeport端口,来做为我们访问pod的端口,这个端口一般是30000开始的一个端口号。
启动服务
通过kubectl来启动我们对应的deployment和service。
kubectl apply -f XXX.yaml
k8s部署mysql
同样的我们也需要部署deployment和service。
apiVersion: apps/v1
kind: Deployment
metadata:name: webook-mysqllabels:app: webook-mysql
spec:replicas: 1selector:matchLabels:app: webook-mysqltemplate:metadata:name: webook-mysqllabels:app: webook-mysqlspec:containers:- name: webook-mysqlimage: mysql:8.0env:# 通过环境变量设置 root 的密码- name: MYSQL_ROOT_PASSWORDvalue: root
# mysql数据怎么存储volumeMounts:- mountPath: /var/lib/mysqlname: mysql-storage
# -pod暴露的端口ports:- containerPort: 3306volumes:- name: mysql-storagepersistentVolumeClaim:# 使用 webook-mysql-pv-claim,这个 claim 里面详细描述了 mysql 所需要的卷的特性claimName: webook-mysql-pv-claim
编写pvc
但是mysql是需要持久化存储的,所以我们需要为mysql配置持久化卷。pvc就是PersistentVolumeClaim,他描述了mysql需要什么样的Volume。
编写pv
pv描述的就是我k8s有什么样子的voloume。这两个配置需要相符配合使用。
编写service
这里的service就是使用的NodePort类型了,我们需要指定一个nodeport端口,这是外部访问我们的端口。这里的port端口就是这个service的端口,targetPort是我们访问pod的端口。
部署redis
redis的部署就很简单了,不需要编写pv和pc。
集成部署mysql和redis
在我们的项目中,我们的webook服务是被部署在k8s中的,他要想访问redis和mysql应该是内部通信。
因此需要绑定内部的接口。也就是上图中的port端口。ip地址我们直接使用的label名称,k8s会自动帮我们解析。这也是当时踩坑的地方。