mysql -u rootCREATE DATABASE js7 CHARACTER SET utf8 COLLATE utf8_general_ci;CREATE USER 'jobscheduler'@'%' IDENTIFIED BY 'jobscheduler';CREATE USER 'jobscheduler'@'localhost' IDENTIFIED BY 'jobscheduler';GRANT ALL ON js7.* TO 'jobscheduler'@'%';GRANT CREATE, CREATE VIEW, DROP, ALTER, EXECUTE, SELECT, UPDATE, INSERT, DELETE on js7.* to 'jobscheduler'@'%';GRANT ALL ON js7.* TO 'jobscheduler'@'localhost';GRANT CREATE, CREATE VIEW, DROP, ALTER, EXECUTE, SELECT, UPDATE, INSERT, DELETE on js7.* to 'jobscheduler'@'localhost';mkdir -p js7base/cockpitcd js7base/cockpit
Dockerfile
FROM ubuntuRUN bashversion: "3"services: main: build: context: . privileged: true command: bash hostname: main tty: true
起動してJS7ベース環境を構築していきます。docker compose up -d
Shellに接続します。docker exec -it cockpit-main-1 bash
では、普通にUbuntuを構築していきます。apt updateapt upgrade -yapt install language-pack-ja-base language-pack-ja net-tools iputils-ping traceroute dnsutils vim tzdata sudo curl openjdk-19-jre-headless -ylocale-gen ja_JP.UTF-8echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
作業管理用ユーザーを追加します。useradd scheduler -m -p schedulerpasswd scheduler
sudo にも登録するecho 'Defaults:scheduler !requiretty' >> /etc/sudoers.d/schedulerecho "scheduler ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/schedulerchmod go-r /etc/sudoers.d/scheduler
作業ユーザーにスイッチします。su - scheduler
curl -O https://download.sos-berlin.com/JobScheduler.2.6/js7_joc_linux.2.6.3.tar.gztar -xvf js7_joc_linux.2.6.3.tar.gzcd joc.2.6.3<installpath>[:choose absolute installation path of JOC Cockpit:]</installpath><installpath>/opt/sos-berlin.com/js7/joc</installpath><entry key="jettyBaseDir" value=""/><entry key="jettyBaseDir" value="/home/scheduler/sos-berlin.com/js7/joc"/><entry key="launchJetty" value="yes"/><entry key="launchJetty" value="no"/>databaseHost:[mariadb や mysqlのアドレス]databasePort:3306databaseSchema:js7databaseUser:jobschedulerdatabasePassword:jobschedulerセットアップしましょう./setup.sh ./joc_install.xml
ルートに戻って、起動スクリプトを作成します。
exit
/root/startjoc.sh
#!/bin/bash
# safty Exitfunction exit_script(){ echo "Caught SIGTERM" /opt/sos-berlin.com/js7/joc/jetty/bin/jetty.sh stop exit 0}trap exit_script SIGTERM
/opt/sos-berlin.com/js7/joc/jetty/bin/jetty.sh run
trap break ERR
while [ 1 ]do /usr/bin/sleep 10 PIDSTR=`/opt/sos-berlin.com/js7/joc/jetty/bin/jetty.sh check | grep 'Jetty running pid'` if [ ! -n "$PIDSTR" ]; then break fidone
起動権限を与えます。
chmod a+x /root/startjoc.sh
exit
ここで、コンテナに保存です。
docker stop cockpit-main-1
docker commit cockpit-main-1 js7-cockpit
で、停止です。docker compose down
最後に、仕上げのDockerfileとdocker-compose.ymlを修正します。
Dockerfile
FROM js7-cockpitENTRYPOINT [ "/root/startjoc.sh" ]EXPOSE 4446/tcpversion: "3"services: cockpit: image : js7-cockpit build: context: . ports: - "0.0.0.0:4446:4446" command: /root/startjoc.sh hostname: js7cockpit tty: true次、Controlを構築しましょう。
mkdir -p js7base/controlcd js7base/control
Dockerfile
FROM ubuntuRUN bashversion: "3"services: main: build: context: . command: bash hostname: main tty: true
起動してJS7ベース環境を構築していきます。docker compose up -d
Shellに接続します。docker exec -it control-main-1 bash
では、普通にUbuntuを構築していきます。apt updateapt upgrade -yapt install net-tools iputils-ping traceroute dnsutils vim tzdata curl openjdk-19-jre-headless -y
cdtar -xvf js7_controller_unix.2.6.3.tar.gzcd controller/bincp -p controller_instance.sh-example controller_instance.sh/root/startcnt.sh
#!/bin/bash# safty Exitfunction exit_script(){ echo "Caught SIGTERM" /root/controller/bin/controller_instance.sh stop exit 0}trap exit_script SIGTERM/root/controller/bin/controller_instance.sh start-container起動権限を与えます。
chmod a+x /root/startcnt.sh
exit
ここで、コンテナに保存です。
docker stop control-main-1
docker commit control-main-1 js7-control
で、停止です。docker compose down
最後に、仕上げのDockerfileとdocker-compose.ymlを修正します。
Dockerfile
FROM js7-controlENTRYPOINT [ "/root/startcnt.sh" ]EXPOSE 4444/tcpversion: "3"services: control: image : js7-control build: context: . ports: - "0.0.0.0:4444:4444" command: /root/startcnt.sh hostname: js7control tty: true次、Agentを構築しましょう。
作業前に、NFSのポイントを作成しておいて下さい。
Agentは、揮発ボリュームにインストールすると不整合が起きて、再起動時に正常動作しなくなるようです。
なので、OCIのファイルストレージを作成して、そこにインストールすることにします。
docker-compose.ymlの赤字の部分が、ファイルストレージになるので、ここを確保しておいて下さい。
mkdir -p js7base/agentcd js7base/agent
Dockerfile
FROM ubuntuRUN bashversion: "3"services: main: build: context: . command: bash hostname: main tty: true volumes: - agentvol:/root/agentvolumes: agentvol: driver_opts: type: nfs o: "addr=k8mount.private.vcn6.oraclevcn.com,soft" device: ":/js7agent"
起動してJS7ベース環境を構築していきます。docker compose up -d
Shellに接続します。docker exec -it agent-main-1 bash
apt updateapt upgrade -yapt install language-pack-ja-base language-pack-ja net-tools iputils-ping traceroute dnsutils vim tzdata curl openjdk-19-jre-headless -ylocale-gen ja_JP.UTF-8echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
agentをインストールします。
cdtar -xvf js7_agent_unix.2.6.3.tar.gzcd agent/bin/cp agent_instance.sh-example agent_4445.sh/root/startagent.sh
#!/bin/bash# safty Exitfunction exit_script(){ echo "Caught SIGTERM" /root/agent/bin/agent_4445.sh stop exit 0}trap exit_script SIGTERM
/root/agent/bin/agent_4445.sh start
while [ 1 ]do /usr/bin/sleep 10 STATUSSTR=`/root/agent/bin/agent_4445.sh status | grep version` if [ ! -n "$STATUSSTR" ]; then break fidone
起動権限を与えます。
chmod a+x /root/startagent.sh
exit
ここで、コンテナに保存です。
docker stop agent-main-1
docker commit agent-main-1 js7-agent
で、停止です。docker compose down
最後に、仕上げのDockerfileとdocker-compose.ymlを修正します。
Dockerfile
FROM js7-agentENTRYPOINT [ "/root/startagent.sh" ]EXPOSE 4445/tcpversion: "3"services: agent: image: js7-agent build: context: . ports: - "0.0.0.0:4445:4445" command: /root/startagent.sh hostname: js7agent tty: true volumes: - agentvol:/root/agentvolumes: agentvol: driver_opts: type: nfs o: "addr=k8mount.private.vcn6.oraclevcn.com,soft" device: ":/js7agent"OCI のコンテナレジストリに登録します。
レジストリの作成
パブリックかプライベート
※プライベートの場合、kubectl create secret docker-registry で、シークレットを登録し、yaml定義に、imagePullSecrets: を指定する必要があります。
リボジトリ名を js7-cockpitとjs7-controlとjs7-agentで構築します。
次にリポジトリアクセス用の認証トークンを作成します。
自分のプロファイルから認証トークンを選択して作成します。
すると、謎の文字列を生成してくれるので、記録して下さい。
さっ、Dockerに戻ります。
リポジトリにログインします。 サンプルは、大阪リージョン(kix.ocir.io)ですよ。
サーバーアドレスは、ここに載ってます。
docker login kix.ocir.io
認証するんですが、ユーザー名の前にネームスペースを付けないとダメなんですね。
ネームスペースって何っと思うでしょ。テナンシに割りついている謎の文字列のことです。
テナンシ詳細画面から、オブジェクト・ストレージ・ネームスペースってとこに書かれているので、記録して下さい。
ということで、認証は、以下です。
User:ネームスペース/ユーザー名
Pass:認証トークン
無事認証すると、イメージを構築しリポジトリにプッシュします。
cd js7base/cockpitdocker image build -t kix.ocir.io/ネームスペース/js7-cockpit:1.0 .docker push kix.ocir.io/ネームスペース/js7-cockpit:1.0cd js7base/controldocker image build -t kix.ocir.io/ネームスペース/js7-control:1.0 .docker push kix.ocir.io/ネームスペース/js7-control:1.0cd js7base/agentdocker image build -t kix.ocir.io/ネームスペース/js7-agent:1.0 .docker push kix.ocir.io/ネームスペース/js7-agent:1.0いよいよ、kubernetesの出番となります。
これは、OCI で、MariaDB Cluster を構築 そして、Kubernetes で、落ちないサーバーにする で、記載しているので、構築しておいて下さいね。
やっと本作業です
OCIにて、OKE クラスターが完成し、接続環境を準備しましょう。
さーて、JS7の環境を構築しましょう。
kubernetesのyamlファイルを作成します。
これは、cockpitとcontrollerになります。agentは、わけておいた方が良いでしょうね。
js7-dep.yaml
kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: js7log-storageprovisioner: fss.csi.oraclecloud.comparameters: availabilityDomain: NtKM:AP-OSAKA-1-AD-1 mountTargetSubnetOcid: ocid1.subnet.oc1.ap-osaka-1........... compartmentOcid: ocid1.compartment.oc1........... exportPath: /js7log---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: js7logclaimspec: accessModes: - ReadWriteMany storageClassName: "js7log-storage" resources: requests: storage: 10Gi---apiVersion: v1kind: Servicemetadata: labels: app: js7-service name: js7-svc annotations: oci.oraclecloud.com/load-balancer-type: "nlb" oci-network-load-balancer.oraclecloud.com/backend-policy: "FIVE_TUPLE" oci-network-load-balancer.oraclecloud.com/internal: "true"spec: selector: app: js7-cockpit type: LoadBalancer ports: - port: 4446 protocol: TCP targetPort: 4446--- apiVersion: apps/v1kind: Deploymentmetadata: labels: app: js7-cockpit name: js7-cockpitspec: replicas: 1 selector: matchLabels: app: js7-cockpit template: metadata: labels: app: js7-cockpit spec: containers: - image: kix.ocir.io/hogehoge/js7-cockpit:1.0 imagePullPolicy: Always name: js7cockpit command: [ "/root/startjoc.sh" ] ports: - name: js7entry containerPort: 4446 volumeMounts: - name: log mountPath: /var/log/sos-berlin.com/js7/joc volumes: - name: log persistentVolumeClaim: claimName: js7logclaim---apiVersion: v1kind: Servicemetadata: labels: app: js7-control name: js7-cnt annotations: oci.oraclecloud.com/load-balancer-type: "nlb" oci-network-load-balancer.oraclecloud.com/backend-policy: "FIVE_TUPLE" oci-network-load-balancer.oraclecloud.com/internal: "true"spec: selector: app: js7-control type: LoadBalancer ports: - port: 4444 protocol: TCP targetPort: 4444--- apiVersion: apps/v1kind: Deploymentmetadata: labels: app: js7-control name: js7-controlspec: replicas: 1 selector: matchLabels: app: js7-control template: metadata: labels: app: js7-control spec: containers: - image: kix.ocir.io/hogehoge/js7-control:1.0 imagePullPolicy: Always name: js7control command: [ "/root/startcnt.sh" ] ports: - name: js7control containerPort: 4444 - image: kix.ocir.io/hogehoge/js7-cockpit:1.0- image: kix.ocir.io/hogehoge/js7-control:1.0 availabilityDomain: NtKM:AP-OSAKA-1-AD-1 mountTargetSubnetOcid: ocid1.subnet.oc1.ap-osaka-1........... compartmentOcid: ocid1.compartment.oc1...........良ければ、Goです。
kubectl apply -f ./js7-dep.yaml
すぐには、構築出来ないので、ゆっくり待ちましょう。
確認は、以下で行えます。
kubectl get pod -o wide
kubectl get pvc
kubectl get svc -o wide
Network Load Balancer(svc)が構築されているので、これに対して接続することで、cockpitとcontrollerに接続することが出来ます。
NLBのアドレス確認
kubectl get svc
破棄したい時は、以下で破壊することが出来ます。
kubectl delete -f ./js7-dep.yaml
agent用の構築ファイルです。
構築した時のファイルストレージをマウントするようにしておきます。
IPアドレス直書きしていますが、ここをFQDNにするとマウント出来ませんでした。なんででしょうね。
js7-agent.yaml
apiVersion: v1kind: PersistentVolumemetadata: name: js7agent-storagespec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: fss.csi.oraclecloud.com volumeHandle: ocid1.filesystem.oc1.ap_osaka_1.abcdefghifzt3dsnnuxqllqojxwiotboaww643bnnqs2mqprfsc2mia:15.9.2.12:/js7agent---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: js7agentclaimspec: accessModes: - ReadWriteMany storageClassName: "" resources: requests: storage: 10Gi volumeName: js7agent-storage---apiVersion: v1kind: Servicemetadata: labels: app: js7-agent name: js7-agent-svc annotations: oci.oraclecloud.com/load-balancer-type: "nlb" oci-network-load-balancer.oraclecloud.com/backend-policy: "FIVE_TUPLE" oci-network-load-balancer.oraclecloud.com/internal: "true"spec: selector: app: js7-agent type: LoadBalancer ports: - port: 4445 protocol: TCP targetPort: 4445--- apiVersion: apps/v1kind: Deploymentmetadata: labels: app: js7-agent name: js7-agentspec: replicas: 1 selector: matchLabels: app: js7-agent template: metadata: labels: app: js7-agent spec: containers: - image: kix.ocir.io/hogehoge/js7-agent:1.0 imagePullPolicy: Always name: js7agent command: [ "/root/startagent.sh" ] ports: - name: js7agent containerPort: 4445 volumeMounts: - name: agent mountPath: /root/agent imagePullSecrets: - name: danrepo volumes: - name: agent persistentVolumeClaim: claimName: js7agentclaim
agentも Network Load Balancer(svc)が構築されているので、これに対して接続することで、agentに接続することが出来ます。
JS7の具体的な使い方は、googleさんや、chatgptにでも尋ねれば良いかと思います。
コックピットへの接続は、Network Load Balancer(svc) のリスナーアドレスに接続します。
http://[コックピットのNLB]:4446/
コントローラーの追加とエージェントの追加は、kubernetesのDNSを設定します。
コントローラー
http://js7-cnt.default.svc.cluster.local:4444
エージェント
http://js7-agent-svc.default.svc.cluster.local:4445
ということで、完成したのですが、あんまり個人で、こんなスケジューラー使うことって無いんですよね。
cronでこと足りるのですわ。
でも、せっかく構築したので、REST API とか使って、何かしてみましょう。
おまけネタです
セレクタからpodのipアドレスを取得するワザです。
kubectl get pods --selector=app=セレクタ名 -o wide -o=jsonpath='{.items[*].status.podIP}'`
そして、それを OCIのDNSゾーンに更新するワザです。
PODIP=IPアドレス
ZONEID=ゾーンのOCID
FQDN=対象ドメイン名
oci dns record rrset update --domain $FQDN --zone-name-or-id ${ZONEID} --rtype A --force --items '[{"domain":"'$FQDN'","isProtected": false,"rdata":"'$PODIP'" ,"rtype":"A","ttl":"3600"}]'





