Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

環境設定の概要

親愛なる家族の皆様、必要な yaml ファイルをダウンロードするには、次のリンクにアクセスしてください: http://xiazai.jb51.net/202105/yuanma/javayaml_jb51.rar。

1.K8Sとは何ですか?

K8S は Kubernetes の略で、コンテナ テクノロジーをベースとした新しい主要な分散アーキテクチャ ソリューションです。コンテナ テクノロジーをベースとして、リソース管理を自動化し、複数のデータ センターにわたるリソース使用率を最大化することを目的としています。

システム設計がKubernetesの設計思想に沿っていれば、従来のシステムアーキテクチャにおける、業務とはあまり関係のない基盤コードや機能モジュールをK8Sで管理できます。負荷分散の選択や展開を気にする必要がなくなり、複雑なサービスガバナンスフレームワークの導入や開発を自ら検討する必要もなくなり、サービス監視や障害処理モジュールの開発を気にする必要もなくなります。つまり、Kubernetes が提供するソリューションを使用すると、開発コストが大幅に削減され、ビジネス自体にさらに集中できるようになります。さらに、Kubernetes は強力な自動化メカニズムを提供するため、後続のシステム運用と保守の難易度とコストが大幅に軽減されます。

2. K8S を使用する理由

新興のコンテナ技術である Docker は、多くの企業に導入されています。単一マシンからクラスターへの移行は避けられず、クラウド コンピューティングの急速な発展により、このプロセスが加速しています。 Kubernetes は現在、業界で広く認知され、好まれている唯一の Docker 分散システム ソリューションです。今後数年間で、企業のローカル サーバーで実行されるか、パブリック クラウドでホストされるかに関係なく、多数の新しいシステムがこれを選択することが予測されます。

3. K8S を使用する利点は何ですか?

Kubernetes の使用は、マイクロサービス アーキテクチャの包括的な展開です。マイクロサービス アーキテクチャの中核は、巨大なモノリシック アプリケーションを多数の相互接続された小さなマイクロサービスに分解することです。マイクロサービスは複数のインスタンス コピーによってサポートされ、システム負荷の変化に応じてコピー数を調整できます。組み込みロード バランサは、k8s プラットフォーム内の複数のインスタンス コピーによってサポートされ、システム負荷の変化に応じてコピー数を調整できます。組み込みロード バランサは、k8s プラットフォームで重要な役割を果たします。マイクロサービス アーキテクチャでは、各サービスを専用の開発チームで開発することができ、開発者は開発テクノロジを自由に選択できるため、大規模なチームにとって非常に価値があります。さらに、各マイクロサービスは独立して開発、アップグレード、拡張されるため、システムは非常に安定し、迅速な反復的な進化が可能になります。

4. 環境構成

環境全体の構築には、Docker 環境の構築、docker-compose 環境の構築、K8S クラスターの構築、GitLab コード リポジトリの構築、SVN リポジトリの構築、Jenkins 自動デプロイメント環境の構築、Harbor プライベート リポジトリの構築が含まれます。

このドキュメントでは、環境全体の構築には以下が含まれます。

  • Docker環境をインストールする
  • docker-composeをインストールする
  • K8Sクラスタ環境をインストールする
  • K8S クラスターの再起動によって発生する問題
  • K8Sにingress-nginxをインストールする
  • K8Sはgitlabコードリポジトリをインストールします
  • Harbor専用倉庫を設置する
  • Jenkinsをインストールする
  • 物理マシンに SVN をインストールする (推奨)
  • 物理マシンに Jenkins をインストールする (推奨)
  • Jenkinsの動作環境を構成する
  • Jenkins が Docker プロジェクトを K8S に公開

サーバー計画

IPホスト名ノードオペレーティング·システム
192.168.0.10テスト10 K8SマスターセントOS8.0.1905
192.168.0.11テスト11 K8SワーカーセントOS8.0.1905
192.168.0.12テスト12 K8SワーカーセントOS8.0.1905

設置環境

ソフトウェアタイトルソフトウェアバージョン例示する
ドッカー19.03.8コンテナ環境の提供
docker-compose 1.25.5複数のコンテナで構成されるアプリケーションを定義および実行する
K8S 1.18.2 Kubernetes は、複数のホストに対応したオープンソースのコンテナ化されたアプリケーション管理プラットフォームです。Kubernetes の目標は、コンテナ化されたアプリケーションの展開をシンプルかつ強力にすることです。Kubernetes は、アプリケーションの展開、計画、更新、およびメンテナンスのメカニズムを提供します。
ギットラボ12.1.6コードリポジトリ
1.10.2プライベート画像リポジトリ
ジェンキンス2.222.3継続的インテグレーションデリバリー

Docker環境をインストールする

Docker は、Go 言語をベースにしたオープンソースのアプリケーション コンテナ エンジンであり、Apache 2.0 プロトコルに準拠したオープンソースです。

Docker を使用すると、開発者はアプリケーションと依存パッケージを軽量でポータブルなコンテナーにパッケージ化し、一般的な Linux マシンに公開したり、仮想化を実装したりすることができます。

このドキュメントでは、Docker バージョン 19.03.8 に基づいて Docker 環境を構築します。

すべてのサーバーに install_docker.sh スクリプトを作成します。スクリプトの内容は次のとおりです。

# Alibaba Cloud Mirror Center を使用します export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
#yumツールをインストールします dnf install yum*
#docker環境をインストールします yum install -y yum-utils device-mapper-persistent-data lvm2
#Docker の yum を設定します。source yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#コンテナプラグインをインストールします dnf install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm
#docker バージョン 19.03.8 のインストールを指定します yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8
#Docker を起動するように設定する systemctl enable docker.service
#Dockerを起動する
systemctl で docker.service を起動します。
#Dockerのバージョンを確認するdocker version

各サーバー上の install_docker.sh スクリプトに実行権限を与え、以下のようにスクリプトを実行します。

#install_docker.sh スクリプトに実行権限を付与します chmod a+x ./install_docker.sh
# install_docker.sh スクリプトを実行します ./install_docker.sh

docker-composeをインストールする

Compose は、マルチコンテナ Docker アプリケーションを定義および実行するためのツールです。 Compose では、YML ファイルを使用して、アプリケーションに必要なすべてのサービスを構成します。その後、1 つのコマンドで、YML ファイル構成からすべてのサービスを作成して起動できます。

注: 各サーバーにdocker-composeをインストールします

1. docker-composeファイルをダウンロードする

#docker-composeをダウンロードしてインストールする
curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2. docker-composeファイルに実行権限を与える

#docker-compose に実行権限を与える chmod a+x /usr/local/bin/docker-compose

3. docker-composeのバージョンを確認する

# docker-compose バージョンを表示 [root@binghe ~]# docker-compose バージョン
docker-compose バージョン 1.25.5、ビルド 8a1c60f6
docker-py バージョン: 4.1.0
CPython バージョン: 3.7.5
OpenSSL バージョン: OpenSSL 1.1.0l 2019 年 9 月 10 日

K8Sクラスタ環境をインストールする

Kubernetes は、クラウド プラットフォーム内の複数のホスト上のコンテナ化されたアプリケーションを管理するためのオープン ソース プラットフォームです。Kubernetes の目標は、コンテナ化されたアプリケーションの展開をシンプルかつ強力にすることです。Kubernetes は、アプリケーションの展開、計画、更新、およびメンテナンスのメカニズムを提供します。

このドキュメントはK8Sクラスタを構築するためのK8Sバージョン1.8.12に基づいています

K8S基本環境をインストールする

すべてのサーバーにinstall_k8s.shスクリプトファイルを作成します。スクリプトファイルの内容は次のとおりです。

################### Alibaba Cloud Image Accelerator の開始を構成する##########################
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "レジストリミラー": ["https://zz3sblpi.mirror.aliyuncs.com"]
}
終了
systemctlデーモンリロード
systemctl dockerを再起動します
######################## Alibaba Cloud Mirror Accelerator の設定終了###########################
#nfs-utilsをインストールする
yum インストール -y nfs-utils
#wgetソフトウェアダウンロードコマンドをインストールyum install -y wget

#nfs-serverを起動する
systemctl nfs-serverを起動する
#起動時にnfs-serverが自動的に起動するように設定する systemctl enable nfs-server

#ファイアウォールをシャットダウンする systemctl stop firewalld
#ファイアウォールの起動をキャンセルする systemctl enable firewalld

#SeLinuxを無効にする
強制0を設定する
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# スワップを無効にする
スワップオフ -a
はい | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

###############################/etc/sysctl.conf を変更して起動します##############################
# 設定がある場合は、sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf を変更します
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf
# そうでないかもしれません。echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf を追加してください。
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
エコー "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
エコー "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
エコー "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
エコー "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
###############################/etc/sysctl.conf を変更します終了###############################
# 変更した/etc/sysctl.confファイルを有効にするコマンドを実行します。sysctl -p

#################### K8S の yum ソースの設定を開始します###############################
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[Kubernetes]
名前=Kubernetes
ベースURL=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
有効=1
gpgcheck=0
リポジトリ_gpgcheck=0
gpgkey = http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
終了
################### K8S の yum ソースの設定はこれで終了です#############################

# K8Sの古いバージョンをアンインストールする
yum 削除 -y kubelet kubeadm kubectl

#kubelet、kubeadm、kubectl をインストールします。ここではバージョン 1.18.2 をインストールしました。バージョン 1.17.2 をインストールすることもできます。yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2

# docker Cgroup ドライバーを systemd に変更する
# # /usr/lib/systemd/system/docker.service ファイルのこの行を変更します ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd に変更します
# 変更しないと、ワーカー ノードを追加するときに次のエラーが発生する可能性があります。 # [警告 IsDockerSystemdCheck]: Docker cgroup ドライバーとして「cgroupfs」が検出されました。推奨されるドライバーは「systemd」です。 
# https://kubernetes.io/docs/setup/cri/ のガイドに従ってください。
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service

# docker イメージのダウンロード速度と安定性を向上させるために、docker イメージを設定します # https://hub.docker.io へのアクセス速度が非常に安定している場合は、この手順をスキップすることもできます。通常、設定は必要ありません # curl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR}

# 設定ファイルをリロードする systemctl daemon-reload
#Dockerを再起動
systemctl dockerを再起動します
# 起動時にkubeletを起動するように設定し、kubeletを起動します
systemctl kubelet を有効にする && systemctl kubelet を開始する
# dockerのバージョンを表示する

各サーバーのinstall_k8s.shスクリプトに実行権限を付与し、スクリプトを実行します。

#install_k8s.sh スクリプトに実行権限を付与します chmod a+x ./install_k8s.sh
# install_k8s.sh スクリプトを実行します ./install_k8s.sh

マスターノードを初期化する

操作は test10 サーバー上でのみ実行されます。

1. マスターノードのネットワーク環境を初期化する

注意: 次のコマンドはコマンド ラインで手動で実行する必要があります。

# マスターノードでのみ実行します # エクスポートコマンドは現在のシェルセッションでのみ有効です。新しいシェルウィンドウを開いた後、インストールプロセスを続行する場合は、ここでエクスポートコマンドを再実行してください export MASTER_IP=192.168.0.10
# k8s.masterを希望のdnsNameに置き換えます
APISERVER_NAME=k8s.master をエクスポートします。
# Kubernetes コンテナ グループが配置されているネットワーク セグメント。このネットワーク セグメントは、インストール後に Kubernetes によって作成され、物理ネットワークには事前に存在しません。export POD_SUBNET=172.18.0.1/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

2. マスターノードを初期化する

test10 サーバーに init_master.sh スクリプト ファイルを作成します。ファイルの内容は次のとおりです。

#!/bin/bash
# エラーが発生したらスクリプトを終了する set -e

[ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]の場合;
  echo -e "\033[31;1m環境変数POD_SUBNETとAPISERVER_NAMEが設定されていることを確認してください\033[0m"
  現在の POD_SUBNET=$POD_SUBNET をエコーし​​ます
  現在の APISERVER_NAME=$APISERVER_NAME をエコーし​​ます
  出口1
フィ


# 完全な構成オプションを見る https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
猫 <<EOF > ./kubeadm-config.yaml
APIバージョン: kubeadm.k8s.io/v1beta2
種類: ClusterConfiguration
kubernetesバージョン: v1.18.2
イメージリポジトリ: registry.cn-hangzhou.aliyuncs.com/google_containers
コントロールプレーンエンドポイント: "${APISERVER_NAME}:6443"
ネットワーキング:
  サービスサブネット: "10.96.0.0/16"
  ポッドサブネット: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
終了

# kubeadm を初期化する
# kebeadmを初期化する
kubeadm init --config=kubeadm-config.yaml --upload-certs

# kubectl を設定する
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# calico ネットワーク プラグインをインストールします # ドキュメントを参照してください https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onmises
echo "calico-3.13.1 をインストール"
rm -f カリコ-3.13.1.yaml
https://kuboard.cn/install-script/calico/calico-3.13.1.yaml を取得します。
kubectl を適用 -f calico-3.13.1.yaml

init_master.sh スクリプト ファイルに実行権限を付与し、スクリプトを実行します。

# init_master.sh ファイルに実行権限を付与します chmod a+x ./init_master.sh
# init_master.sh スクリプトを実行します。/init_master.sh

3. マスターノードの初期化結果を確認する

(1)すべてのコンテナグループが実行状態であることを確認する

# 次のコマンドを実行し、すべてのコンテナグループが実行状態になるまで3〜10分待ちます。watch kubectl get pod -n kube-system -o wide

具体的な実装は以下のとおりです。

[root@test10 ~]# kubectl get pod -n kube-system -o wide を監視する
2.0 秒ごとに: kubectl get pod -n kube-system -o wide test10: 2020 年 5 月 10 日日曜日 11:01:32

名前 準備完了 ステータス 再起動 年齢 IP ノード 指名ノード 準備完了 ゲート          
calico-kube-controllers-5b8b769fcd-5dtlp 1/1 実行中 0 118s 172.18.203.66 test10 <なし> <なし>          
calico-node-fnv8g 1/1 実行中 0 118s 192.168.0.10 test10 <なし> <なし>          
coredns-546565776c-27t7h 1/1 実行中 0 2分1秒 172.18.203.67 test10 <なし> <なし>          
coredns-546565776c-hjb8z 1/1 実行中 0 2分1秒 172.18.203.65 test10 <なし> <なし>          
etcd-test10 1/1 実行中 0 2分7秒 192.168.0.10 test10 <なし> <なし>          
kube-apiserver-test10 1/1 実行中 0 2分7秒 192.168.0.10 test10 <なし> <なし>          
kube-controller-manager-test10 1/1 実行中 0 2分7秒 192.168.0.10 test10 <なし> <なし>          
kube-proxy-dvgsr 1/1 実行中 0 2分1秒 192.168.0.10 test10 <なし> <なし>          
kube-scheduler-test10 1/1 実行中 0 2分7秒 192.168.0.10 test10 <なし>

(2)マスターノードの初期化結果を表示する

# マスターノードの初期化結果を表示する kubectl get nodes -o wide

具体的な実装は以下のとおりです。

[root@test10 ~]# kubectl get nodes -o wide
名前 ステータス 役割 年齢 バージョン 内部 IP 外部 IP OS イメージ カーネル バージョン コンテナ ランタイム
test10 マスター準備完了 3m28s v1.18.2 192.168.0.10 <なし> CentOS Linux 8 (Core) 4.18.0-80.el8.x86_64 docker://19.3.8

ワーカーノードの初期化

1. 参加コマンドのパラメータを取得する

マスターノード (test10 サーバー) で次のコマンドを実行して、参加コマンドのパラメータを取得します。

kubeadm トークン作成 --print-join-command

具体的な実装は以下のとおりです。

[root@test10 ~]# kubeadm トークン作成 --print-join-command
W0510 11:04:34.828126 56132 configset.go:202] 警告: kubeadm は API グループのコンポーネント構成を検証できません [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm は k8s.master:6443 に参加します --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d

その中に、次の出力行があります。

kubeadm は k8s.master:6443 に参加します --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d

このコード行は取得された結合コマンドです。

注: join コマンドのトークンは 2 時間有効です。2 時間以内であれば、このトークンを使用して任意の数のワーカー ノードを初期化できます。

2. ワーカーノードを初期化する

すべてのワーカーノードで実行します。ここでは、test11 サーバーと test12 サーバーで実行されます。

コマンドラインで次のコマンドを手動で実行します。

# ワーカーノードでのみ実行されます # 192.168.0.10 はマスターノードのイントラネット IP です
エクスポート MASTER_IP=192.168.0.10
#k8s.masterをマスターノードの初期化時に使用したAPISERVER_NAMEに置き換えます
APISERVER_NAME=k8s.master をエクスポートします。
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

# マスターノード上のkubeadm token createコマンドのjoin出力に置き換えます
kubeadm は k8s.master:6443 に参加します --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d

具体的な実装は以下のとおりです。

[root@test11 ~]# エクスポート MASTER_IP=192.168.0.10
[root@test11 ~]# APISERVER_NAME=k8s.master をエクスポートします
[root@test11 ~]# echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
[root@test11 ~]# kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d 
W0510 11:08:27.709263 42795 join.go:346] [preflight] 警告: コントロール プレーン フラグが設定されていない場合、JoinControlPane.controlPlane 設定は無視されます。
[プリフライト] プリフライトチェックの実行
        [警告 FileExisting-tc]: tc がシステム パスに見つかりません
[プリフライト] クラスターから構成を読み取っています...
[プリフライト] 参考までに: この設定ファイルは 'kubectl -n kube-system get cm kubeadm-config -oyaml' で確認できます。
[kubelet-start] kube-system 名前空間の "kubelet-config-1.18" ConfigMap から kubelet の設定をダウンロードしています
[kubelet-start] kubelet 設定をファイル "/var/lib/kubelet/config.yaml" に書き込みます
[kubelet-start] フラグ付きの kubelet 環境ファイルをファイル "/var/lib/kubelet/kubeadm-flags.env" に書き込みます
[kubelet-start] kubeletの起動
[kubelet-start] kubelet が TLS ブートストラップを実行するのを待機しています...

このノードはクラスターに参加しました:
* 証明書署名要求が apiserver に送信され、応答が受信されました。
* Kubelet に新しい安全な接続の詳細が通知されました。

コントロール プレーンで「kubectl get nodes」を実行して、このノードがクラスターに参加していることを確認します。

出力結果によると、ワーカーノードは K8S クラスターに参加しています。

注: kubeadm join… は、マスター ノード上の kubeadm token create コマンドによる join 出力です。

3. 初期化結果を表示する

初期化結果を表示するには、マスターノード (test10 サーバー) で次のコマンドを実行します。

kubectl ノードを取得 -o ワイド

具体的な実装は以下のとおりです。

[root@test10 ~]# kubectl ノードを取得する
名前 ステータス 役割 年齢 バージョン
test10 レディマスター 20m v1.18.2
test11 準備完了 <なし> 2分46秒 v1.18.2
test12 準備完了 <なし> 2分46秒 v1.18.2

注: kubectl get nodes コマンドの後に -o wide パラメータを追加すると、より多くの情報が出力されます。

K8S クラスターの再起動によって発生する問題

1. ワーカーノードに障害が発生し、起動できない

マスターノードの IP アドレスが変更され、ワー​​カーノードの起動に失敗します。 K8S クラスターを再インストールし、すべてのノードに固定のイントラネット IP アドレスがあることを確認する必要があります。

2. ポッドがクラッシュするか、正常にアクセスできない

サーバーを再起動した後、次のコマンドを使用して Pod の実行ステータスを確認します。

#すべてのポッドの実行ステータスを表示する kubectl get pods --all-namespaces

多くの Pod が実行状態ではないことがわかりました。この時点で、次のコマンドを使用して、正常に実行されていない Pod を削除する必要があります。

kubectl delete pod <ポッド名> -n <ポッド名固有>

注: Deployment や StatefulSet などのコントローラーを使用して Pod が作成された場合、K8S は代わりに新しい Pod を作成し、再起動された Pod は通常は正常に動作します。

このうち、pod-name は K8S で実行されているポッドの名前を示し、pod-namespece は名前空間を示します。たとえば、ポッド名が pod-test で名前空間が pod-test-namespace のポッドを削除する必要がある場合は、次のコマンドを使用できます。

kubectl ポッドを削除します。pod-test -n ポッドテスト名前空間

K8Sにingress-nginxをインストールする

リバースプロキシとして、外部トラフィックをクラスター内にインポートし、Kubernetes 内の Service を外部に公開し、Ingress オブジェクト内のドメイン名で Service を照合することで、ドメイン名でクラスター内のサービスに直接アクセスできるようになります。 traefik と比較すると、nginx-ingress の方がパフォーマンスが優れています。

注: マスターノード(test10サーバーで実行)

1. ingress-nginx名前空間を作成する

ingress-nginx-namespace.yaml ファイルを作成します。主な機能は、ingress-nginx 名前空間を作成することです。ファイルの内容は次のとおりです。

APIバージョン: v1
種類: 名前空間
メタデータ:
  名前: ingress-nginx
  ラベル:
    名前: ingress-nginx

次のコマンドを実行して、ingress-nginx 名前空間を作成します。

kubectl を適用 -f ingress-nginx-namespace.yaml

2. イングレスコントローラをインストールする

ingress-nginx-mandatory.yaml ファイルを作成します。このファイルの主な機能は、ingress-nginx をインストールすることです。ファイルの内容は次のとおりです。

APIバージョン: v1
種類: 名前空間
メタデータ:
  名前: ingress-nginx

---

APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前: default-http-backend
  ラベル:
    app.kubernetes.io/名前: デフォルトのhttp-backend
    app.kubernetes.io/一部: ingress-nginx
  名前空間: ingress-nginx
仕様:
  レプリカ: 1
  セレクタ:
    一致ラベル:
      app.kubernetes.io/名前: デフォルトのhttp-backend
      app.kubernetes.io/一部: ingress-nginx
  テンプレート:
    メタデータ:
      ラベル:
        app.kubernetes.io/名前: デフォルトのhttp-backend
        app.kubernetes.io/一部: ingress-nginx
    仕様:
      終了猶予期間秒数: 60
      コンテナ:
        - 名前: default-http-backend
          # 以下の条件を満たす限り、どのような画像でも許可されます:
          # 1. 404ページが / に表示されます
          # 2. /healthzエンドポイントで200を提供します
          イメージ: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
          ライブネスプローブ:
            httpGet:
              パス: /healthz
              ポート: 8080
              スキーム: HTTP
            初期遅延秒数: 30
            タイムアウト秒数: 5
          ポート:
            - コンテナポート: 8080
          リソース:
            制限:
              CPU: 10m
              メモリ: 20マイル
            リクエスト:
              CPU: 10m
              メモリ: 20マイル

---
APIバージョン: v1
種類: サービス
メタデータ:
  名前: default-http-backend
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: デフォルトのhttp-backend
    app.kubernetes.io/一部: ingress-nginx
仕様:
  ポート:
    - ポート: 80
      ターゲットポート: 8080
  セレクタ:
    app.kubernetes.io/名前: デフォルトのhttp-backend
    app.kubernetes.io/一部: ingress-nginx

---

種類: ConfigMap
APIバージョン: v1
メタデータ:
  名前: nginx-configuration
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx

---

種類: ConfigMap
APIバージョン: v1
メタデータ:
  名前: tcp-services
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx

---

種類: ConfigMap
APIバージョン: v1
メタデータ:
  名前: udp-services
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx

---

APIバージョン: v1
種類: サービスアカウント
メタデータ:
  名前: nginx-ingress-serviceaccount
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx

---
APIバージョン: rbac.authorization.k8s.io/v1beta1
種類: ClusterRole
メタデータ:
  名前: nginx-ingress-clusterrole
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx
ルール:
  -apiグループ:
      - 「」
    リソース:
      - 構成マップ
      - エンドポイント
      - ノード
      - ポッド
      - 秘密
    動詞:
      - リスト
      - 時計
  -apiグループ:
      - 「」
    リソース:
      - ノード
    動詞:
      - 得る
  -apiグループ:
      - 「」
    リソース:
      - サービス
    動詞:
      - 得る
      - リスト
      - 時計
  -apiグループ:
      - 「拡張機能」
    リソース:
      - 入口
    動詞:
      - 得る
      - リスト
      - 時計
  -apiグループ:
      - 「」
    リソース:
      - イベント
    動詞:
      - 作成する
      -パッチ
  -apiグループ:
      - 「拡張機能」
    リソース:
      - 入力/ステータス
    動詞:
      - アップデート

---
APIバージョン: rbac.authorization.k8s.io/v1beta1
種類: 役割
メタデータ:
  名前: nginx-ingress-role
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx
ルール:
  -apiグループ:
      - 「」
    リソース:
      - 構成マップ
      - ポッド
      - 秘密
      - 名前空間
    動詞:
      - 得る
  -apiグループ:
      - 「」
    リソース:
      - 構成マップ
    リソース名:
      # デフォルトは「<election-id>-<ingress-class>」
      # ここでは: "<ingress-controller-leader>-<nginx>"
      # いずれかのパラメータを変更する場合はこれを調整する必要があります
      # nginx-ingress-controller を起動するとき。
      - 「イングレス コントローラー リーダー nginx」
    動詞:
      - 得る
      - アップデート
  -apiグループ:
      - 「」
    リソース:
      - 構成マップ
    動詞:
      - 作成する
  -apiグループ:
      - 「」
    リソース:
      - エンドポイント
    動詞:
      - 得る

---
APIバージョン: rbac.authorization.k8s.io/v1beta1
種類: RoleBinding
メタデータ:
  名前: nginx-ingress-role-nisa-binding
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx
ロールリファレンス:
  apiグループ: rbac.authorization.k8s.io
  種類: 役割
  名前: nginx-ingress-role
科目:
  - 種類: サービスアカウント
    名前: nginx-ingress-serviceaccount
    名前空間: ingress-nginx

---
APIバージョン: rbac.authorization.k8s.io/v1beta1
種類: ClusterRoleBinding
メタデータ:
  名前: nginx-ingress-clusterrole-nisa-binding
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx
ロールリファレンス:
  apiグループ: rbac.authorization.k8s.io
  種類: ClusterRole
  名前: nginx-ingress-clusterrole
科目:
  - 種類: サービスアカウント
    名前: nginx-ingress-serviceaccount
    名前空間: ingress-nginx

---

APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前: nginx-ingress-controller
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx
仕様:
  レプリカ: 1
  セレクタ:
    一致ラベル:
      app.kubernetes.io/名前: ingress-nginx
      app.kubernetes.io/一部: ingress-nginx
  テンプレート:
    メタデータ:
      ラベル:
        app.kubernetes.io/名前: ingress-nginx
        app.kubernetes.io/一部: ingress-nginx
      注釈:
        prometheus.io/ポート: "10254"
        prometheus.io/scrape: "true"
    仕様:
      サービスアカウント名: nginx-ingress-serviceaccount
      コンテナ:
        - 名前: nginx-ingress-controller
          イメージ: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
          引数:
            - /nginx-イングレスコントローラー
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          セキュリティコンテキスト:
            機能:
              落とす:
                - 全て
              追加:
                -NET_BIND_SERVICE
            # wwwデータ -> 33
            実行ユーザー: 33
          環境:
            - 名前: POD_NAME
              値:
                フィールド参照:
                  フィールドパス: metadata.name
            - 名前: POD_NAMESPACE
              値:
                フィールド参照:
                  フィールドパス: metadata.namespace
          ポート:
            - 名前: http
              コンテナポート: 80
            - 名前: https
              コンテナポート: 443
          ライブネスプローブ:
            失敗しきい値: 3
            httpGet:
              パス: /healthz
              ポート: 10254
              スキーム: HTTP
            初期遅延秒数: 10
            期間秒数: 10
            成功しきい値: 1
            タイムアウト秒数: 1
          準備プローブ:
            失敗しきい値: 3
            httpGet:
              パス: /healthz
              ポート: 10254
              スキーム: HTTP
            期間秒数: 10
            成功しきい値: 1
            タイムアウト秒数: 1

---

次のコマンドを実行して、イングレス コントローラーをインストールします。

kubectl を適用 -f ingress-nginx-mandatory.yaml

3. K8S SVCをインストールする: ingress-nginx

主にポッドを公開するために使用されます: nginx-ingress-controller。

次の内容を含む service-nodeport.yaml ファイルを作成します。

APIバージョン: v1
種類: サービス
メタデータ:
  名前: ingress-nginx
  名前空間: ingress-nginx
  ラベル:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx
仕様:
  タイプ: NodePort
  ポート:
    - 名前: http
      ポート: 80
      ターゲットポート: 80
      プロトコル: TCP
      ノードポート: 30080
    - 名前: https
      ポート: 443
      ターゲットポート: 443
      プロトコル: TCP
      ノードポート: 30443
  セレクタ:
    app.kubernetes.io/名前: ingress-nginx
    app.kubernetes.io/一部: ingress-nginx

インストールするには、次のコマンドを実行します。

kubectl を適用 -f サービスノードポート.yaml

4. K8S SVC にアクセス: ingress-nginx

以下に示すように、ingress-nginx 名前空間のデプロイメントを確認します。

[root@test10 k8s]# kubectl get pod -n ingress-nginx
名前 準備完了 ステータス 再起動 年齢
default-http-backend-796ddcd9b-vfmgn 1/1 実行中 1 10h
nginx-ingress-controller-58985cc996-87754 1/1 実行中 2 10 時間

ingress-nginx のポート マッピングを表示するには、コマンド ライン サーバーのコマンド ラインで次のコマンドを入力します。

kubectl get svc -n イングレス-nginx

詳細は以下の通りです。

[root@test10 k8s]# kubectl get svc -n ingress-nginx 
名前 タイプ クラスター IP 外部 IP ポート 年齢
デフォルトhttpバックエンド ClusterIP 10.96.247.2 <なし> 80/TCP 7分3秒
ingress-nginx NodePort 10.96.40.6 <なし> 80:30080/TCP、443:30443/TCP 4分35秒

したがって、以下に示すように、マスターノード (test10 サーバー) の IP アドレスとポート番号 30080 を介して ingress-nginx にアクセスできます。

[root@test10 k8s]# カール 192.168.0.10:30080       
デフォルトのバックエンド - 404

次に示すように、ブラウザで http://192.168.0.10:30080 を開いて ingress-nginx にアクセスすることもできます。

K8Sはgitlabコードリポジトリをインストールします

GitLab は、GitLab Inc. が MIT ライセンスを使用して開発した Web ベースの Git リポジトリ管理ツールであり、Wiki および問題追跡機能を備えています。 Git をコード管理ツールとして使用し、これに基づいて Web サービスを構築します。

注: マスターノード(test10サーバーで実行)

1. k8s-ops名前空間を作成する

k8s-ops 名前空間を作成するために主に使用される k8s-ops-namespace.yaml ファイルを作成します。ファイルの内容は次のとおりです。

APIバージョン: v1
種類: 名前空間
メタデータ:
  名前: k8s-ops
  ラベル:
    名前: k8s-ops

次のコマンドを実行して名前空間を作成します。

kubectl を適用 -f k8s-ops-namespace.yaml

2. gitlab-redisをインストールする

gitlab-redis.yaml ファイルを作成します。ファイルの内容は次のとおりです。

APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前: レディス
  名前空間: k8s-ops
  ラベル:
    名前: レディス
仕様:
  セレクタ:
    一致ラベル:
      名前: レディス
  テンプレート:
    メタデータ:
      名前: レディス
      ラベル:
        名前: レディス
    仕様:
      コンテナ:
      - 名前: redis
        画像: sameersbn/redis
        イメージプルポリシー: IfNotPresent
        ポート:
        - 名前: redis
          コンテナポート: 6379
        ボリュームマウント:
        - マウントパス: /var/lib/redis
          名前: データ
        ライブネスプローブ:
          実行:
            指示:
            - redis-cli
            - ピン
          初期遅延秒数: 30
          タイムアウト秒数: 5
        準備プローブ:
          実行:
            指示:
            - redis-cli
            - ピン
          初期遅延秒数: 10
          タイムアウト秒数: 5
      ボリューム:
      - 名前: データ
        ホストパス:
          パス: /data1/docker/xinsrv/redis

---
APIバージョン: v1
種類: サービス
メタデータ:
  名前: レディス
  名前空間: k8s-ops
  ラベル:
    名前: レディス
仕様:
  ポート:
    - 名前: redis
      ポート: 6379
      ターゲットポート: redis
  セレクタ:
    名前: レディス

まず、コマンドラインで次のコマンドを実行して、/data1/docker/xinsrv/redis ディレクトリを作成します。

mkdir -p /data1/docker/xinsrv/redis

gitlab-redis をインストールするには、次のコマンドを実行します。

kubectl を適用 -f gitlab-redis.yaml

3. gitlab-postgresqlをインストールする

gitlab-postgresql.yaml を作成します。ファイルの内容は次のようになります。

APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前: postgresql
  名前空間: k8s-ops
  ラベル:
    名前: postgresql
仕様:
  セレクタ:
    一致ラベル:
      名前: postgresql
  テンプレート:
    メタデータ:
      名前: postgresql
      ラベル:
        名前: postgresql
    仕様:
      コンテナ:
      - 名前: postgresql
        画像: sameersbn/postgresql
        イメージプルポリシー: IfNotPresent
        環境:
        - 名前: DB_USER
          値: gitlab
        - 名前: DB_PASS
          値: パスワード
        - 名前: DB_NAME
          値: gitlab_production
        - 名前: DB_EXTENSION
          値: pg_trgm
        ポート:
        - 名前: postgres
          コンテナポート: 5432
        ボリュームマウント:
        -マウントパス: /var/lib/postgresql
          名前: データ
        ライブネスプローブ:
          実行:
            指示:
            - pg_isready
            - -h
            - ローカルホスト
            - -う
            - ポストグル
          初期遅延秒数: 30
          タイムアウト秒数: 5
        準備プローブ:
          実行:
            指示:
            - pg_isready
            - -h
            - ローカルホスト
            - -う
            - ポストグレ
          初期遅延秒数: 5
          タイムアウト秒数: 1
      ボリューム:
      - 名前: データ
        ホストパス:
          パス: /data1/docker/xinsrv/postgresql
---
APIバージョン: v1
種類: サービス
メタデータ:
  名前: postgresql
  名前空間: k8s-ops
  ラベル:
    名前: postgresql
仕様:
  ポート:
    - 名前: postgres
      ポート: 5432
      ターゲットポート: postgres
  セレクタ:
    名前: postgresql

まず、以下のコマンドを実行して、/data1/docker/xinsrv/postgresql ディレクトリを作成します。

mkdir -p /data1/docker/xinsrv/postgresql

次に、以下のようにgitlab-postgresqlをインストールします。

kubectl を適用 -f gitlab-postgresql.yaml

4. GitLabをインストールする

(1)ユーザー名とパスワードを設定する

まず、コマンドラインでユーザー名とパスワードを変換するためにbase64エンコードを使用します。この例では、ユーザー名はadmin、パスワードはadmin.1231です。

トランスコーディングは下記に示します。

[root@test10 k8s]# echo -n 'admin' | base64 
YWRtaW4=
[root@test10 k8s]# echo -n 'admin.1231' | base64 
翻訳:

変換されたユーザー名: YWRtaW4= パスワード: YWRtaW4uMTIzMQ==

次に示すように、パスワード文字列などの base64 でエンコードされた文字列をデコードすることもできます。

[root@test10 k8s]# echo 'YWRtaW4uMTIzMQ==' | base64 --decode 
管理者1231

次に、ユーザーが主に GitLab のユーザー名とパスワードを設定するために使用する secret-gitlab.yaml ファイルを作成します。ファイルの内容は次のとおりです。

APIバージョン: v1
種類: 秘密
メタデータ:
  名前空間: k8s-ops
  名前: git-user-pass
タイプ: 不透明
データ:
  ユーザー名: YWRtaW4=
  パスワード: YWRtaW4uMTIzMQ==

設定ファイルの内容を以下のように実行します。

kubectl 作成 -f ./secret-gitlab.yaml

(2)GitLabをインストールする

次の内容を含む gitlab.yaml ファイルを作成します。

APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前: gitlab
  名前空間: k8s-ops
  ラベル:
    名前: gitlab
仕様:
  セレクタ:
    一致ラベル:
      名前: gitlab
  テンプレート:
    メタデータ:
      名前: gitlab
      ラベル:
        名前: gitlab
    仕様:
      コンテナ:
      - 名前: gitlab
        イメージ: sameersbn/gitlab:12.1.6
        イメージプルポリシー: IfNotPresent
        環境:
        - 名前: TZ
          価値: アジア/上海
        - 名前: GITLAB_TIMEZONE
          価値: 北京
        - 名前: GITLAB_SECRETS_DB_KEY_BASE
          値: 長くランダムな英数字の文字列
        - 名前: GITLAB_SECRETS_SECRET_KEY_BASE
          値: 長くランダムな英数字の文字列
        - 名前: GITLAB_SECRETS_OTP_KEY_BASE
          値: 長くランダムな英数字の文字列
        - 名前: GITLAB_ROOT_PASSWORD
          値:
            シークレットキーリファレンス:
              名前: git-user-pass
              キー: パスワード
        - 名前: GITLAB_ROOT_EMAIL
          値: [email protected]
        - 名前: GITLAB_HOST
          値: gitlab.binghe.com
        - 名前: GITLAB_PORT
          値: "80"
        - 名前: GITLAB_SSH_PORT
          値: "30022"
        - 名前: GITLAB_NOTIFY_ON_BROKEN_BUILDS
          値: "true"
        - 名前: GITLAB_NOTIFY_PUSHER
          値: "false"
        - 名前: GITLAB_BACKUP_SCHEDULE
          価値: 毎日
        - 名前: GITLAB_BACKUP_TIME
          値: 01:00
        - 名前: DB_TYPE
          値: postgres
        - 名前: DB_HOST
          値: postgresql
        - 名前: DB_PORT
          値: "5432"
        - 名前: DB_USER
          値: gitlab
        - 名前: DB_PASS
          値: パスワード
        - 名前: DB_NAME
          値: gitlab_production
        - 名前: REDIS_HOST
          値: redis
        - 名前: REDIS_PORT
          値: "6379"
        ポート:
        - 名前: http
          コンテナポート: 80
        - 名前: ssh
          コンテナポート: 22
        ボリュームマウント:
        - マウントパス: /home/git/data
          名前: データ
        ライブネスプローブ:
          httpGet:
            パス: /
            ポート: 80
          初期遅延秒数: 180
          タイムアウト秒数: 5
        準備プローブ:
          httpGet:
            パス: /
            ポート: 80
          初期遅延秒数: 5
          タイムアウト秒数: 1
      ボリューム:
      - 名前: データ
        ホストパス:
          パス: /data1/docker/xinsrv/gitlab
---
APIバージョン: v1
種類: サービス
メタデータ:
  名前: gitlab
  名前空間: k8s-ops
  ラベル:
    名前: gitlab
仕様:
  ポート:
    - 名前: http
      ポート: 80
      ノードポート: 30088
    - 名前: ssh
      ポート: 22
      ターゲットポート: ssh
      ノードポート: 30022
  タイプ: NodePort
  セレクタ:
    名前: gitlab

---
apiバージョン: extensions/v1beta1
種類: イングレス
メタデータ:
  名前: gitlab
  名前空間: k8s-ops
  注釈:
    kubernetes.io/ingress.class: traefik
仕様:
  ルール:
  - ホスト: gitlab.binghe.com
    http:
      パス:
      - バックエンド:
          サービス名: gitlab
          サービスポート: http

注意: GitLab を設定する場合、ホストをリッスンするときに IP アドレスは使用できません。ホスト名またはドメイン名を使用する必要があります。上記の設定では、gitlab.binghe.com というホスト名を使用しています。

コマンドラインで次のコマンドを実行して、/data1/docker/xinsrv/gitlab ディレクトリを作成します。

mkdir -p /data1/docker/xinsrv/gitlab

以下のようにGitLabをインストールします。

kubectl を適用 -f gitlab.yaml

5. インストール完了

以下に示すように、k8s-ops 名前空間のデプロイメントを確認します。

[root@test10 k8s]# kubectl get pod -n k8s-ops
名前 準備完了 ステータス 再起動 年齢
gitlab-7b459db47c-5vk6t 0/1 実行中 0 11秒
postgresql-79567459d7-x52vx 1/1 実行中 0 30分
redis-67f4cdc96c-h5ckz 1/1 実行中 1 10時間

次のコマンドを使用して表示することもできます。

[root@test10 k8s]# kubectl get pod --namespace=k8s-ops
名前 準備完了 ステータス 再起動 年齢
gitlab-7b459db47c-5vk6t 0/1 実行中 0 36秒
postgresql-79567459d7-x52vx 1/1 実行中 0 30分
Redis-67F4CDC96C-H5CKZ 1/1実行1 10H

2つは同じ効果があります。

次に、以下に示すように、gitlabのポートマッピングを確認します。

[root@test10 k8s]#kubectl get svc -n k8s -ops
名前 タイプ クラスター IP 外部 IP ポート 年齢
gitlab nodeport 10.96.153.100 <なし> 80:30088/tcp、22:30022/tcp 2m42s
postgreSQl Clusterip 10.96.203.119 <NOE> 5432/TCP 32M
Redis Clusterip 10.96.107.150 <NOE> 6379/TCP 10H

この時点で、GitLabには、マスターノード(TEST10)のホスト名gitlab.binghe.comおよびポート30088からアクセスできることがわかります。仮想マシンを使用して関連する環境を構築しているため、このマシンの仮想マシンにマッピングされたgitlab.binghe.comにアクセスするときに、ローカルホストファイルを構成し、以下の構成アイテムをローカルホストファイルに追加する必要があります。

192.168.0.10 gitlab.binghe.com

注:Windowsオペレーティングシステムでは、ホストファイルは次のディレクトリにあります。

c:\ windows \ system32 \ drivers \ etc

次に、以下に示すように、リンクhttp://gitlab.binghe.com:30088を介してブラウザのgitlabにアクセスできます。

この時点で、ユーザー名ルートとパスワードadmin.1231を使用してGitLabにログインできます。

注:rootはgitlabのデフォルトスーパーユーザーであるため、ここのユーザー名は管理者ではなくrootです。

この時点で、GitLabのK8Sインストールが完了しました。

ハーバープライベートウェアハウスを設置します

Haborは、VMwareが開発したオープンソースコンテナ画像リポジトリです。実際、Haborは、これらの新しいエンタープライズレベルの機能を実現するために、Dockerレジストリで対応するエンタープライズレベルの拡張機能を作成しました。

注:ここでは、ハーバープライベートウェアハウスはマスターノード(Test10サーバー)にインストールされています。

1.ハーバーのオフラインインストールバージョンをダウンロードします

wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-offline-installer-v1.10.2.tgz

2。ハーバー設置​​パッケージを解凍します

TAR -ZXVF HARBOR-OFFLINE-INSTALLER-V1.10.2.TGZ

減圧が成功した後、サーバーの現在のディレクトリでハーバーディレクトリが生成されます。

3.港を構成します

注:ここでは、港の港を1180に変更しました。港の港を変更しない場合、デフォルトのポートは80です。

(1)Harbor.ymlファイルを変更します

CDハーバー
vim ハーバー.yml

変更された構成アイテムは次のとおりです。

ホスト名:192.168.0.10
http:
  ポート:1180
harbor_admin_password:binghe123
###およびコメントhttps、それ以外の場合、インストール中にエラーが報告されます:エラー:root:エラー:プロトコルはhttpsですが、属性SSL_CERTは設定されていません
#https:
  #port:443
  #証明書: /your/certificate/path
  #private_key: /あなたの/private/key/パス

(2)daemon.jsonファイルを変更します

/etc/docker/daemon.jsonファイルが存在しない場合は、/etc/docker/daemon.jsonファイルに次のコンテンツを追加します。

[root@binghe〜]#cat /etc/docker/daemon.json
{
  「レジストリ・ミラー」:["https://zz3sblpi.mirror.aliyuncs.com"]、
  「Insecure-Registries」:["192.168.0.10:1180"]]
}

サーバー上のIP ADDRコマンドを使用して、ローカルマシンのすべてのIPアドレスセグメントを表示し、/etc/docker/daemon.jsonファイルで構成することもできます。ここで、私の構成後のファイルの内容は次のとおりです。

{
    「レジストリ・ミラー」:["https://zz3sblpi.mirror.aliyuncs.com"]、
    「Insecure-Registries ":[" 192.168.175.0/16"、 "172.17.0.0/16"、 "172.18.0.0/16"、 "172.16.29.0/16"、 "192.168.0.10:1180" "]
}

4.港を設置して開始します

構成が完了したら、次のコマンドを入力してインストールして港を開始します

[root@binghe Harbor]#./install.sh 

5.ログインして港にログインしてアカウントを追加します

インストールが成功したら、ブラウザアドレスバーにhttp://192.168.0.10:1180を入力してリンクを開き、ユーザー名管理とパスワードBinghe123を入力し、システムにログインします。

次に、ユーザー管理を選択し、管理者アカウントを追加して、Docker画像の後続のパッケージとDocker画像のアップロードに向けて準備します。

パスワードはbinghe123です。 [OK]をクリックしてください。アカウントは、この時点では、[管理者として設定]をクリックします。

この時点で、Bingheアカウントは管理者として設定されています。この時点で、港の設置が完了しました。

6.ハーバーポートを変更します

港を設置した後、港の港を変更する必要がある場合は、以下の手順に従って港を変更することができます。

(1)Harbor.ymlファイルを変更します

CDハーバー
vim ハーバー.yml

変更された構成項目を以下に示します。

ホスト名:192.168.0.10
http:
  ポート:1180
harbor_admin_password:binghe123
###およびコメントhttps、それ以外の場合、インストール中にエラーが報告されます:エラー:root:エラー:プロトコルはhttpsですが、属性SSL_CERTは設定されていません
#https:
  #port:443
  #証明書: /your/certificate/path
  #private_key: /あなたの/private/key/パス

(2)docker-compose.ymlファイルを変更します

Vim Docker-Compose.yml

変更された構成項目を以下に示します。

ポート:
      - 1180:80

(3)config.ymlファイルを変更します

CD共通/config/レジストリ
VIM config.yml

変更された構成項目を以下に示します。

レルム:http:///192.168.0.10:1180/service/token

(4)Dockerを再起動します

systemctlデーモンリロード
systemctl docker.service を再起動します。

(5)港を再起動します

[root@binghe harbor] #docker-compose down
港湾ログを停止しています...完了
nginx を削除しています...完了
港湾ポータルを削除しています...完了
harbor-jobservice を削除しています...完了
ハーバーコアを削除しています...完了
redis を削除しています...完了
レジストリを削除しています...完了
registryctl を削除しています...完了しました
harbor-db を削除しています...完了
港のログを削除しています...完了
ネットワークharbor_harborの削除
 
[root@binghe Harbor]#./prepare
準備ベースディレクトリは/mnt/harborに設定されます
設定ファイルをクリアする: /config/log/logrotate.conf
設定ファイルをクリアする: /config/nginx/nginx.conf
設定ファイルをクリアする: /config/core/env
設定ファイルをクリアする: /config/core/app.conf
設定ファイルをクリアする: /config/registry/root.crt
設定ファイルをクリアする: /config/registry/config.yml
設定ファイルをクリアする: /config/registryctl/env
設定ファイルをクリアする: /config/registryctl/config.yml
設定ファイルをクリアする: /config/db/env
設定ファイルをクリアする: /config/jobservice/env
設定ファイルをクリアする: /config/jobservice/config.yml
生成された設定ファイル: /config/log/logrotate.conf
生成された設定ファイル: /config/nginx/nginx.conf
生成された設定ファイル: /config/core/env
生成された構成ファイル: /config/core/app.conf
生成された構成ファイル: /config/registry/config.yml
生成された設定ファイル: /config/registryctl/env
生成された構成ファイル: /config/db/env
生成された構成ファイル: /config/jobservice/env
生成された構成ファイル: /config/jobservice/config.yml
ファイルからシークレットをロードしました: /secret/keys/secretkey
生成された構成ファイル: /compose_location/docker-compose.yml
入力ディレクトリをクリーンアップする
 
[root@binghe Harbor] #docker -compose up -d
デフォルトのドライバーでネットワーク「harbor_harbor」を作成します
港ログを作成中...完了
harbor-db を作成しています...完了
redis を作成しています...完了
レジストリを作成しています...完了
registryctl を作成しています...完了しました
ハーバーコアを作成中...完了
harbor-jobservice を作成しています...完了
港湾ポータルを作成中...完了
nginx を作成しています...完了
 
[root@binghe harbor] #docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート

Jenkins(一般的な慣行)をインストールする

Jenkinsは、Hudsonから生まれたフレンドリーな操作インターフェイスを提供するオープンソースの連続統合(CI)ツールです。 JenkinsはJavaで書かれており、Tomcatなどの人気のあるサーブレットコンテナや独立して実行できます。通常、バージョン管理ツール(SCM)とビルドツールと組み合わせて使用​​されます。一般的なバージョン制御ツールにはSVNとGITが含まれ、構造ツールにはMaven、Ant、Gradleが含まれます。

1. NFSをインストールします(以前にインストールしたことがある場合は、この手順を省略できます)

NFSの最大の問題は、Kubernetesのセキュリティコンテスト/Runasuserを使用して、JenkinsコンテナのJenkinsのユーザーを指定できます。簡単にするために、すべてのユーザーが書くことができます。

NFSが以前にインストールされていた場合、このステップは省略できます。ホストを見つけて、NFSをインストールしてください。

NFSをインストールして起動するには、コマンドラインに次のコマンドを入力します。

yumインストールnfs -utils -y
Systemctlはnfs-serverを開始します
systemctl nfs-serverを有効にします

2。NFS共有ディレクトリを作成します

以下に示すように、マスターノード(TEST10サーバー)のNFSの共有ディレクトリとして/opt/nfs/jenkins-dataディレクトリを作成します。

mkdir -p/opt/nfs/jenkins -data

次に、以下に示すように /etc /exportsファイルを編集します。

vim /etc/エクスポート

/etc /exportsファイルに次の構成行を追加します。

/opt/nfs/jenkins-data 192.168.175.0/24(rw、all_squash)

ここでは、Kubernetes /opt/nfs/jenkins-dataノードall_squash IP範囲を使用します。

このオプションは、ユーザーのUIDが標準化されていないため、多くのマシンで異なりますが、共有ディレクトリに許可を書き込む場合は非常に効果的です。

次に、以下に示すように、 /opt/nfs/jenkins-dataディレクトリを承認し、NFSをリロードします。

#chown -r 1000/opt/nfs/jenkins -data/
#reload nfs-server
SystemCtl RELOAD NFS-SERVER

次のコマンドを使用して、K8Sクラスターのノードで確認してください。

#View Directory NFS System ShowMount -E NFS_IPの権限

あなたが/opt/nfs/jenkins-dataを見ることができる場合、それは大丈夫です。

詳細を以下に示します。

[root@test10〜] #showmount -e 192.168.0.10
192.168.0.10のエクスポートリスト:
/opt/nfs/jenkins-data 192.168.175.0/24

[root@test11〜] #showmount -e 192.168.0.10
192.168.0.10のエクスポートリスト:
/opt/nfs/jenkins-data 192.168.175.0/24

3. PVを作成します

実際、Jenkinsは対応するディレクトリを読み込むことで以前のデータを読み取ることができますが、展開はストレージボリュームを定義できないため、StateFulsetのみを使用できます。

まず、PVを作成するたびに、PVはPVCバインディングに使用されるためにPVを使用して作成されます。

Jenkins-Pv.yamlファイルを作成すると、ファイルの内容は次のとおりです。

APIバージョン: v1
種類:PersistentVolume
メタデータ:
  名前:ジェンキンス
仕様:
  NFS:
    パス:/opt/nfs/jenkins-data
    サーバー:192.168.0.10
  AccessModes:["readwriteonce"]
  容量:
    ストレージ:1ti

ここでは、1Tのストレージスペースを提供しました。これは、実際の構成に従って構成できます。

次のコマンドを実行して、PVを作成します。

kubectl apply -f jenkins -pv.yaml

4. ServiceAcCountを作成します

Jenkinsが奴隷を動的に作成できる必要があるため、サービスアカウントを作成するため、いくつかの許可が必要です。

Jenkins-Service-Account.yamlファイルを作成すると、ファイルの内容は次のとおりです。

APIバージョン: v1
種類: サービスアカウント
メタデータ:
  名前:ジェンキンス

---
種類: 役割
APIバージョン: rbac.authorization.k8s.io/v1beta1
メタデータ:
  名前:ジェンキンス
ルール:
   -  apigroups:[""]
    リソース:["Pods"]
    動詞:["create"、 "delete"、 "get"、 "list"、 "patch"、 "update"、 "watch"]]
   -  apigroups:[""]
    リソース:["Pods/Exec"]
    動詞:["create"、 "delete"、 "get"、 "list"、 "patch"、 "update"、 "watch"]]
   -  apigroups:[""]
    リソース:["pods/log"]
    動詞:["get"、 "list"、 "watch"]
   -  apigroups:[""]
    リソース:["Secrets"]
    動詞:["get"]

---
APIバージョン: rbac.authorization.k8s.io/v1beta1
種類: RoleBinding
メタデータ:
  名前:ジェンキンス
ロールリファレンス:
  apiグループ: rbac.authorization.k8s.io
  種類: 役割
  名前:ジェンキンス
科目:
  - 種類: サービスアカウント
    名前:ジェンキンス

上記の構成では、ロールバインディングとServiceAcCountが作成され、ロールバインディングの権限がこのユーザーにバインドされます。したがって、JenkinsコンテナはこのServiceAcCountを使用して実行する必要があります。そうしないと、ロールバインディングの権限がありません。

ジェンキンスは奴隷を作成して削除する必要があるため、ロールバインディングの許可は理解しやすいため、上記の許可が必要です。秘密の許可に関しては、それはHTTPS証明書です。

次のコマンドを実行して、ServiceAcCountを作成します。

kubectl apply -f jenkins-service-account.yaml 

5。Jenkinsをインストールします

jenkins-statefulset.yamlファイルを作成すると、ファイルの内容は次のとおりです。

APIバージョン: アプリ/v1
種類: ステートフルセット
メタデータ:
  名前:ジェンキンス
  ラベル:
    名前:ジェンキンス
仕様:
  セレクタ:
    一致ラベル:
      名前:ジェンキンス
  Servicename:ジェンキンス
  レプリカ: 1
  Updatestrategy:
    タイプ: ローリングアップデート
  テンプレート:
    メタデータ:
      名前:ジェンキンス
      ラベル:
        名前:ジェンキンス
    仕様:
      TerminationGracePerioDSeconds:10
      ServiceAcCountName:Jenkins
      コンテナ:
         - 名前:ジェンキンス
          画像:docker.io/jenkins/jenkins:lts
          イメージプルポリシー: IfNotPresent
          ポート:
            -containerport:8080
            -containerport:32100
          リソース:
            制限:
              CPU:4
              メモリ:4GI
            リクエスト:
              CPU:4
              メモリ:4GI
          環境:
             - 名前:limits_memory
              値:
                ResourceFieldref:
                  リソース:Limits.Memory
                  除数:1mi
             - 名前:java_opts
              #値:-xx:+lockexperimentalvmoptions -xx:+usecgroupmemorylimitforheap -xx:maxramfraction = 1 -xshowsettings:vm -dhudson.slaves.nodeprovisioner.initialdelay = 0 -dhudson.nodeprovision.slaves.nodeprovision. rovisioner.margin0 = 0.85
              値:-xmx $(limits_memory)m -xshowsettings:vm -dhudson.slaves.nodeprovisioner.initialdelay = 0 -dhudson.slaves.nodeprovisioner.margin = 50 -dhudson.slaves.nodeprovision.margin0 = 0.85
          ボリュームマウント:
             - 名前:Jenkins-Home
              MountPath: /var /jenkins_home
          ライブネスプローブ:
            httpGet:
              パス: /ログイン
              ポート: 8080
            InitialDelayseconds:60
            タイムアウトセカンド:5
            FailureThreshold:12#〜2分
          準備プローブ:
            httpGet:
              パス: /ログイン
              ポート: 8080
            InitialDelayseconds:60
            タイムアウトセカンド:5
            FailureThreshold:12#〜2分
  #PVCテンプレート、以前のPVに対応しています
  volumeclaimtemplates:
     - メタデータ:
        名前:Jenkins-Home
      仕様:
        AccessModes:["readwriteonce"]
        リソース:
          リクエスト:
            ストレージ:1ti

Jenkinsを展開するときは、レプリカに注意する必要があります。ここでは、1つのコピーのみを使用したため、前にPVを1つだけ作成しました。

次のコマンドを使用して、Jenkinsをインストールします。

kubectl apply -f jenkins -statefulset.yaml 

6.サービスを作成します

主にjenkinsを背景に実行するために使用されるJenkins-service.yamlファイルを作成すると、ファイルのコンテンツは次のとおりです。

APIバージョン: v1
種類: サービス
メタデータ:
  名前:ジェンキンス
仕様:
  #タイプ:LoadBalancer
  セレクタ:
    名前:ジェンキンス
  #ロードバランサーを使用するときに無効なパン粉の問題を回避するために、クライアントIPが伝播されていることを確認します(K8S> = 1.7)
  #externaltrafficpolicy:ローカル
  ポート:
    - 名前: http
      ポート: 80
      nodeport:31888
      ターゲットポート:8080
      プロトコル: TCP
     - 名前:Jenkins-Agent
      ポート:32100
      nodeport:32100
      ターゲットポート:32100
      プロトコル: TCP
  タイプ: NodePort

次のコマンドを使用してサービスをインストールします。

kubectl apply -f jenkins-service.yaml

7.イングレスをインストールします

JenkinsのWebインターフェイスには、クラスターの外側からアクセスする必要があります。ここでは、Ingressを使用することを選択します。 jenkins-ingress.yamlファイルを作成すると、ファイルの内容は次のとおりです。

apiバージョン: extensions/v1beta1
種類: イングレス
メタデータ:
  名前:ジェンキンス
仕様:
  ルール:
    -HTTP:
        パス:
          - パス:​​ /
            バックエンド:
              Servicename:ジェンキンス
              ServicePort:31888
      ホスト:jekins.binghe.com

ここでは、以下に示すように、ホストをドメイン名またはホスト名として構成する必要があることに注意する必要があります。

イングレス「ジェンキンス」は無効です:spec.rules [0] .host:無効な値: "192.168.0.10":IPアドレスではなくDNS名でなければなりません

次のコマンドを使用して、Ingressをインストールします。

kubectl apply -f jenkins-ingress.yaml 

最後に、仮想マシンを使用して関連環境を構築するため、Virtual MachineによってマッピングされたJekins.binghe.comにアクセスするときに、マシンのホストファイルを構成し、マシンのホストファイルに次の構成アイテムを追加する必要があります。

192.168.0.10 jekins.binghe.com

注:Windowsオペレーティングシステムでは、ホストファイルが配置されているディレクトリは次のとおりです。

c:\ windows \ system32 \ drivers \ etc

次に、リンクを介してjekinsにアクセスできます:http://jekins.binghe.com:31888ブラウザで。

物理マシンの設置SVN

Apache Subversionは、2000年にCollabnet Incによって開発されたSVNとしてしばしば省略されており、現在はApache Software Foundationのプロジェクトに成長し、開発者とユーザーの豊富なコミュニティの一部です。

RCSおよびCVSと比較して、SVNはブランチ管理システムを採用しており、その設計目標はCVSを置き換えることです。インターネット上の無料版制御サービスは、主に転覆に基づいています。

ここでは、例としてマスターノード(Binghe101サーバー)にSVNをインストールします。

1. yumを使用してSVNをインストールします

コマンドラインで次のコマンドを実行して、SVNをインストールします。

yum -y subversionをインストールします 

2。SVNライブラリを作成します

次のコマンドを順番に実行します。

#create/data/svn
mkdir -p /data /svn 
#initialize svn
svnserve -d -r /data /svn
#コードリポジトリsvnadmin create/data/svn/testを作成します

3。svnを構成します

mkdir/data/svn/conf
cp/data/svn/test/conf/*/data/svn/conf/
cd/data/svn/conf/
[root@binghe101 conf]#ll
総投与量20
-RW-R  -  R-- 1ルートルート1080 5月12日02:17 AUTHZ
-RW-R  -  R-- 1ルートルート885 5月12日02:17 HOOKS-ENV.TMPL
-rw-r  -  r-- 1ルートルート309 5月12日02:17 passwd
-RW-R  -  R-- 1ルートルート4375 5月12日02:17 SVNSERVE.CONF

authzファイルを構成し、

vim authz

構成コンテンツを以下に示します。

[エイリアス]
#joe =/c = xz/st = dessert/l = snake city/o = senake oil、ltd

[グループ]
#harry_and_sally =ハリー、サリー
#harry_sally_and_joe =ハリー、サリー、ジョー
superadmin = admin
binghe = admin、binghe

#[/foo/bar]
#harry = rw
#&joe = r
# * =

#[リポジトリ:/baz/fuz]
#@harry_and_sally = rw
# * = r

[テスト:/]
@superadmin = rw
@binghe = rw

passwdファイルを構成します

vim passwd

構成コンテンツを以下に示します。

[ユーザー]
#harry = harrysecret
#sally = sallyssecret
admin = admin123
binghe = binghe123

svnserve.confを構成します

vim svnserve.conf

構成されたファイルを以下に示します。

###このファイルは、svnserveデーモンの構成を制御します。
###このリポジトリへのアクセスを許可します
### http:and/or file:urlsを介したアクセス、このファイルは
###無関係です。)

###詳細については、http://subversion.apache.org/をご覧ください。

[一般的な]
### Anon-AccessおよびAuth-Accessオプションを制御するアクセス
### Unauthenticated(別名匿名)ユーザーのリポジトリ
###それぞれ認証ユーザー。
###有効な値は「書き込み」、「読み取り」、および「なし」です。
###値を「なし」に設定すると、読み書きの両方を禁止します。
### "read"を使用すると、読み取り専用アクセスが可能になり、「書き込み」は完全になります 
###リポジトリへの読み取り/書き込みアクセス。
###以下のサンプル設定はデフォルトであり、匿名であることを指定します
###ユーザーはリポジトリへの読み取り専用アクセスを持っていますが、認証されています
###ユーザーはリポジトリへの読み取りおよび書き込みアクセスを持っています。
anon-access = none
auth-access =書き込み
###パスワードdbオプションはパスワードの場所を制御します
###データベースファイル。
###ファイルの場所は、含まれるディレクトリに関連しています
###この構成ファイル。
### SASLが有効になっている場合(以下を参照)、このファイルは使用されません。
###以下の行を除外して、デフォルトのパスワードファイルを使用します。
Password-db =/data/svn/conf/passwd
### authz-dbオプションは承認の場所を制御します
###パスを指定しない限り
### A /で始まる、ファイルの場所は
###このファイルを含むディレクトリ
### Repository相対URL(^/)または絶対file:// urlへのテキストへ
### subversionリポジトリのファイル。
###パスベースのアクセス制御は行われていません。
###以下の行を除外して、デフォルトの承認ファイルを使用します。
authz-db =/data/svn/conf/authz
###グループ-DBオプションは、ファイルの場所をで制御します
###グループの定義とグループを維持することを可能にします
###承認ルール。
### authz-dbファイルと、
###グループの定義が有効になっている場合、authz-dbファイルはできません
###は[グループ]セクションを含めます
### a /、ファイルの場所はこれを含むディレクトリに関連しています
###ファイル。
### subversionリポジトリ内のテキストファイルへの絶対ファイル:// url。
###このオプションはデフォルトでは使用されていません。
#グループdb =グループ
###このオプションは、リポジトリの認証領域を指定します。
### 2つのリポジトリが同じ認証領域を持っている場合、彼らはそうする必要があります
###は同じパスワードデータベースを持っています
###はリポジトリのUUIDです。
Realm = svn
### Force-Username-Caseオプションにより、SVNServeがケースナルス化されます
### usersNamesを承認ルールと比較する前に
###上記のauthz-dbファイルは「上」です。
###ケースのユーザー名)、 "lower"(ユーザー名を小文字にする)、および
### "none"(as-as-as as as as as as as as as as as-canse nowを比較するには、
###はデフォルトの動作です)。
#force-username-case = none
###フック-ENVオプションフックスクリプト環境へのパスを指定します 
###構成ファイル
###と複数のフックスクリプト環境を構成するために使用できます 
###絶対パスが指定されている場合、単一のファイルのリポジトリ。
###絶対パスを指定しない限り、ファイルの場所は相対的です
###このファイルを含むディレクトリへ。
#hooks-env = hooks-env

[SASL]
###このオプションは、Cyrus SASLを使用するかどうかを指定します
###認証のためのライブラリはfalseです。
###このオプションを有効にするには、SVNServeがCyrusで構築される必要があります
### saslサポート、「svnserve」をチェックして、ラインを探します
###「Cyrus SASL認証が利用可能です。」
#use-sasl = true
###これらのオプションは、セキュリティレイヤーの目的の強度を指定します
### SASLが提供したいということは、暗号化を意味しません
### Integrity-Checkingのみ、1を超える値は相関しています
暗号化の有効キー長に###(例えば128は128ビットを意味します
### Encryption)。
#min-encryption = 0
#max-encryption = 256

次に、/data/svn/confディレクトリのsvnserve.confファイルを/data/svn/test/conf/directoryにコピーします。下記の通りです。

[root@binghe101 conf]#cp /data/svn/conf/svnserve.conf/data/svn/test/conf/
cp:それは無効にされていますか?/data/svn/test/conf/svnserve.conf '?ええ

4。SVNサービスを開始します

(1)svnserve.serviceサービスを作成します

svnserve.serviceファイルを作成します

vim/usr/lib/systemd/system/svnserve.service

ファイルの内容を以下に示します。

[ユニット]
説明= Subversion Protocol Daemon
after = syslog.target network.target
ドキュメンテーション=男:svnserve(8)

[サービス]
タイプ=フォーク
環境file =/etc/sysconfig/svnserve
#execstart =/usr/bin/svnserve  -  daemon  -  pid-file =/run/svnserve/svnserve.pid $ options
execStart =/usr/bin/svnserve  -  daemon $ options
privatetmp =はい

[インストール]
WantedBy=マルチユーザー.ターゲット

次に、次のコマンドを実行して、構成を有効にします。

systemctlデーモンリロード

コマンドの実行が成功したら、/etc/sysconfig/svnserveファイルを変更します。

vim/etc/sysconfig/svnserve

変更されたファイルの内容は次のとおりです。

#オプションは、コマンドライン引数をsvnserveに渡すために使用されます。
# 
#-rパラメーターでリポジトリの場所を指定します。
options = "-r /data /svn"

(2)SVNを開始します

以下に示すように、最初にSVNステータスを確認してください。

[root@test10 conf] #SystemCtlステータスsvnserve.Service
●SVNSERVE.Service -Subversion Protocol Daemon
   ロード:ロード:(/usr/lib/systemd/system/svnserve.service; disabled; vendor preset:disabled)
   アクティブ: 非アクティブ (デッド)
     docs:man:svnserve(8)

この時点でSVNが開始されていないことがわかり、次にSVNを開始する必要があります。

Systemctl Start SvnServe.Service

SVNサービスを自動的に開始するように設定します。

SystemCtl enable svnserve.service

次に、TortoiseSVNをダウンロードしてインストールし、リンクsvn://192.168.0.10/testを入力し、ユーザー名BingheとパスワードBinghe123を入力してSVNに接続できます。

DockerインストールSVN

SVN画像を引っ張ります

docker pull docker.io/elleflorio/svn-server

SVNコンテナを起動します

docker run -V/usr/local/svn:/home/svn -v/usr/svn/passwd:/etc/subversion/passwd -v/usr/local/apache2  -  name svn_server -p 3380:80 -p 3690 Ver

SVNコンテナを入力します

docker exec -it svn_server bash

コンテナを入力した後、物理マシンによるSVNを設置する方法を参照して、SVNウェアハウスを構成できます。

物理マシンの設置ジェンキンス

注:Jenkinsをインストールする前に、JDKとMavenをインストールする必要があります。

1.ジェンキンス図書館をenableします

次のコマンドを実行して、レポファイルをダウンロードし、GPGキーをインポートします。

wget -o/etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
rpm -import https://jenkins-ci.org/redhat/jenkins-ci.org.key

2。Jenkinsをインストールします

次のコマンドを実行してJenkisをインストールします。

YumインストールJenkins

次に、以下に示すように、Jenkinsのデフォルトポートを変更します。

vim/etc/sysconfig/jenkins

変更された2つの構成を以下に示します。

jenkins_java_cmd = "/usr/local/jdk1.8.0_212/bin/java"
jenkins_port = "18080"

この時点で、ジェンキンスの港は8080から18080に変更されました

3. Jenkinsを起動する

ジェンキンスを開始するには、コマンドラインに次のコマンドを入力します。

SystemctlはJenkinsを開始します

Jenkinsを自動的に起動するように構成します。

systemctl enable jenkins

Jenkinsの実行ステータスを確認してください。

[root@test10〜] #SystemCtlステータスJenkins
●Jenkins.Service -LSB:Jenkins Automation Server
   読み込まれた:loaded(/etc/rc.d/init.d/jenkins; generated)
   アクティブ:2020-05-12 04:33:40 EDT以降
     ドキュメント:Man:SystemD-Sysv-Generator(8)
    タスク:71(制限:26213)
   メモリ:550.8m

説明:ジェンキンスは正常に開始しました。

Jenkinsランニング環境を構成します

1。ジェンキンスにログインします

最初のインストールの後、Jenkinsの実行環境を構成する必要があります。まず、ブラウザアドレスバーにリンクhttp://192.168.0.10:18080にアクセスし、Jenkinsインターフェイスを開きます。

プロンプトに従って、以下に示すように、次のコマンドを使用してサーバー上のパスワード値を見つけます。

[root@binghe101〜]
71AF861C2AB948A1B6EFC9F7DDE90776

パスワード71AF861C2AB948A1B6EFC9F7DDE90776をテキストボックスにコピーし、[続行]をクリックします。以下に示すように、カスタムJenkinsページにジャンプします。

ここでは、「推奨プラグインのインストール」を直接選択できます。次に、以下に示すように、プラグインがインストールされているページにジャンプします。

この手順はダウンロードに失敗する可能性があり、直接無視できます。

2。プラグインをインストールします

インストールするプラグイン

  • Kubernetes CLIプラグイン:このプラグインは、Kubernetesコマンドラインを使用してJenkinsで直接操作できます。
  • Kubernetesプラグイン:Kubernetesを使用すると、プラグインKubernetesをインストールする必要があります
  • 継続的な展開プラグイン:Kubernetesデプロイメントプラグインは、必要に応じて使用できます

より多くのプラグインがあります。[システム管理]をクリックして、それらを管理して追加し、対応するDockerプラグイン、SSHプラグイン、およびMavenプラグインをインストールできます。必要に応じて、他のプラグインをインストールできます。下の図の通りです。

3.ジェンキンスを構成します

(1)JDKとMavenを構成します

以下に示すように、グローバルツール構成でJDKとMavenを構成するには、グローバルツール構成インターフェイスを開きます。

次に、JDKとMavenの構成を開始します。

以下の図に示すように、Mavenをサーバーに/usr/local/maven-3.6.3ディレクトリにインストールしたため、「Maven Configuration」で設定する必要があります。

次に、以下に示すようにJDKを構成します。

注:「自動的にインストール」を確認しないでください

次に、以下に示すようにMavenを構成します。

注:「自動的にインストール」を確認しないでください

(2)SSHを構成します

以下に示すように、SSHを構成するには、Jenkinsの構成システムインターフェイスを入力します。

構成用のSSHリモートホストを見つけます。

構成が完了したら、[接続]チェックボタンをクリックすると、成功した接続が表示されます。下記の通りです。

この時点で、ジェンキンスの基本的な構成が完了します。

Jenkinsは、DockerプロジェクトをK8Sクラスターにリリースします

1.スプリングブートプロジェクトの構成を調整します

実装:以下に示すように、SpringbootプロジェクトにスプリングブートプロジェクトにあるモジュールのPOM.xmlは、Docker画像にパッケージ化するために導入する必要があります。

 <プロパティ>
  	 	<docker.Repostory> 192.168.0.10:1180 </docker.repostory>
        <docker.registry.name> test </docker.registry.name>
        <docker.image.tag> 1.0.0 </docker.image.tag>
        <docker.maven.plugin.version> 1.4.10 </docker.maven.plugin.version>
  </プロパティ>

<ビルド>
  		<FinalName> test-starter </finalName>
		<プラグイン>
            <プラグイン>
			    <groupId>org.springframework.boot</groupId>
			    <artifactId>spring-boot-maven-plugin</artifactId>
			</プラグイン>
			
			<! -  Docker's Mavenプラグイン、公式ウェブサイト:https://github.com/spotify/docker-maven-plugin->
			<!-- Dockerfile Maven プラグイン -->
			<プラグイン>
			    <groupId>com.spotify</groupId>
			    <artifactId>dockerfile-maven-plugin</artifactId>
			    <バージョン> $ {docker.maven.plugin.version} </version>
			    <処刑>
			        <実行>
			        <id>デフォルト</id>
			        <目標>
			            <! -  dockerを使用してパッケージをパッケージ化したくない場合は、この目標をコメントしてください - >
			            <goal>ビルド</goal>
			            <goal>プッシュ</goal>
			        </目標>
			        </実行>
			    </処刑>
			    <構成>
			    	<contextdirectory> $ {project.basedir} </contextDirectory>
			        <! - ハーバーウェアハウスのユーザー名とパスワード - >
			        <usemavensettingsforauth> usemavensettingsforauth> true </usemavensettingsforauth>
			        <Repository> $ {docker.repostory}/$ {docker.registry.name}/$ {project.artifactid} </repository>
			        <tag> $ {docker.image.tag} </tag>
			        <ビルド引数>
			            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
			        </buildArgs>
			    </構成>
			</プラグイン>

        </プラグイン>
        
		<リソース>
			<! -  src/main/resourcesの下のすべてのファイルとフォルダーをリソースファイルとして指定します - >
			<リソース>
				<ディレクトリ>src/main/resources</ディレクトリ>
				<TargetPath> $ {project.build.directory}/classes </targetPath>
				<含まれるもの>
					<cluding> **/*</include>
				</includes>
				<フィルタリング>真</フィルタリング>
			</リソース>
		</リソース>
	</ビルド>

次に、スプ​​リングブートの起動クラスがあるモジュールのルートディレクトリにDockerFileを作成します。

#ADD依存関係環境、前提は、Java8 Docker画像を公式画像リポジトリから引き出し、192.168.0.0.10:1180/library/java:8から自分のHarborプライベートリポジトリにアップロードすることです。
#画像作成作家メンテナーBingheを指定します
#Run Directory Volume /TMP
#copy containerにローカルファイルを追加しますターゲット/*jar app.jar
#コンテナを起動した後に自動的に実行されるコマンドエントリポイント["java"、 "-djava.security.egd = file:/dev/./ urandom"、 "-jar"、 "/app.jar"]]

実際の状況に従って自分で修正します。

注:192.168.0.10:1180/library/java:8の前提は、次のコマンドを実行することです。

docker pull java:8
Docker Tag Java:8 192.168.0.10:1180/library/java:8
Dockerログイン192.168.0.10:1180
Docker Push 192.168.0.10:1180/library/java:8

以下に示すように、Springboot Startupクラスが配置されているモジュールのルートディレクトリにYAMLファイルを作成し、test.yamlというファイルを入力します。

APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前:テストスターター
  ラベル:
    アプリ:テストスターター
仕様:
  レプリカ: 1
  セレクタ:
    一致ラベル:
      アプリ:テストスターター
  テンプレート:
    メタデータ:
      ラベル:
        アプリ:テストスターター
    仕様:
      コンテナ:
       - 名前:テストスターター
        画像:192.168.0.10:1180/test/test-starter:1.0.0
        ポート:
        -containerport:8088
      ノードセレクター:
        ClusterType:node12

---
APIバージョン: v1
種類: サービス
メタデータ:
  名前:テストスターター
  ラベル:
    アプリ:テストスターター
仕様:
  ポート:
    - 名前: http
      ポート: 8088
      nodeport:30001
  タイプ: NodePort
  セレクタ:
    アプリ:テストスターター

2。Jenkins構成リリースプロジェクト

たとえば、プロジェクトをSVNコードベースにアップロードします。アドレスはsvn://192.168.0.10/testです。

次に、Jenkinsで自動パブリッシングを構成します。手順は次のとおりです。

新しいアイテムをクリックします。

以下に示すように、説明テキストボックスに説明情報を入力してください。

次に、SVN情報を構成します。

注:gitlabを構成するための手順はSVNの手順と同じであるため、詳細は説明しません。

Jenkinsの「ビルドモジュール」への位置決め、Execute Shellを使用して、K8Sクラスターに公開プロジェクトを構築します。

実行されたコマンドは、次の順序で表示されます。

#Deleting Original Local画像は、Harbor Repository Docker RMI 192.168.0.10:1180/test/test-starter:1.0.0の画像に影響しません。
#collection and build docker imagesを使用します。
#Login Harbor Repository Dockerログイン192.168.0.10:1180 -U Binghe -P Binghe123
#upload harbourリポジトリのドッカープッシュ192.168.0.10:1180/test/test-starter:1.0.0
#stop and delete/usr/bin/kubectl delete -f test.yamlはK8Sクラスターで実行されています
#Republish Docker Image to K8s Cluster/usr/bin/kubectl Apply -f test.yaml

これは、Docker+K8S+Gitlab/SVN+Jenkins+Harber(環境建設)に基づく継続的な統合配信環境の構築に関する記事です。

以下もご興味があるかもしれません:
  • Docker+jenkins+python3環境を使用して非常に詳細なチュートリアルを構築する
  • Docker環境にJenkinsコンテナをインストールする詳細なチュートリアル
  • Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます
  • Jenkins環境の開始Dockerについての質問

<<:  MySQLグループクエリ最適化方法

>>:  Discuz! フォーラムに設定オプションを追加する方法

推薦する

セマンティック XHTML タグの紹介

まず最初に指摘しておきたいのは、人間は視覚的な区分を通じてコン​​テンツの意味を判断できるが、検索エ...

JS ES6コーディング標準の詳細な説明

目次1. ブロックスコープ1.1. let は var を置き換える1.2. グローバル定数とスレッ...

MySQL 5.7 以降のバージョンのダウンロードとインストールのグラフィック チュートリアル

1. ダウンロード1. MySQL公式サイトのダウンロードアドレス: https://downloa...

INS と DEL を使用してドキュメントの変更をマークする方法の詳細な説明

ins と del は、HTML 4.0 で導入され、文書の作成時に作成者が共同作業できるようにし、...

W3C チュートリアル (11): W3C DOM アクティビティ

ドキュメント オブジェクト モデル (DOM) は、プログラムがドキュメントのコンテンツ、構造、およ...

HTML タグ: サブタグと sup タグ

今日はあまり使わないHTMLタグ「subタグ」と「supタグ」を紹介します。関連記事: HTML タ...

Vueモバイル端末に最適な適応ソリューションについての簡単な説明

序文: 最近の医療モバイル プロジェクトに基づいて、Vue はさまざまな画面のさまざまな画面サイズに...

MySQL 文字セットの表示と変更のチュートリアル

1. 文字セットを確認する1. MYSQLデータベースサーバーとデータベースの文字セットを確認する方...

VueはTeleportをベースにModalコンポーネントを実装します

目次1. テレポートについて知る2. テレポートの基本的な使い方3. 最初のステップの最適化4. 第...

CSS の複雑なセレクターと CSS のフォントスタイルと色属性の詳細な説明

これまでに CSS の基本的なセレクターをいくつか学習しましたが、今日は CSS の複雑なセレクター...

CSS3は子供のころの紙飛行機を実現する

今日は折り紙飛行機(飛べる飛行機)を作ります基本的にすべてCSSで実装されており、JSはごく一部に過...

Vue 親コンポーネントが子コンポーネント関数の実装を呼び出す

Vue親コンポーネントは子コンポーネントの関数を呼び出す親コンポーネントはイベントを通じて子コンポー...

WebpackはCSSファイルを読み込み、その設定方法

webpackはCSSファイルとその設定をロードします複数の CSS ファイルを作成した後、HTML...

ウェブデザインにおけるグリッドシステム

グリッドシステムの形成1692年、新しく即位したフランス国王ルイ14世は、フランスの印刷技術のレベル...