概要
使用GKE 去部署服务
技术细节
- 先创建一个project
点击创建即有了自己的project, 之后虚拟机和K8S engine的操作都是在project 沙箱里进行的
- 创建虚拟机, 英文即Compute Engine
选择机器类型,资源大小和节点位置就可以创建一个虚机
- 检查VPC- IP 地址,保证续集对应的ip是静态的
检查虚拟机的外部 IP 地址是否为静态。如果是临时,请进行更改
- 配置虚机ssh访问, 以 centos为例
//更新软件包
sudo yum update(sudo -i ;yum update)
//安装ssh
sudo yum install openssh-server
//centos配置ssh时 /etc/ssh/sshd_config需要修改哪些
vi /etc/ssh/sshd_config
//搜索关键字
:/Port (回车)
//重启ssh
sudo systemctl start sshd(sudo service ssh restart )
//重启
reboot
//设置密码
★補足説明:centos配置ssh时 /etc/ssh/sshd_config需要修改哪些
Port: 默认情况下,SSH服务器使用端口22。您可以通过修改Port选项来更改SSH服务器的监听端口。请确保选择一个安全的、未被其他服务使用的端口。
PermitRootLogin: 默认情况下,允许root用户通过SSH登录。您可以通过将PermitRootLogin选项设置为no来禁用root用户的SSH登录。这可以增加系统的安全性。
PasswordAuthentication: 默认情况下,SSH服务器允许使用密码进行身份验证。如果您希望仅允许使用SSH密钥进行身份验证,可以将PasswordAuthentication选项设置为no。
PermitEmptyPasswords: 默认情况下,空密码是不允许的。确保PermitEmptyPasswords选项设置为no,以防止用户使用空密码进行身份验证。
PubkeyAuthentication: 默认情况下,SSH服务器启用了公钥身份验证。确保PubkeyAuthentication选项设置为yes,以允许用户使用SSH密钥进行身份验证。
- 重启机器就可以使用ssh连接
插入在Compute Engine机器上构造镜像的步骤
- 准备一个vue的前端项目,使用npm run build去构建最终发布的dist 文件
按照下面目录结构放文件, 其中nginx可以放在任意位置
nginx.conf 文件内容,这是一个标准的nginx配置文件,表示监听80端口流量请求
对浏览器url请求返回到location 配置的/usr/share/nginx/html/index.html 文件,
文件路径/usr/share/nginx/html 就是dist下文件需要复制到的目的地
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
try_files $uri /index.html;
}
# kill cache
proxy_no_cache 1;
proxy_cache_bypass 1;
}
Dockerfile 脚本的内容
# 使用 Nginx 基础镜像
FROM nginx:latest
# 移除默认的 Nginx 配置文件
RUN rm /etc/nginx/conf.d/default.conf
# 复制自定义的 Nginx 配置文件到容器中
COPY nginx.conf /etc/nginx/conf.d/
# 复制构建好的前端项目文件到 Nginx 的默认静态文件目录
COPY html/dist/ /usr/share/nginx/html
# 设置 Nginx 的运行时命令
CMD ["nginx", "-g", "daemon off;"]
- 在Compute Engine机器上构建docker镜像
安装Docker:在Compute Engine实例上安装Docker引擎。以下是在CentOS上安装Docker的命令:
//执行错了 清除的场合
sudo rm /etc/yum.repos.d/docker-ce.repo
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
systemctl restart docker
搜索artifact找到Artifact Repository 谷歌官方的仓库,
因为在之前的探索中发现自己搭建的仓库在GKE部署时候,无法正确拉取镜像所以按照
如果镜像仓库没有实例,点击‘创建代码库’ -> 后文因为上传的都是docker镜像,所以称呼为镜像仓库
点击此处可以复制镜像仓库的路径,比如我这里用的是
asia-east2-docker.pkg.dev/my-blog-400405/docker-image-harbor
这里先留意这个路径,后文中为了给这个仓库路径上传镜像会用到这个路径
这个脚本告诉docker
- 我需要一个nginx的镜像从dockerhub去寻找,版号是latest
- RUN 执行删除原始nginx配置文件default.conf
- RUN 把我们准备好的新的nginx配置文件复制到nginx镜像里的指定位置->/etc/nginx/conf.d/
- 把html/dist/ 下的文件复制到nginx镜像里的指定位置/usr/share/nginx/html
- 最后执行CMD ,这个命令在镜像构建后执行,nginx -g daemon off;启动nginx
为了方便镜像构建, 我们准备一个构建镜像的脚本 dist_build.sh(nginx目录下)
#!/bin/bash
# 设置变量
# Dockerfile 文件的路径
DOCKERFILE_PATH="/deng/nginx/Dockerfile"
# 镜像名称
PROJECT_NAME="test-vue-login"
IMAGE_VERSION="latest"
IMAGE_NAME="$PROJECT_NAME:$IMAGE_VERSION"
# 构建镜像
docker build -t "$IMAGE_NAME" -f "$DOCKERFILE_PATH" .
# 给镜像打tag
docker tag $IMAGE_NAME \
asia-east2-docker.pkg.dev/deng-project-400901/deng-sosu/$IMAGE_NAME
docker push \
asia-east2-docker.pkg.dev/deng-project-400901/deng-sosu/$IMAGE_NAME
★为了把本地镜像push到仓库去gcloud auth login
为了能在Compute Engine机器上push镜像到Google Artifact Repository
需要用gcloud auth login命令登录验
同样我们可以使用密钥key和使用docker login命令登录到artifacts
docker login -u _json_key -p "$(cat /root/deng/nginx/deng-project-400901-692947a0422c.json)" asia-east2-docker.pkg.dev/deng-project-400901
k8s
如果重新部署
Springboot 的目录
- /backend
- /demo
- xx.jar
- xx.properties
- Dockerfile
- app_build.sh
springboot 项目的dockerfile怎么写
# 设置基础镜像
FROM openjdk:11-jdk-slim
# 设置工作目录
WORKDIR /app
# 复制构建生成的 JAR 文件到镜像中
COPY demo/demo-0.0.1-SNAPSHOT.jar /app/my-app.jar
COPY demo/application.properties /app/custom.properties
# 暴露应用端口
EXPOSE 8000
# 设置容器启动命令
CMD ["java", "-jar", "/app/my-app.jar", "--spring.config.location=/app/custom.properties"]
为了方便镜像构建, 我们准备一个构建镜像的脚本 app_build.sh
#!/bin/bash
# 设置变量
# Dockerfile 文件的路径
DOCKERFILE_PATH="/root/deng/backend/Dockerfile"
# 镜像名称
PROJECT_NAME="test-springboot-login"
IMAGE_VERSION="latest"
IMAGE_NAME="$PROJECT_NAME:$IMAGE_VERSION"
# 构建镜像
docker build -t "$IMAGE_NAME" -f "$DOCKERFILE_PATH" .
# 给镜像打tag
docker tag $IMAGE_NAME \
asia-east2-docker.pkg.dev/deng-project-400901/deng-sosu/$IMAGE_NAME
docker push \
asia-east2-docker.pkg.dev/deng-project-400901/deng-sosu/$IMAGE_NAME
- 工作负载(Deployment, 后面使用英文原本词)
- 创建Service和Ingress
- 开启Google Cloud SQL, 创建mysql实例
-
点击连接。
-
在连接页面上,点击网络标签页
-
点击添加网络。
-
输入您希望使用的名称,然后在网络框中输入虚拟机的静态 IP 地址。
-
点击完成,然后点击保存。
将0.0.0.0/0 添加上网路,这样任意客户端都可以访问
- 在虚拟机上安装mysql客户端
sudo yum install mysql-server mysql
测试mysql的连接 ,因为在mysql实例的网络上只添加了虚机的访问,下面测试命令发自虚拟机
小结
为什么要创建集群,集群可以提高服务的高可用性,它通过控制Pod 进行动态扩容,如果有Pod异常它会自动重建pod, 停掉有问题的Pod
- 创建Kubernetes 集群
直接点确定创建k8s集群