PLCnextでのクラスタ管理:産業オートメーションにおけるKubernetesの活用
ITでは何年も標準とされてきましたが、産業分野ではまだ大きな影響を与えていません。多くの場合、このようなテクノロジーは複雑すぎると、不要だと見なされます。問われるのは、これらが我々に利点をもたらすかどうかです。
Kubernetesを例にしたPLCnextのビジョン。
Kubernetes
Kubernetesは、コンテナなどを使用して、さまざまなデバイスを介してネットワークを形成するオーケストレーター(管理システム、マスター)です。このシステムは、アプリケーションを少し異なる方法で提供するために使用されます。
従来、アプリケーションはデバイスに分散して維持されていました。どのコンピューターでアプリケーションが実行されているかは既知です。アプリケーションを別のコンピューターで実行する必要がある場合、これは人間によって行われなければなりません。コンピューターのいずれかが故障すると、そのコンピューターのすべてのアプリケーションが利用できなくなります。
Kubernetesでは、マスターにアプリケーションの状態記述が与えられ、マスターが残りを処理します。要求された状態が常に維持されることを保証します。ただし、アプリケーションが現在どのノードで実行されているかは不明ですが、原則としてアクセス可能です。
質問と回答
状態記述とは何ですか?
- 状態記述はすべてのアプリケーションの基盤です。たとえば、どのコンテナをどのバージョンで使用するか、負荷分散のためにアプリケーションを複数回起動するかなどが含まれます。完全にテキスト形式で、
jsonまたはyamlファイルとして記述されます。したがって、完全にバージョン管理可能です(GitやSVNなど)。
クラスタをインストールするには?
- 参加者(マスターとノード)に2つのソフトウェアコンポーネント(コンテナランタイムとKubernetes)を提供する必要があります。その後、トークン経由でマスターに1回ログインするだけで済みます。残りはマスターが処理します。
アプリケーションのアップデートはどう行う?
- アップデートは、アプリケーションの状態記述を新しいものに置き換えるだけです。アップデートはオンザフライで行われます。つまり、新しいアプリケーションが最初にインストールされて開始され、最後の瞬間に古いアプリケーションがシャットダウンされます。アップデートが失敗した場合、ロールバックを実行して古い状態を簡単に復元できます。オーケストレーターはすべての古い状態を保持します。さらに、前述の状態のバージョン管理の可能性も存在します。
- ここから新しいアップデートシナリオが生まれます。アプリケーションがクラスタで頻繁に実行される場合、最初に一部のアプリケーションのみをアップデートできます。数日または数週間のテストでエラーが発生しなければ、残りをアップデートできます。
ノードが故障したら?
- いつノードが故障しても、すべてのアプリケーションは単純に別のノードで利用可能になります。アクセス性は変わりません。十分な計算能力があれば、すべてのアプリケーションを継続して実行できます。MQTTサーバーについて多くの議論があります。中央コンポーネントとして故障時に多くの問題を引き起こしますが、クラスタでは問題になりません。
マスターが故障したら?
- マスターも冗長化して実行できます。一つが故障したら、別のノードが引き継ぎます。
特定のアプリケーションを特定のノードで実行する必要がある(ハードウェアアクセスが必要なため)
- これは状態記述に含めることができます。デバイスに属するタグに基づいて状態を割り当てることもできます。例として、各AXCF2152で特定のアプリケーションを実行する必要があります。MQTTの例を再び取り上げると、フェデレーションでMQTTサーバーが実行され、さらに各ノードにMQTTクライアントを装備してMQTTサーバーとの通信を確立できます。マスターは1つだけ存在し、クライアントは各ノードで実行されます。
例
3つのコンテナ(フロントエンド、バックエンド、データベース)で構成されるアプリケーションの状態記述の例。
Deployment:
- すべてのコンテナに必要な設定を定義。
Service:
- クラスタ内でアプリケーションへのインターフェースを一元的に作成。インターフェースは、デプロイメントがどのノードで実行されているかに関わらず常に有効。
Ingress:
- DNSエントリを使用してインターフェースをフロントエンドにリンク。フロントエンドは常に1つのドメインで到達可能。
- Proxy
https://MyApp.MyDomain.de/to the frontend service (Port 80) - Proxy
https://MyApp.MyDomain.de/apito the backend service (port 3000)
# Kind of the Deployment
kind: Deployment
apiVersion: apps/v1
metadata:
name: MyApplicationName
labels:
app: MyApplication
MyApplication: MyApplicationName
namespace: default
## Container specs
spec:
containers:
## Container spec for Frontend
## Name for the Container
- name: MyContainer-frontend
## Container Image to use
image: MyApplicationImage_frontend
## Ports for the frontend, http
ports:
- containerPort: 80
## Container spec for Backend
- name: MyContainerName-backend
image: MyApplicationImage_backend
ports:
- containerPort: 3000
## Container spec for mongodb
- name: MyContainerName-mongo
image: mongo:3.4
## Startup commands for Mongo DB
command:
- "mongod"
- "--bind_ip"
- "0.0.0.0"
ports:
- containerPort: 27017
---
## Service declaration, expose Ports to the kubernetes api (only internal reachable)
apiVersion: v1
kind: Service
metadata:
name: MyApplicationName
spec:
ports:
- name: frontend
targetPort: 80
port: 80
- name: backend
targetPort: 3000
port: 3000
selector:
app: MyApplication
task: MyApplicationName
---
## Ingress declaration, bind proxy to fronted and backend
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
## Bind ingress to traefik service proxy
metadata:
name: MyApplicationName
annotations:
kubernetes.io/ingress.class: traefik
## Ingress class for frontend, map dns ingress to service port 80
spec:
rules:
- host: MyApp.Mydomain.de
http:
paths:
- path: /
backend:
serviceName: MyApplicationName
servicePort: frontend
## Ingress class for backend, map dns ingress to service port 3000
- host: MyApplicationName.MyDomain.de
http:
paths:
- path: /api
backend:
serviceName: MyApplicationName
servicePort: backend
参考資料
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
https://github.com/k3s-io/k3s
https://github.com/rancher/k3d
https://github.com/inercia/k3x
産業技術
- プレス加工(スタンピング)完全解説:種類、プロセス、用途
- 摩擦溶接とは?原理、プロセス、メリット、用途を徹底解説
- サーマルスプレー完全解説:種類、用途、メリット
- ケイ酸ナトリウム:鋳造生産における効率と品質の向上
- PLCnext ControlでLinuxターミナルコマンドを使いVLAN設定を効率化
- PLCnextデバイスでgrpcurlを用いた安全なリモートgRPCアクセス
- PLCnext CLIテンプレートでC++開発を効率化
- DHCPで割り当てられたIPを持つPLCnext Webサーバーに安全にアクセス
- C#でPLCnextコンソールアプリケーションを開発:初心者ガイド
- TableauダッシュボードでPLCnextをリアルタイム監視
- PLCnextクラウドデータからPower BIダッシュボードを作成