前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器编排引擎Kubernetes 10——在k8s集群中部署项目

容器编排引擎Kubernetes 10——在k8s集群中部署项目

原创
作者头像
用户8100582
修改2024-06-24 15:24:23
8700
修改2024-06-24 15:24:23
举报
文章被收录于专栏:微服务化

系列目录

  1. 容器编排引擎Kubernetes 01——一文带你认识K8S
  2. 容器编排引擎Kubernetes 02——k8s安装配置
  3. 容器编排引擎Kubernetes 03——初始化集群
  4. 容器编排引擎Kubernetes 04——部署Dashboard
  5. 容器编排引擎Kubernetes 05——命名空间和POD
  6. 容器编排引擎Kubernetes 06——kubectl常用命令
  7. 容器编排引擎Kubernetes 07——Deployment介绍及使用
  8. 容器编排引擎Kubernetes 08——Service介绍及使用
  9. 容器编排引擎Kubernetes 09——资源文件的介绍及使用
  10. 容器编排引擎Kubernetes 10——在k8s集群中部署项目

1 构建 JDK 镜像

1.1 下载JDK

下载jdk文件并上传到linux中。

https://jdk.java.net/archive/ 可以从这个页面上找到需要的jdk版本并下载。

找到需要的 JDK11 GA下载到本地并上传到 K8S master 服务器,放到 /usr/local/ 目录下。

1.2 制作dockerFile

制作 jdk 的 dockerFile 文件

代码语言:shell
复制
vi dockerfile

在文件中输入以下内容

基于 centOS7,如果没有这个镜像那么它会下载这个镜像 FROM centos:7 创建者 MAINTAINER chuxuezhe 复制文件到指定目录并自动解压 ADD openjdk-11_linux-x64_bin.tar.gz /usr/local/ 设置环境变量 ENV JAVA_HOME=/usr/local/jdk-11 ENV CLASSPATH=.:/lib ENV PATH=$JAVA_HOME/bin:$PATH:/usr/local/jdk-11/bin

1.3 构建JDK镜像

在当前目录下构建镜像

代码语言:shell
复制
docker build -t='openjdk-11' .

构建完成后,查看当前所有镜像 docker images

1.4 启动容器

docker run -di --name=容器名 镜像名 /bin/bash

docker run -di --name=openjdk-11 openjdk-11 /bin/bash

查看容器状态 docker ps -a|grep jdk 容器状态为 UP

进入到容器内部 docker exec -it 容器名 bash

docker exec -it openjdk-11 bash

查看镜像中的java版本,就是我们要使用的 openjdk11。

2 构建springboot项目镜像

2.1 创建项目

在本地新建一个 SpringBoot 项目,使用jdk11版本。

项目结构如下

pom.xml文件

代码语言:xml
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>dockerdemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.3.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--这里写上main方法所在类的路径-->
                <configuration>
                    <mainClass>com.study.DemoApplication</mainClass>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

启动类 DemoApplication

代码语言:java
复制
package com.study

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

控制类 DemoController

代码语言:java
复制
package com.study.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @RequestMapping("/hello")
    public String helloController(){
        return "hello k8s!";
    }
}

在本地启动项目后,浏览器里输入url: http://localhost:8080/hello

使用maven工具,将项目打为 jar 包,并上传到服务器的 /usr/local/ 目录下,修改文件名

mv dockerdemo-1.0-SNAPSHOT.jar dockerdemo-1.0.jar

2.2 创建dockerfile

在当前目录下创建文件 dockerfile,使用docker创建镜像时,默认都会使用该文件名,注意保存之前创建的文件,以免覆盖。

添加内容到文件中:

FROM openjdk-11 MAINTAINER chuxuezhe ADD dockerdemo-1.0.jar /opt RUN chmod +x /opt/dockerdemo-1.0.jar CMD java -jar /opt/dockerdemo-1.0.jar

2.3 构建项目镜像

在当前目录下构建该项目的镜像

docker build -t='dockerdemo-1.0.jar' .

查看镜像文件

docker image ls|grep demo

使用镜像启动容器,使用宿主机8888端口映射容器中的8080端口

docker run -d -p 8888:8080 dockerdemo-1.0.jar

在浏览器中输入宿主机IP和端口,可成功访问到容器内应用。

3 安装 harbor

当K8S集群节点较多时,如果要将镜像快速部署到不同节点上时,需要手动将镜像上传到这些节点,耗时费力,且容易出错。

如果将镜像文件放到统一的平台进行维护,可以快速部署且易于扩展。外网上有 Docker Hub,一些公开的镜像都可以在这里找到。但是访问速度很慢,且不利于权限保护。

Harbor 是私有镜像仓库的一种开源实现,可以用于搭建自己公司内部的镜像仓库。

官网: harbor 一般访问较慢,可以访问其镜像网站

https://hub.nuaa.cf/goharbor/harbor/releases

因资源有限,这里将K8S集群中的节点服务器 192.168.137.4 作为 harbor 服务器使用。

3.1 下载

  • 在线下载 在线下载到 /usr/local/ 目录下。

wget https://hub.nuaa.cf/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz

先将压缩包下载到本地,然后上传到服务器的 /usr/local/ 目录下。

3.2 生成https证书

具体使用方法,可以参考harbor官网:https://goharbor.io/docs/2.9.0/install-config/configure-https/

所有文件都生成在 /root 目录下。

新版本的harbor默认使用的https访问,这里需要为后边的访问生成CA证书。

3.2.1 生成CA证书

代码语言:shell
复制
openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=ShangHai/L=ShangHai/O=example/OU=person/CN=192.168.137.4"  \
-key ca.key \
-out ca.crt

O代表组织OU代表组织别名CN代表域名,没有的可以用IP

3.2.2 生成服务器端证书

代码语言:shell
复制
openssl genrsa -out 192.168.137.4.key 4096

openssl req -sha512 -new \
-subj "/C=CN/ST=ShangHai/L=ShangHai/O=Oldboy/OU=Linux/CN=192.168.137.4" \
-key 192.168.137.4.key \
-out 192.168.137.4.csr

3.2.3 生成x509 v3服务文件

代码语言:shell
复制
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.168.137.4
EOF

3.2.4 crt转换这cert

代码语言:shell
复制
openssl x509 -inform PEM -in 192.168.137.4.crt -out 192.168.137.4.cert

3.2.5 使用该v3.ext文件为 Harbor 主机生成证书

代码语言:shell
复制
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in 192.168.137.4.csr \
-out 192.168.137.4.crt

将前边生成的文件放置到目录 /etc/docker 下,整体结构如下图:

3.3 安装部署

在安装harbor之前,需要确保 docker 和 docker-compose 已经安装完成。

  • 在当前目录下 /usr/local 解压

tar -zxvf harbor-offline-installer-v2.9.0.tgz

  • 创建harbor的保存的路径

这里是设置的是 /var/harbor

mkdir /var/harbor

  • 授权

chmod -R 750 /var/harbor

  • 修改配置文件

复制模板为配置文件

cp /usr/local/harbor/harbor.yml.tmpl /usr/local/harbor/harbor.yml

  • 编辑配置文件

vi /usr/local/harbor/harbor.yml

配置文件说明如下:

hostname改为本机在局域网的ip,比如 192.168.137.4 http的port改为设定的harbor的对外服务端口,比如 9527 打开所有https的配置(去掉前面的#),包括https、port、certificate、private_key 修改data_volume 为上面创建的 /var/harbor

配置文件可以设置管理员的账号及密码,根据需要设置

  • 安装启动
代码语言:shell
复制
cd /usr/local/harbor
./install.sh

首次启动时,需要加载harbor镜像,当出现如下内容时,表示启动完成。

harbor会自动设置为开机启动模式。

  • 验证

打开浏览器,输入 URL,这里是 https://192.168.137.4:9443/

可以看到如下登录界面

输入用户admin 及配置文件中配置的密码后,登录后进入到控制台

3.4 创建项目

在harbor上创建新的项目 demo,项目名称只能为小写,否则会提示错误。

3.5 k8s配置

进入到k8s集群中的master服务器。

  • 创建secret

kubectl create secret docker-registry 名称 --docker-username=镜像仓库登录用户名 --docker-password=镜像仓库登录密码 --docker-email=镜像仓库访问邮箱 --docker-server=镜像他库地址

kubectl create secret docker-registry regcred --docker-username=admin --docker-password=Test@135 --docker-email=demo@example.com --docker-server=192.168.137.4:9443

  • 查询生成的secret息

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 -d

4 上传镜像

将第2步中创建的demo镜像上传到Harbor仓库中。

4.1 登录 harbor

在包含有demo镜像的服务器,使用docker login 登录

docker login 192.168.137.4:9443 分别输入用户名和密码。

也可以使用如下命令一次输入所有内容:

docker login -u 用户名 -p 用户名密码 Harbor服务器地址

如果拒绝连接,则需要通过如下方法解决。

  • 查找配置文件 find / -name docker.service -type f
  • 修改配置文件 vi /usr/lib/systemd/system/docker.service

在 ExecStart 配置项之后添加 harbor服务器IP地址和端口

--insecure-registry=https://192.168.137.4:9443

  • 重启Docker服务

重新加载配置文件 systemctl daemon-reload

重启docker服务 systemctl restart docker

再重新执行 docker login 命令。

4.2 为镜像打tag

要打tag的目标镜像及标签 docker images

添加标签:

docker tag dockerdemo-1.0.jar:latest 192.168.137.4:9443/demo/dockerdemo:latest

  • dockerdemo-1.0.jar:latest 原镜像名:标签
  • 192.168.137.4:9443/demo/dockerdemo:latest harbor服务器地址(IP:端口)/项目名/新镜像名:标签

重新查看镜像,带有新标签的镜像与原镜像拥有相同的 IMAGE ID。

4.3 上传镜像到 harbor

执行上传命令:

docker push 192.168.137.4:9443/demo/dockerdemo:latest

命令后边的内容为带有harbor服务器IP地址的镜像名和标签。

上传完成后,可以在harbor前端页面上查看,harbor中的镜像文件进行了压缩,其所占用空间要小于本地磁盘。

5 在k8s集群中部署项目

5.1 命令行部署项目

通过在服务器上执行命令,将镜像从docker hub 或 habor 中拉取。

kubectl create deployment demo --image=镜像名

这种方式形式不够灵活,无法进行参数化,不推荐使用。

5.2 yaml文件部署项目

yaml文件是k8s的资源清单文件,可以通过yaml文件修改构建参数。

5.2.1 创建yaml文件

dry-run,没有真正运行项目,而是生成项目运行的yaml配置文件。

代码语言:shell
复制
kubectl create deployment demo \
--image=192.168.137.4:9443/demo/dockerdemo \
--dry-run=client \
--output yaml > demo-deploy.yml

自动生成的yaml文件如下

5.2.2 修改yaml文件

  • 镜像拉取策略

把镜像拉取策略修改为 IfNotPresent,即如果本地有镜像就使用本地镜像,否则拉取harbor中的镜像。

IfNotPresent:在镜像已经存在的情况下,kubelet 将不再去拉取镜像,仅当本地缺失时才从仓库中拉取,默认的镜像拉取策略 Always:每次创建 Pod 都会重新拉取一次镜像 Never:Pod 不会主动拉取这个镜像,仅使用本地镜像。 注意:对于标签为“:latest”的镜像文件,其默认的镜像获取策略即为“Always”;而对于其他标签的镜像,其默认策略则为“IfNotPresent”

代码语言:yaml
复制
containers:
  - image: xxxx/xxxx
    name: xxxx
    imagePullPolicy: IfNotPresent

在 containers 节点下增加 imagePullPolicy 字段。

vi demo-deploy.yml

  • 添加远程docker镜像访问密钥

该密钥名称与 3.5 中保持一致。

imagePullSecrets:name: regcred

5.2.3 使用yaml文件构建 deployment

kubectl apply -f demo-deploy.yml

  • 查看deploy

kubectl get deploy

5.2.4 暴露服务端口

kubectl expose deployment demo --port=8080 --type=NodePort

查看service

kubectl get svc

5.2.5 访问项目

http://NodeIP:NodePort/资源路径

url中输入pod在k8s集群节点的IP地址,及节点服务器对外暴露的端口。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系列目录
  • 1 构建 JDK 镜像
    • 1.1 下载JDK
      • 1.2 制作dockerFile
        • 1.3 构建JDK镜像
          • 1.4 启动容器
          • 2 构建springboot项目镜像
            • 2.1 创建项目
              • 2.2 创建dockerfile
                • 2.3 构建项目镜像
                • 3 安装 harbor
                  • 3.1 下载
                    • 3.2 生成https证书
                      • 3.2.1 生成CA证书
                      • 3.2.2 生成服务器端证书
                      • 3.2.3 生成x509 v3服务文件
                      • 3.2.4 crt转换这cert
                      • 3.2.5 使用该v3.ext文件为 Harbor 主机生成证书
                    • 3.3 安装部署
                      • 3.4 创建项目
                        • 3.5 k8s配置
                        • 4 上传镜像
                          • 4.1 登录 harbor
                            • 4.2 为镜像打tag
                              • 4.3 上传镜像到 harbor
                              • 5 在k8s集群中部署项目
                                • 5.1 命令行部署项目
                                  • 5.2 yaml文件部署项目
                                    • 5.2.1 创建yaml文件
                                    • 5.2.2 修改yaml文件
                                    • 5.2.3 使用yaml文件构建 deployment
                                    • 5.2.4 暴露服务端口
                                    • 5.2.5 访问项目
                                相关产品与服务
                                容器服务
                                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档