序文
広く普及しているクラウドコンピューティングエコシステムにおいて、Dockerはそのリリース以来、コンテナ化技術のトレンドをリードしてきました。Dockerは単一のコンテナの管理に非常に適しています。しかし、分散アプリケーションシステムが複数のコンテナで構成されている場合、システムが繰り返し進化するにつれて、使用されるコンテナやコンテナ化されたアプリケーションがますます多くなり、それらは高い同時実行性と高可用性のために数に分割されます。何百もの部品が原因で、管理とレイアウトが非常に困難になる可能性があります。コンテナーをグループ化して、すべてのコンテナーにまたがるネットワーキング、ストレージ、セキュリティ、テレメトリなどのサービスを提供する必要があるため、Kubernetesが登場しました。
Kubernetesの概要
k8sまたは略して「kube」とも呼ばれるKubernetesは、Linuxコンテナ操作を自動的に実装できるオープンソースプラットフォームです。これは、ユーザーがアプリケーションのコンテナー化プロセスで多くの手動のデプロイメントおよび拡張操作を節約するのに役立ちます。つまり、Linuxコンテナを実行するホストの複数のグループをまとめて収集でき、Kubernetesはこれらのクラスタを簡単かつ効率的に管理するのに役立ちます。さらに、これらのクラスターは、パブリック、プライベート、またはハイブリッドクラウド全体にホストを展開できます。したがって、急速な拡張を必要とするクラウドネイティブアプリケーション(Apache Kafkaによるリアルタイムデータストリーム処理など)の場合、Kubernetesは理想的なホスティングプラットフォームです。
SpringBootアプリケーションをK8に公開する従来の方法
SpringBootアプリケーションに関する限り、k8sの技術は成熟し続け、徐々にアプリケーション管理の主流になってきているため、アプリケーションをk8sプラットフォームにリリースする方法には次の手順が必要です。
これらの手順では、チームはDockerイメージとk8s構成機能を構築する機能が必要です。これは実装が面倒であり、Docker構成とk8s構成を個別に管理する必要があります。アプリケーションの公開は、ワンクリックではありません。我々はDevOpsチームをやる、私たちは俊敏性をやると言う、何かを得ることができるよう、継続的インテグレーション、Docker以及k8s都是好技术,但是过于麻烦且不简单的步骤,确实是大部分公司或者项目想转型DevOps的门槛。
および後にjenkins
登場し、自動組立ラインの出現、私は助けることはできませんが、だと思うので第一次工业革命
、本当に生産性の向上を持って、我々は最終的にすべての時間を持っていませんssh
、sftp
、docker build
、kubectl apply
...
初めて自動実行をスクリプト工业革命
に依存するだけで十分ですか?
Docker構成とk8s構成のSpringBootプロジェクト構築の難しさをさらに減らす必要があります。これにより、Dockerイメージの構築とk8sアプリケーションの構築があまり得意でない開発者でも、プロジェクトコマンドのリリースをすばやく実現できます。この時代では、 「第二次産業革命」として。
この時代の鍵となるツールは----Fabric8
Fabric8の概要
私が毎日直面する言葉は、ファブリックはブロックチェーンに従事していることです。githubにアクセスすると、彼に似た友人のFabric8に出会うことがあります。
Fabric8とは何ですか?
Fabric8は、KubernetesとJenkinsに基づくマイクロサービスの継続的なリリースを提供するオープンソースの統合開発プラットフォームです。
ファブリックを使用すると、継続的デリバリーパイプラインを通じてマイクロサービスを簡単に作成、コンパイル、デプロイ、テストし、継続的改善とChatOpsを通じてそれらを実行および管理できます。
Fabric8マイクロサービスプラットフォームは以下を提供します。
-
開発者コンソールは、マイクロサービスを作成、編集、コンパイル、デプロイ、およびテストするための単一のページを提供するリッチWebアプリケーションです。
-
継続的インテグレーションと連続配信使用して、ジェンキンスをしジェンキンスワークフローライブラリより速く、より確実にソフトウェアを提供します。
-
管理の集中管理ロギング、メトリクス、ChatOps、カオスモンキー使って、HawtioとするJolokiaを Javaのコンテナを管理します。
-
Apache Camel統合サービスの詳細な視覚化を備えたサービスとしての統合統合プラットフォーム、すべてのRESTful APIおよびSOAP APIを表示するAPIレジストリ、およびFabric8 MQは、Apache ActiveMQに基づくサービスとしてのメッセージングを提供します。
-
Javaツール
JavaアプリケーションでKubernetesを使用できるようにする
- Kubernetesを操作するためのMavenプラグイン、
这个就是我们今天的主菜
- 統合とシステムテストのKubernetesの内側に簡単にリソースのJUnitとArquillian
- Javaライブラリと、Kubernetesと連携するためのCDI拡張のサポート。
- Kubernetesを操作するためのMavenプラグイン、
テキスト紹介
この記事では、fabric8によって提供されるmavenプラグインに基づいて、pom.xmlファイル構成を介して、Springbootアプリケーションをk8sにすばやく公開します。
練習
環境の準備
システム環境/依存関係 | バージョン | 備考 |
---|---|---|
Ubuntu16.04 | 16.04 | 開発/コンパイル環境システム |
ジャワ | 1.8 | |
SpringBoot | 2.1 | |
メイベン | 3.3.9 | |
k8s | 1.16.1 | |
fabric8-maven-plugin | 4.0.0 | https://github.com/fabric8io/fabric8-maven-plugin |
ドッカー | 18.04 |
エンジニアリング構成
まず第一に、mavenプラグインとしてのfabric8-maven-pluginにはアプリケーションコードの概要がないため、基本的にすべてのSpringbootエンジニアリングアプリケーションは、Mavenプラグイン構成をPOMに直接追加して、k8sに公開するコマンドのアプリケーションを実現できます。
次に、fabric8-maven-pluginのデフォルトの構成方法、xmlベースの構成方法、外部ファイルの構成方法について説明し、Springbootアプリケーションをk8sに直接公開できるようにします。
デフォルトの構成
名前が示すように、デフォルトの設定方法はカスタム処理を行わず、実装は次のとおりです。
- pom.xmlを編集する
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>fabric8-maven-plugin</artifactId>
<version>${fabric8.maven.plugin.version}</version>
<executions>
<execution>
<goals>
<goal>resource</goal>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
-
アプリケーションをk8sに公開する
一般的に私の操作は
mvn fabric8:deploy
次に、ミラーを構築し、アプリケーションをk8sに公開すれば完了です。
以下は、mvnによって実行されるメインログです。
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ test --- [INFO] Building jar: /home/lps/servers/jenkins/workspace/test-pipe1/target/test-2.0.2.RELEASE.jar [INFO] [INFO] --- sofa-ark-maven-plugin:1.1.1:repackage (default-cli) @ test --- [INFO] [INFO] --- spring-boot-maven-plugin:1.4.2.RELEASE:repackage (default) @ test --- [INFO] [INFO] --- fabric8-maven-plugin:4.3.1:build (default) @ test --- [INFO] F8: Pulling from java-alpine-openjdk8-jdk [INFO] F8: Digest: sha256:e8a8e8f5fcd3b545c48ade9ab5716e9414c6f60a60f07a388ff9fafbd [INFO] F8: Status: Downloaded newer image for registry.testdemo.com/java-alpine-openjdk8-jdk:latest [INFO] F8: Pulled registry.testdemo.com/java-alpine-openjdk8-jdk:latest in 588 milliseconds [INFO] Reading assembly descriptor: /home/lps/servers/jenkins/workspace/test-pipe1/src/main/docker/assembly.xml [INFO] Copying files to /home/lps/servers/jenkins/workspace/test-pipe1/target/docker/testdemo/test/2.0.2.RELEASE/build/maven [INFO] Building tar: /home/lps/servers/jenkins/workspace/test-pipe1/target/docker/testdemo/test/2.0.2.RELEASE/tmp/docker-build.tar [INFO] F8: [testdemo/test:2.0.2.RELEASE]: Created docker-build.tar in 2 seconds [INFO] F8: [testdemo/test:2.0.2.RELEASE]: Built image sha256:486a1 [INFO] [INFO] --- maven-install-plugin:2.4:install (default-install) @ test --- [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/test-2.0.2.RELEASE.jar to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE.jar [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/pom.xml to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE.pom [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/classes/META-INF/fabric8/kubernetes.yml to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE-kubernetes.yml [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/classes/META-INF/fabric8/openshift.yml to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE-openshift.yml [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/test-2.0.2.RELEASE-sources.jar to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE-sources.jar [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/classes/META-INF/fabric8/kubernetes.yml to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE-kubernetes.yml [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/classes/META-INF/fabric8/openshift.yml to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE-openshift.yml [INFO] Installing /home/lps/servers/jenkins/workspace/test-pipe1/target/test-2.0.2.RELEASE-sources.jar to /root/.m2/repository/com/testdemo/test/2.0.2.RELEASE/test-2.0.2.RELEASE-sources.jar [INFO] [INFO] <<< fabric8-maven-plugin:4.3.1:deploy (default-cli) < install @ test <<< [INFO] [INFO] [INFO] --- fabric8-maven-plugin:4.3.1:deploy (default-cli) @ test --- [INFO] F8: Using Kubernetes at https://localhost:6443/ in namespace baas-test with manifest /home/lps/servers/jenkins/workspace/test-pipe1/target/classes/META-INF/fabric8/kubernetes.yml [INFO] F8: Using namespace: baas-test [INFO] F8: Using namespace: baas-test [INFO] F8: Updating a Service from kubernetes.yml [INFO] F8: Updated Service: target/fabric8/applyJson/baas-test/service-test.json [INFO] F8: Using namespace: baas-test [INFO] F8: Updating ConfigMap from kubernetes.yml [INFO] F8: Updated ConfigMap: target/fabric8/applyJson/baas-test/configmap-test-config.json [INFO] F8: Using namespace: baas-test [INFO] F8: Updating Deployment from kubernetes.yml [INFO] F8: Updated Deployment: target/fabric8/applyJson/baas-test/deployment-test.json [WARNING] Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring. [INFO] F8: HINT: Use the command `kubectl get pods -w` to watch your pods start up [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
上記のログから、fabric8:deployには実際には次の手順があることがわかります。
上記はデフォルト設定の具体的な動作ですが、pom.xmlを設定してmvnコマンドを実行すると非常に便利です。mvnコマンドの実行はjenkinsに置くことができます。そして、fabric8には3つの基本的なミラー、すなわち:
ミラー名 | 解説 |
---|---|
fabric8 / java-alpine-openjdk8-jdk | java8基本イメージを使用したaplineシステムに基づく |
fabric8 / java-jboss-openjdk8-jdk | java8基本ミラーを備えたjbossシステムに基づく |
fabric8 / java-centos-openjdk8-jdk | centosシステムとjava8基本イメージに基づく |
默认是使用第一个镜像,其他两个以及自定义基础镜像可以通过后面的配置自定义化。
XML構成に基づく
xmlベースの構成方法は主に、前述のように、Dockerイメージの構築とk8sリリースの構成(デプロイメント、サービス、configmap)のカスタマイズを実現することです。アプリケーション構築のベースイメージとして独自のイメージを使用する方法
実装は次のとおりです。
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>fabric8-maven-plugin</artifactId>
<version>${fabric8.maven.plugin.version}</version>
<executions>
<execution>
<goals>
<goal>resource</goal>
<goal>build</goal>
</goals>
</execution>
</executions>
<!-- 自定义配置 -->
<configuration>
<enricher>
<config>
<!-- k8s service 配置 将service开放类型改成NodePort -->
<fmp-service>
<type>NodePort</type>
</fmp-service>
</config>
</enricher>
<images>
<image>
<!-- 自定义镜像名 -->
<name>lps/${project.artifactId}:${project.version}</name>
<build>
<!-- 自定义基础镜像-->
<from>registry.lps.com/fabric-base-jdk8</from>
<!-- 自定义文件发布 比如将项目 a-jarwithdepences.jar发布到镜像目录/deployment / -->
<assembly>
<descriptor>assembly.xml</descriptor>
<targetDir>/deployments</targetDir>
</assembly>
</build>
</image>
</images>
</configuration>
</plugin>
上記で一般的に使用されるいくつかの構成を示します。xml構成の詳細については、https://maven.fabric8.io/#xml-configurationを参照してください。
外部ファイルに基づく設定
外部構成ファイルに基づくのは、src/main/fabric8
ディレクトリにあるYAML構成を使用する外部構成です。
主なプロジェクトカタログは以下の通りです
├── README.md
├── pom.xml
└── src
├── main
│ └── java
│ └── resource
│ └── fabric8
├── service.yml
├── deployment.yml
├── configmap.yml
主に、src/main/fabric8
ディレクトリ内の3つのファイルは、主にk8sデプロイメント、サービス、configmapの構成に対応しています。fabric8-maven-pluginは、ビルド時にこのディレクトリ内のファイルを自動的に読み取り、ファイル定義のパラメーターに従って構成を生成します(プラグイン自体にデフォルトがあります)構成、カスタム構成ではカスタムパーツを変更するだけで、残りは自動的に生成されます)
テンプレートは次のとおりです。
deployment.yml
spec:
replicas: 1
template:
spec:
volumes:
- name: config
gitRepo:
repository: 'https://github.com/jstrachan/sample-springboot-config.git'
revision: 667ee4db6bc842b127825351e5c9bae5a4fb2147
directory: .
containers:
- volumeMounts:
- name: config
mountPath: /app/config
env:
- name: KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
serviceAccount: ribbon
ボリューム、コンテナー、およびserviceAccontの構成は上記でカスタマイズされ、残りの構成はデフォルトのテンプレートに従って生成されます。
この方法で構成のカスタマイズを実現できます。これは、xmlと組み合わせて使用できます。
Fabric8 mvnコマンドの概要
fabric8:build
ビルドイメージ
使用する:
mvn fabric8:build
fabric8:push
プッシュミラー
使用する:
mvn fabric8:push
プライベートウェアハウスにプッシュするには、maven構成ファイルでsettings.xml
ウェアハウスのURLパスワードを構成する必要があります
例
<?xml version="1.0"?>
<settings>
<profiles>
<profile>
<id>mydocker</id>
<properties>
<!-- 配置docker host/仓库地址 通过环境变量获取-->
<docker.registry>${env.DOCKER_REGISTRY}</docker.registry>
<docker.url>${env.DOCKER_HOST}</docker.url>
</properties>
</profile>
</profiles>
<!-- 配置用户名密码 -->
<servers>
<server>
<id>mydocker</id>
<username>jolokia</username>
<password>jolokia</password>
</server>
</servers>
<activeProfiles>
<activeProfile>mydocker</activeProfile>
</activeProfiles>
</settings>
fabric8:deploy
アプリケーションをk8sに公開する
1.環境変数を設定する
export KUBERNETES_TRUST_CERTIFICATES=true \
&& export KUBERNETES_MASTER=${KUBERNETES_MASTER} \
&& export FABRIC8_PROFILES=kubernetes \
&& export DOCKER_HOST=${DOCKER_HOST} \
&& export KUBERNETES_NAMESPACE=${KUBERNETES_NAMESPACE} \
- $ {KUBERNETES_MASTER}:k8sネットワーク内のマスターのAPIアドレス。例:http:// localhost:6443
- $ {DOCKER_HOST}:次のようなDOCKERサービスアドレス:http:// localhost:2375
- $ {KUBERNETES_NAMESPACE}:アプリケーションが公開されているk8の名前空間。例:test
2.コマンドを実行します
mvn fabric8:deploy
fabric8:resource
src/main/fabric8
ディレクトリ内のカスタムymlファイルに従ってk8s構成ファイルを生成します。これは通常、生成されたymlに有効なカスタム構成があるかどうかを確認するために使用されます
mvn fabric8:resource
総括する
fabric8-maven-pluginは、現在、k8sにSpringbootプロジェクトを公開するための最良のソリューションの1つである必要があります。これにより、構成の構築の難しさが大幅に軽減され、Springbootプロジェクトからk8sで実行されているサービスに単一のコマンドでさえ実現できるため、私はそれを強くお勧めします。
より良い計画がある場合は、小さな計画にコメントしてください。