一、k8s的作用
Kubernetes(简称k8s)的主要作用是提供一个强大的容器编排和管理系统,它能够自动化部署、扩展和管理容器化应用。以下是k8s核心功能的摘要:
- 容器编排:k8s可以将多个容器组成应用程序,并跨多台主机进行高效组织和调度。
- 自动装箱:基于容器资源需求,自动将容器部署到集群内的合适节点上。
- 服务发现与负载均衡:k8s内部实现了服务发现机制,允许服务之间的相互发现和通信,并通过内置的负载均衡器将请求分配到不同容器实例。
- 自我修复:当容器出现故障时,k8s会自动重启容器以保持预期状态,并确保应用的高可用性。
- 水平扩展:根据业务需求,用户可以方便地调整容器副本数量,实现快速扩容或缩容。
- 存储编排:管理持久卷(Persistent Volumes)和持久卷声明(Persistent Volume Claims),简化对存储资源的管理与使用。
- 密钥与配置管理:通过ConfigMaps和Secrets来管理应用所需的配置信息和敏感数据。
- 滚动更新与回滚:支持平滑无中断的版本升级,并在需要时轻松回滚到先前版本。
- API驱动与可扩展性:所有k8s的功能都是通过其丰富的API接口进行控制,这使得第三方工具和服务能够无缝集成。
综上所述,Kubernetes极大地简化了容器化应用的生命周期管理,提高了资源利用率,并为云原生环境提供了坚实的基础架构支撑。
二、k8s部署yaml
在 Kubernetes (k8s) 中,部署 YAML 文件是用来定义和管理应用部署的配置文件。YAML 是一种直观易读的数据序列化格式,非常适合用来描述 k8s 资源对象。以下是一个简单的 Deployment YAML 示例,它创建了一个 Nginx 部署,具有 3 个副本:
yaml
apiVersion: apps/v1 # 指定 API 版本
kind: Deployment # 指定资源类型为 Deployment
metadata:
name: nginx-deployment # 部署的名称
spec:
replicas: 3 # 指定希望运行的 Pod 副本数量
selector:
matchLabels:
app: nginx # 选择器标签,与 Pod 的标签匹配以关联 Pod 到这个 Deployment
template:
metadata:
labels:
app: nginx # Pod 的标签,必须与上面的选择器标签匹配
spec:
containers:
- name: nginx # 容器的名称
image: nginx:1.21.6 # 使用的容器镜像及其版本
ports:
- containerPort: 80 # 容器内暴露的端口
当将此 YAML 文件通过 kubectl apply -f deployment.yaml
命令提交给 k8s 集群时,Kubernetes 将会根据配置创建一个名为 nginx-deployment
的 Deployment 对象,并确保有 3 个运行着 Nginx 容器(基于指定镜像)的 Pod 正在运行。
请注意,实际的 YAML 文件可能包含更多复杂的配置选项,例如环境变量、卷挂载、健康检查配置等。
三、k8s 与 dockerfile的关联
Kubernetes (k8s) 和 Dockerfile 之间的联系主要体现在容器化应用的构建和部署流程上:
- Dockerfile :它是用来定义一个 Docker 镜像的文本文件,包含了若干指令(如
FROM
、RUN
、COPY
等),用于指导如何从基础镜像开始逐步构建新的容器镜像。开发者通过编写 Dockerfile 来标准化应用环境及其依赖项的打包过程,确保每次构建都能得到一致的应用容器。 - 容器镜像构建:使用 Docker 构建工具根据 Dockerfile 创建容器镜像,该镜像可以被推送至 Docker Hub 或私有镜像仓库作为软件分发单元。
- Kubernetes 中的镜像使用 :在 Kubernetes 中,编写的 YAML 或 JSON 格式的部署配置文件会引用之前由 Dockerfile 构建并上传的容器镜像。例如,在 Deployment、StatefulSet 或者 Job 等资源对象中,通过
.spec.template.spec.containers.image
字段指定运行时使用的容器镜像。 - 生命周期管理:Kubernetes 使用这些预构建的镜像来启动容器实例,并对其进行管理和调度,包括容器的启动、停止、重启、扩缩容等操作。虽然 Kubernetes 不直接使用 Dockerfile,但它依赖于 Dockerfile 生成的标准化镜像来实现对容器化应用的高效管理和运维。
综上所述,Dockerfile 在容器镜像创建阶段起着关键作用,而 Kubernetes 则是在更高层次上利用这些镜像进行大规模的容器编排与管理。
四、Nginx部署
在部署Nginx时,不同操作系统和环境下的具体步骤可能会有所不同。这里提供一个简化的通用流程,分别针对Windows和Linux系统:
在Windows上部署Nginx:
-
下载:
- 访问 Nginx官网 下载适用于Windows的稳定版压缩包。
-
解压:
- 将下载的
.zip
文件解压到合适的位置,例如C:\nginx
。
- 将下载的
-
配置:
-
打开解压目录,找到
conf
文件夹里的nginx.conf
文件进行必要的配置修改,比如服务器监听端口、网站根目录等。- 找到配置文件 :默认路径为
C:\nginx\conf\nginx.conf
或者C:\nginx\conf\nginx.conf.default
。(Nginx的主要配置文件通常位于/etc/nginx/nginx.conf
,但大多数服务器上针对不同网站或服务的配置会放在/etc/nginx/conf.d/
) - 创建或编辑配置 :为了部署一个新站点或服务,你需要创建一个新的配置文件,以指向你的前端项目。假设你有一个名为
my-frontend-app
的项目打包后的静态资源位于D:\projects\my-frontend-app\dist
目录下,你可以这样配置:
nginxserver { listen 80; # 监听HTTP端口 server_name yourdomain.com; # 替换为你的域名或IP地址 root D:\projects\my-frontend-app\dist; # 静态文件根目录 index index.html index.htm; location / { try_files $uri $uri/ =404; # 如果找不到文件,则返回404错误 } }
- 找到配置文件 :默认路径为
-
-
启动服务:
- 通过命令行启动
- 通过命令行(管理员权限)切换到 Nginx 的bin目录,例如
cd C:\nginx\nginx.exe
。 - 使用命令启动 Nginx 服务,如
.\nginx.exe
。如果需要作为服务运行,可以参考官方文档使用.\nginx.exe -s install
安装为系统服务,然后用net start nginx
来启动服务。
- 通过命令行(管理员权限)切换到 Nginx 的bin目录,例如
- 双击运行
nginx.exe
文件来启动Nginx服务器。如果一切正常,你应该能够在浏览器访问http://localhost
看到你的前端应用。
- 通过命令行启动
-
验证:
- 在浏览器中访问
http://localhost:80
(假设你没有更改默认监听端口),查看是否能看到 Nginx 的欢迎页面。
- 在浏览器中访问
-
重新加载配置文件:
- 如果你在配置文件中做了任何改动,不需要关闭Nginx再重启,而是可以通过命令行执行
nginx -s reload
来重新加载配置(确保已将Nginx的bin目录添加到系统环境变量PATH中)。
在Linux(如Ubuntu/CentOS)上部署Nginx:
-
安装依赖库:
- 对于Ubuntu/Debian系系统,执行
sudo apt update && sudo apt install nginx
。 - 对于CentOS/Red Hat系系统,执行
sudo yum install epel-release
然后sudo yum install nginx
。
- 对于Ubuntu/Debian系系统,执行
-
配置:
- 编辑配置文件
/etc/nginx/nginx.conf
或者/etc/nginx/conf.d/default.conf
,根据需求调整设置。
- 编辑配置文件
-
启动与验证:
- 启动服务:
sudo systemctl start nginx
- 设置开机自启:
sudo systemctl enable nginx
- 检查状态:
sudo systemctl status nginx
- 验证:打开浏览器访问服务器IP地址或域名,如
http://your_server_ip
。
- 启动服务:
-
防火墙规则:
- 如果无法访问,请确保防火墙允许HTTP(TCP 80端口)或HTTPS(TCP 443端口)流量,例如:
sudo ufw allow 'Nginx Full'
(对于UFW防火墙)。
- 如果无法访问,请确保防火墙允许HTTP(TCP 80端口)或HTTPS(TCP 443端口)流量,例如:
-
部署应用:
- 根据你的项目结构,创建新的 server 块在 Nginx 的配置文件中,并指向项目的静态资源目录或者反向代理到后端应用。
多个站点部署:
- 在Linux下,通常在
/etc/nginx/conf.d/
目录下为每个站点创建单独的配置文件(例如example.com.conf
),并在其中定义各自的 server 块来处理不同的域名请求。
五、k8s、dockerfile、jenkins之间的关联性
Dockerfile、Kubernetes (k8s) 和 Jenkins 之间的关联性主要体现在持续集成与部署(CI/CD)流程中,它们共同构成了现代云原生应用自动化构建和部署的基石:
-
Dockerfile:
- Dockerfile 是用于定义应用程序运行环境和依赖项的文本文件,通过它能够创建一个自包含的应用程序容器镜像。
- 在 CI/CD 流程中,Jenkins 或其他 CI 工具通常会使用 Dockerfile 构建容器镜像,并将其推送到 Docker Registry 中。
-
Jenkins:
- Jenkins 是一款广泛使用的开源持续集成工具,它可以实现自动化的代码构建、测试、打包以及部署等过程。
- 在开发过程中,当代码提交到版本控制系统(如 Git)时,Jenkins 可以触发构建流水线,其中可能包括执行单元测试、生成容器镜像(利用 Dockerfile)、并将新构建的镜像推送至镜像仓库。
-
Kubernetes (k8s) :
- Kubernetes 是一个强大的容器编排平台,可以对多个容器进行管理和调度。
- 在部署阶段,Jenkins 可以与 k8s 集成,通过 k8s 的 API 更新部署配置或者直接创建新的 Deployment 等资源对象,将之前构建并推送到镜像仓库中的容器镜像部署到 Kubernetes 集群中。
- 这样就可以实现从源代码变更到最终在生产环境中运行的完整自动化流程,确保快速、可靠且一致地交付软件更新。
总结起来,三者在 CI/CD 流程中的角色如下:
- Dockerfile 定义了应用程序如何被封装为可移植、一致的容器镜像。
- Jenkins 负责协调整个软件生命周期的自动化工作流程,包括触发构建、运行测试、生成镜像和部署到 k8s。
- Kubernetes 则是容器化应用在生产环境中的落地平台,负责管理容器的运行状态、服务发现、负载均衡及扩展等运维任务。
六、k8s、dockerfile、jenkins、nginx之间的关联性
Dockerfile、Kubernetes (k8s)、Jenkins 和 Nginx 在云原生环境中的关联性体现在整个应用的构建、测试、部署以及服务代理和负载均衡环节:
-
Dockerfile:
- Dockerfile 用于定义一个 Docker 容器镜像,包括基础镜像的选择、依赖安装、应用程序代码复制、运行环境配置等步骤。
- 对于 Nginx,可以编写 Dockerfile 来创建一个包含 Nginx 服务器及其配置文件的应用容器镜像。
-
Jenkins:
- Jenkins 是 CI/CD 工具,负责自动化持续集成和持续部署流程。
- 当开发人员将更新后的代码提交到版本控制系统(如 Git)时,Jenkins 可以触发流水线,执行一系列任务,其中包括使用 Docker 构建工具基于 Dockerfile 构建新的 Nginx 容器镜像,并将其推送到 Docker Registry。
-
Kubernetes (k8s) :
- Kubernetes 是一个容器编排系统,能够管理和调度多个 Docker 容器,包括部署、扩展及管理 Nginx 服务实例。
- Jenkins 集成 k8s 后,可自动在 k8s 集群中创建或更新 Deployment 或其他资源对象,使用刚构建并推送的 Nginx 镜像来启动新的容器
七. vue项目,利用k8s和dockerfile实现自动集成步骤
1. 构建Vue.js项目
确保你的Vue.js应用已经开发完成,并且可以正常运行。使用Vue CLI或其他构建工具进行项目构建,生成生产环境的静态文件。
bash
cd your-vue-project
npm install # 安装依赖
npm run build # 执行构建命令,生成dist目录
2. 编写Dockerfile
在Vue项目的根目录下创建一个名为 Dockerfile
的文件,内容如下:
dockerfile
# 使用官方Nginx镜像作为基础镜像
FROM nginx:stable-alpine
# 删除默认配置文件
RUN rm /etc/nginx/conf.d/default.conf
# 将本地的nginx配置文件复制到容器内部
COPY nginx.conf /etc/nginx/conf.d/
# 复制编译后的Vue应用文件到Nginx服务目录
COPY dist /usr/share/nginx/html
# 设置容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
同时,你需要创建一个 nginx.conf
文件,用于配置Nginx服务器以正确地提供前端资源:
nginx
server {
listen 80; # 监听HTTP端口
server_name yourdomain.com; # 替换为你的域名或IP地址
root D:\projects\my-frontend-app\dist; # 静态文件根目录
index index.html index.htm;
location / {
try_files $uri $uri/ =404; # 如果找不到文件,则返回404错误
}
}
3. 构建Docker镜像
通过Dockerfile构建一个包含Vue应用的Nginx镜像:
bash
docker build -t your-vue-app .
4. 发布到Docker Registry
将构建好的镜像推送到Docker Hub、阿里云ACR或其他私有仓库以便后续部署:
bash
docker login registry.example.com # 登录到你的仓库
docker tag your-vue-app registry.example.com/your-org/your-vue-app:v1.0
docker push registry.example.com/your-org/your-vue-app:v1.0
5. 编写Kubernetes YAML文件
创建一个 deployment.yaml
或 statefulset.yaml
来定义如何在k8s集群上部署这个应用:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: your-vue-app-deployment
spec:
replicas: 2 # 指定副本数量
selector:
matchLabels:
app: your-vue-app
template:
metadata:
labels:
app: your-vue-app
spec:
containers:
- name: your-vue-app
image: registry.example.com/your-org/your-vue-app:v1.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: your-vue-app-service
spec:
selector:
app: your-vue-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # 或者 NodePort, ClusterIP 根据需要选择服务类型
6. 部署到Kubernetes集群
将上述YAML文件应用到k8s集群中:
bash
kubectl apply -f deployment.yaml
基于coding,使用k8s/dockerfile/jenkins完成vue项目的自动集成部署
基于 Coding 平台,使用 Kubernetes (k8s)、Dockerfile 和 Jenkins 实现 Vue 项目的自动化集成部署可以分为以下步骤:
1. 配置 Dockerfile
在 Vue 项目根目录下创建一个 Dockerfile
,用于构建 Vue 应用的镜像。示例内容如下:
bash
Dockerfile
# 使用官方 Node.js 镜像作为基础镜像
FROM node:14-alpine
# 设置工作目录为 /app
WORKDIR /app
# 将当前目录下的所有文件复制到工作目录中
COPY . .
# 安装项目依赖
RUN npm install --registry=https://registry.npm.taobao.org
# 构建生产环境
RUN npm run build
# 设置容器启动时运行应用
CMD ["npm", "start"]
2. 构建并推送 Docker 镜像
在 Jenkins 中设置一个 Pipeline Job,其中包含构建阶段:
javascript
groovy
stage('构建和推送 Docker 镜像') {
steps {
sh 'docker build -t registry.coding.net/yourusername/vue-app:latest .'
withCredentials([usernamePassword(credentialsId: 'CODING_REGISTRY_CREDENTIALS', passwordVariable: 'CODING_PASSWORD', usernameVariable: 'CODING_USERNAME')]) {
sh "echo '${CODING_PASSWORD}' | docker login registry.coding.net -u '${CODING_USERNAME}' --password-stdin"
sh 'docker push registry.coding.net/yourusername/vue-app:latest'
}
}
}
这里假设你已经在 Jenkins 上配置了 CODING Docker Registry 的认证凭据。
3. 在 Kubernetes 中部署应用
创建一个 Kubernetes Deployment 或者 StatefulSet YAML 文件,例如 vue-app-deployment.yaml
:
yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: vue-app
spec:
replicas: 1
selector:
matchLabels:
app: vue-app
template:
metadata:
labels:
app: vue-app
spec:
containers:
- name: vue-app
image: registry.coding.net/yourusername/vue-app:latest
ports:
- containerPort: 8080 # 指定你的 Vue 应用监听端口
然后,在 Jenkins 中添加一个阶段来执行 kubectl apply 命令部署应用:
javascript
groovy
stage('部署到 Kubernetes') {
steps {
sh 'kubectl apply -f vue-app-deployment.yaml'
}
}
4. 配置 Ingress(可选)
如果需要对外提供服务,还需要创建一个 Nginx Ingress Controller,并配置 Ingress 资源。创建一个 vue-app-ingress.yaml
:
yaml
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: vue-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: vue-app-service
port:
number: 80
同时确保有一个 Service 资源关联到 Deployment:
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: vue-app-service
spec:
selector:
app: vue-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
同样地,在 Jenkins 中添加一个阶段以应用 Ingress 和 Service 配置。
最后,请根据实际需求调整上述步骤中的各项细节,并确保 Jenkins 能够访问到 Kubernetes 集群以及 Coding Docker Registry。