容器编排引擎Kubernetes 10——在k8s集群中部署项目
基于 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
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
- 离线下载 如果在线较慢,需要进入到2.9.0下载页面:https://hub.nuaa.cf/goharbor/harbor/releases/tag/v2.9.0
先将压缩包下载到本地,然后上传到服务器的 /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地址,及节点服务器对外暴露的端口。
更多推荐
所有评论(0)