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地址,及节点服务器对外暴露的端口。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐