VPLC (VPLCnext) K8S

前序

在接触Virtual PLCnext Control的时候,我想过好几次如何将它运行在k8s上,由于对k8s的熟悉程度不够,跌跌撞撞尝试了很久,终于把vPLC部署在单机版的k8s上了。(此教程仅为demo阶段,此教程仅为demo阶段,此教程仅为demo阶段,仅供参考与交流

  • 环境:Ubuntu24.04 Preempt-RT
  • 机器:i5-12459H
  • 测试1:OPC-UA ✅
  • 测试2:Profinet Master/device✅
  • 测试3:PLCnext App✅

k8s VPLCnext demo需求

  1. 内核5.19以上
  2. 系统支持systemd
  3. Preempt-RT补丁
  4. 内核选项和ubuntu24.04基本一致(比如开启macvlan、veth、cgroup等选项)

系统

这次用的操作系统是Ubuntu24.04,为了确保实时性,还需要打实时补丁。再安装好Ubuntu24.04之后,运行下列命令

sudo apt updatesudo apt-get install linux-realtimesudo nano /etc/default/grub# 注释hidden
# 设置timeout为10GRUB_DEFAULT=0
# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`( . /etc/os-release; echo ${NAME:-Ubuntu} ) 2>/dev/null || echo Ubuntu`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""sudo update-grubsudo nano /boot/grub# 将linux-realtime改成默认启动,找到对应的启动项,将该启动项替换到export linux_gfx_mode后面if [ "${recordfail}" != 1 ]; thenif [ -e ${prefix}/gfxblacklist.txt ]; thenif [ ${grub_platform} != pc ]; thenset linux_gfx_mode=keepelif hwmatch ${prefix}/gfxblacklist.txt 3; thenif [ ${match} = 0 ]; thenset linux_gfx_mode=keepelseset linux_gfx_mode=textfielseset linux_gfx_mode=textfielseset linux_gfx_mode=keepfi
elseset linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu, with Linux 6.8.1-1015-realtime' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.1-1015-realtime-advanced-d712360d-c47b-4226-a398-5ee5569a179c' {recordfailload_videogfxmode $linux_gfx_modeinsmod gzioif [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fiinsmod part_gptinsmod ext2set root='hd0,gpt2'if [ x$feature_platform_search_hint = xy ]; thensearch --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  d712360d-c47b-4226-a398-5ee5569a179celsesearch --no-floppy --fs-uuid --set=root d712360d-c47b-4226-a398-5ee5569a179cfiecho	'Loading Linux 6.8.1-1015-realtime ...'linux	/boot/vmlinuz-6.8.1-1015-realtime root=UUID=d712360d-c47b-4226-a398-5ee5569a179c ro  quiet splash $vt_handoffecho	'Loading initial ramdisk ...'initrd	/boot/initrd.img-6.8.1-1015-realtime}

 安装好后重启系统,确保是实时内核

root@plcnext-VMware-Virtual-Platform:/boot/grub# uname -a
Linux plcnext-VMware-Virtual-Platform 6.8.1-1015-realtime #16-Ubuntu SMP PREEMPT_RT Wed Jan 15 21:03:54 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

安装kubectl & kubeadm & kubelet

sudo apt-get update  
sudo apt-get install containerd 
sudo mkdir /etc/containerd  sudo nano  /etc/containerd/config.toml version = 2root = "/var/lib/containerd"state = "/run/containerd"disabled_plugins = []required_plugins = ["io.containerd.grpc.v1.cri"]oom_score = -999# Alibaba Cloud Vendor enhancement configuration# imports = ["/etc/containerd/alibabacloud.toml"][grpc]address = "/run/containerd/containerd.sock"max_recv_message_size = 16777216max_send_message_size = 16777216[debug]address = "/run/containerd/debug.sock"level = "info"[timeouts]"io.containerd.timeout.shim.cleanup" = "5s""io.containerd.timeout.shim.load" = "5s""io.containerd.timeout.shim.shutdown" = "3s""io.containerd.timeout.task.state" = "2s"[plugins][plugins."io.containerd.gc.v1.scheduler"]pause_threshold = 0.02deletion_threshold = 0mutation_threshold = 100schedule_delay = "0s"startup_delay = "100ms"[plugins."io.containerd.grpc.v1.cri"]sandbox_image = "registry-cn-shanghai.ack.aliyuncs.com/acs/pause:3.9"ignore_image_defined_volumes = true[plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs"default_runtime_name = "runc"disable_snapshot_annotations = truediscard_unpacked_layers = false[plugins."io.containerd.grpc.v1.cri".containerd.runtimes][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]runtime_type = "io.containerd.runc.v2"privileged_without_host_devices = false[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]NoPivotRoot = falseNoNewKeyring = falseSystemdCgroup = true[plugins."io.containerd.grpc.v1.cri".cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d"max_conf_num = 1[plugins."io.containerd.grpc.v1.cri".registry]config_path = "/etc/containerd/cert.d"[plugins."io.containerd.internal.v1.opt"]path = "/opt/containerd"[plugins."io.containerd.internal.v1.restart"]interval = "10s"[plugins."io.containerd.metadata.v1.bolt"]content_sharing_policy = "shared"
sudo apt install curlcurl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpgecho 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get update  
sudo apt-get install -y kubelet kubeadm kubectl  
sudo apt-mark hold kubelet kubeadm kubectl  sudo swapoff -a                   # off swap
sudo sed -i '/swap/d' /etc/fstab  # off swap need reboot systemreboot

重启后,再执行

sudo su
bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsudo modprobe br-netfilter  
kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16  mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

安装Flannel

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml# if download failed like ImagePullError, delete it and it will auto build again
# 如果下载失败了,删除pod后,会自动重新下载
kubectl get pods -n kube-flannel
kubectl delete pod kube-flannel-ds-<xxxx> -n kube-flannel

安装Multus

kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset-thick.yml

确保都在运行

root@plcnext-virtual-machine:/home/plcnext/vplc_k8s# kubectl get pods -A
NAMESPACE      NAME                                              READY   STATUS             RESTARTS          AGE
kube-flannel   kube-flannel-ds-mz5xf                             1/1     Running            5 (42d ago)       42d
kube-system    kube-multus-ds-rk2w6                              1/1     Running            0                 19hkubectl get pods -n kube-system | grep multuskube-multus-ds-rk2w6                              1/1     Running            0                 19h

为vPLC创建Macvlan NIC

nano macvlan-net.yaml

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:name: macvlan-eth1annotations:k8s.v1.cni.cncf.io/resourceName: macvlan.network.k8s.io/eth1
spec:config: '{"cniVersion": "0.3.1","name": "macvlan-eth1","type": "macvlan","master": "ens33","mode": "bridge","ipam": {"type": "static","addresses": [{"address": "192.168.10.152/24","gateway": "192.168.10.1"}],"routes": [{"dst": "0.0.0.0/0","gw": "192.168.10.1"}],"dns": {"nameservers": ["8.8.8.8", "8.8.4.4"]}}}'

应用macvlan NIC

kubectl apply -f macvlan-net.yaml

检查是否正常工作

root@:kubectl get network-attachment-definitions.k8s.cni.cncf.io -ANAMESPACE   NAME           AGE
default     macvlan-eth1   19hroot@: kubectl describe network-attachment-definitions.k8s.cni.cncf.io macvlan-eth1 -n defaultName:         macvlan-eth1
Namespace:    default
Labels:       <none>
Annotations:  k8s.v1.cni.cncf.io/resourceName: macvlan.network.k8s.io/eth1
API Version:  k8s.cni.cncf.io/v1
Kind:         NetworkAttachmentDefinition
Metadata:Creation Timestamp:  2025-05-13T05:19:50ZGeneration:          1Resource Version:    43216UID:                 e1babe8b-d9f0-4646-8013-9d57896444f3
Spec:Config:  { "cniVersion": "0.3.1", "name": "macvlan-eth1", "type": "macvlan", "master": "ens33", "mode": "bridge", "ipam": { "type": "static", "addresses": [ { "address": "192.168.10.152/24", "gateway": "192.168.10.1" } ], "routes": [ { "dst": "0.0.0.0/0", "gw": "192.168.10.1" } ], "dns": { "nameservers": ["8.8.8.8", "8.8.4.4"] } } }
Events:    <none>

创建VPLC pod yaml

nano pod.yaml
apiVersion: v1
kind: Pod
metadata:annotations:io.podman.annotations.ulimit: rtprio=-1:-1,nofile=1024:10024k8s.v1.cni.cncf.io/networks: |-[{"name": "macvlan-eth1","interface": "eth1" }]name: my-pod
spec:tolerations:- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"containers:- env:- name: HOSTNAMEvalue: VL3-PLCNEXT-x86-64image: registry.k8s.io/vplcnextcontrol1000-x86-64:78name: vplcnextcontrol1000command: ["/usr/lib/systemd/systemd"]imagePullPolicy: NeversecurityContext:privileged: truevolumeMounts:- mountPath: /dev/fusename: fuse-device- mountPath: /opt/plcnext/config/name: env1-config-pvc- mountPath: /opt/plcnext/appsname: env1-apps-pvc- mountPath: /opt/plcnext/data/name: env1-data-pvc- mountPath: /opt/plcnext/projects/name: env1-projects-pvc- mountPath: /opt/plcnext/logsname: env1-logs-pvchostname: vl3-plcnext-x86volumes:- name: fuse-devicehostPath:path: /dev/fusetype: CharDevice- name: env1-config-pvcpersistentVolumeClaim:claimName: env1-config-pvc- name: env1-apps-pvcpersistentVolumeClaim:claimName: env1-apps-pvc- name: env1-data-pvcpersistentVolumeClaim:claimName: env1-data-pvc- name: env1-projects-pvcpersistentVolumeClaim:claimName: env1-projects-pvc- name: env1-logs-pvcpersistentVolumeClaim:claimName: env1-logs-pvc

更新vplc镜像到本地k8s.io

#load imagectr -n k8s.io images import vplcnextcontrol1000-x86-64-2025.0.0-25.0.0.78.tar# change tagctr -n k8s.io images tag \import-2025-05-14:vplcnextcontrol1000-x86-64 \registry.k8s.io/vplcnextcontrol1000-x86-64:78# delete old tagctr -n k8s.io images rm import-2025-05-14:vplcnextcontrol1000-x86-64

检查镜像

oot@plcnext-VMware-Virtual-Platform:/etc/cni/net.d# ctr -n=k8s.io images list
REF                                                                                                                                                      TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                     LABELS                                                          
ghcr.io/flannel-io/flannel-cni-plugin:v1.6.2-flannel1                                                                                                    application/vnd.oci.image.index.v1+json                   sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f 4.6 MiB   linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x  io.cri-containerd.image=managed                                 
ghcr.io/flannel-io/flannel-cni-plugin@sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f                                            application/vnd.oci.image.index.v1+json                   sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f 4.6 MiB   linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x  io.cri-containerd.image=managed                                 
ghcr.io/flannel-io/flannel:v0.26.7                                                                                                                       application/vnd.oci.image.index.v1+json                   sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 31.5 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x  io.cri-containerd.image=managed                                 
ghcr.io/flannel-io/flannel@sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82                                                       application/vnd.oci.image.index.v1+json                   sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 31.5 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x  io.cri-containerd.image=managed                                 
ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot-thick                                                                                                   application/vnd.docker.distribution.manifest.list.v2+json sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 170.9 MiB linux/amd64,linux/arm/v7,linux/arm/v8,linux/arm64,linux/ppc64le,linux/s390x   io.cri-containerd.image=managed                                 
ghcr.io/k8snetworkplumbingwg/multus-cni@sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1                                          application/vnd.docker.distribution.manifest.list.v2+json sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 170.9 MiB linux/amd64,linux/arm/v7,linux/arm/v8,linux/arm64,linux/ppc64le,linux/s390x   io.cri-containerd.image=managed                                 
registry-cn-shanghai.ack.aliyuncs.com/acs/pause:3.9                                                                                                      application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed,io.cri-containerd.pinned=pinned 
registry-cn-shanghai.ack.aliyuncs.com/acs/pause@sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed,io.cri-containerd.pinned=pinned 
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1                                                                                      application/vnd.docker.distribution.manifest.list.v2+json sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 15.4 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns@sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028                      application/vnd.docker.distribution.manifest.list.v2+json sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 15.4 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.15-0                                                                                        application/vnd.docker.distribution.manifest.list.v2+json sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 54.3 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd@sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4                         application/vnd.docker.distribution.manifest.list.v2+json sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 54.3 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15                                                                              application/vnd.docker.distribution.manifest.list.v2+json sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 32.8 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver@sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8               application/vnd.docker.distribution.manifest.list.v2+json sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 32.8 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15                                                                     application/vnd.docker.distribution.manifest.list.v2+json sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 31.8 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager@sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42      application/vnd.docker.distribution.manifest.list.v2+json sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 31.8 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 27.0 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy@sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215                   application/vnd.docker.distribution.manifest.list.v2+json sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 27.0 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15                                                                              application/vnd.docker.distribution.manifest.list.v2+json sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b 17.7 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler@sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b               application/vnd.docker.distribution.manifest.list.v2+json sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b 17.7 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9                                                                                            application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed                                 
registry.cn-hangzhou.aliyuncs.com/google_containers/pause@sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097                        application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed                                 
registry.k8s.io/vplcnextcontrol1000-x86-64:78                                                                                                            application/vnd.oci.image.manifest.v1+json                sha256:f3f4c9ee6a734e4498b2216739c542cfe8b5981215421aab8007cbf840da7e59 224.7 MiB linux/amd64                                                                   io.cri-containerd.image=managed                                 
sha256:10541d8af03f40fae257735edd69b6c5dd0084bb9796649409ac7b5660705148                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 31.8 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
sha256:29bd7bbb1c041945b8111bf2ecb5d4e656d56bdc3db7d5119b52fa5797780552                                                                                  application/vnd.oci.image.manifest.v1+json                sha256:f3f4c9ee6a734e4498b2216739c542cfe8b5981215421aab8007cbf840da7e59 224.7 MiB linux/amd64                                                                   io.cri-containerd.image=managed                                 
sha256:2e96e5913fc06e3d26915af3d0f2ca5048cc4b6327e661e80da792cbf8d8d9d4                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 54.3 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed                                 
sha256:55ce2385d9d8c6f720091c177fbe885a21c9dc07c9e480bfb4d94b3001f58182                                                                                  application/vnd.oci.image.index.v1+json                   sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f 4.6 MiB   linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x  io.cri-containerd.image=managed                                 
sha256:965b9dd4aa4c1b6b68a4c54a166692b4645b6e6f8a5937d8dc17736cb63f515e                                                                                  application/vnd.oci.image.index.v1+json                   sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 31.5 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x  io.cri-containerd.image=managed                                 
sha256:9d3465f8477c6b383762d90ec387c9d77da8a402a849265805f86feaa57aeeea                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b 17.7 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
sha256:9dc6939e7c573673801790fcfad6f994282c216e005578f5836b5fafc6685fc2                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 32.8 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
sha256:ba6d7f8bc25be40b51dfeb5ddfda697527ba55073620c1c5fa04a5f0ae9e3816                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 27.0 MiB  linux/amd64,linux/arm64,linux/ppc64le,linux/s390x                             io.cri-containerd.image=managed                                 
sha256:cd453b9857733f7230c435f941ae5b4ec835627732f18f9278f05375122c9bf5                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 170.9 MiB linux/amd64,linux/arm/v7,linux/arm/v8,linux/arm64,linux/ppc64le,linux/s390x   io.cri-containerd.image=managed                                 
sha256:e6f1816883972d4be47bd48879a08919b96afcd344132622e4d444987919323c                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64  io.cri-containerd.image=managed,io.cri-containerd.pinned=pinned 
sha256:ead0a4a53df89fd173874b46093b6e62d8c72967bbf606d672c9e8c9b601a4fc                                                                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 15.4 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed                                 
sha256:fcacad112e0df0b551f562f2ba6c6c94cd2a47c761c5a36eb525091fae2b721d                                                                                  application/vnd.docker.distribution.manifest.v2+json      sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 165.3 MiB linux/amd64                                                                   io.cri-containerd.image=managed                                 
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot-thick                                                          application/vnd.docker.distribution.manifest.v2+json      sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 165.3 MiB linux/amd64                                                                   io.cri-containerd.image=managed                                 
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/k8snetworkplumbingwg/multus-cni@sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 application/vnd.docker.distribution.manifest.v2+json      sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 165.3 MiB linux/amd64                                                                   io.cri-containerd.image=managed      

创建持久卷

nano env1-vplc-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-apps-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain  hostPath:path: /mnt/data/env1-apps  
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-config-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain  hostPath:path: /mnt/data/env1-config
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-data-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain  hostPath:path: /mnt/data/env1-data
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-projects-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain  hostPath:path: /mnt/data/env1-projects
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-logs-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain  hostPath:path: /mnt/data/env1-logs
nano env1-vplc-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-apps-pvc  
spec:volumeName: env1-apps-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-config-pvc  
spec:volumeName: env1-config-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-data-pvc  
spec:volumeName: env1-data-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-projects-pvc  
spec:volumeName: env1-projects-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-logs-pvc  
spec:volumeName: env1-logs-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
# apply pv first, then apply pvckubectl apply -f env1-vplc-pv.yaml
kubectl apply -f env1-vplc-pvc.yamlmkdir /mnt/data

检查PV和PVC

root@plcnext-VMware-Virtual-Platform:/home/plcnext/vplc# kubectl get pv
NAME               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                       STORAGECLASS   REASON   AGE
env1-apps-pv       1Gi        RWO            Retain           Bound    default/env1-apps-pvc                               67m
env1-config-pv     1Gi        RWO            Retain           Bound    default/env1-config-pvc                             66m
env1-data-pv       1Gi        RWO            Retain           Bound    default/env1-data-pvc                               66m
env1-logs-pv       1Gi        RWO            Retain           Bound    default/env1-logs-pvc                               66m
env1-projects-pv   1Gi        RWO            Retain           Bound    default/env1-projects-pvc                           66m
root@plcnext-VMware-Virtual-Platform:/home/plcnext/vplc# kubectl get pvc
NAME                STATUS   VOLUME             CAPACITY   ACCESS MODES   STORAGECLASS   AGE
env1-apps-pvc       Bound    env1-apps-pv       1Gi        RWO                           67m
env1-config-pvc     Bound    env1-config-pv     1Gi        RWO                           66m
env1-data-pvc       Bound    env1-data-pv       1Gi        RWO                           66m
env1-logs-pvc       Bound    env1-logs-pv       1Gi        RWO                           66m
env1-projects-pvc   Bound    env1-projects-pv   1Gi        RWO                           66m

创建K8S容器

kubectl apply -f pod.yaml
kubectl exec -it my-pod -c vplcnextcontrol1000 -- bash

修改Network

默认有一个错误的ip地址和路由 192.168.1.10 & 192.168.1.1.

这是由于VPLC的固件中 /usr/lib/systemd/network/80-wired.network 导致的

删除所有的192.168.1.* ,并修改79-if-1.network和79-if-2.network填写gateway和ipaddress

ip route del default via 192.168.1.1 dev eth0
ip route del default via 192.168.1.1 dev eth1
ip addr del 192.168.1.10/24 dev eth0
ip addr del 192.168.1.10/24 dev eth1
ip route del default via 192.168.10.1 dev eth1
ip route add default via 192.168.10.1 dev eth1 proto static metric 100systemctl restart arp-preinit.servicenano /etc/systemd/network/79-if-1.network
nano /etc/systemd/network/79-if-2.networksystemctl restart plcnext

拷贝文件

kubectl cp ./pack.zip default/my-pod:/opt/plcnextkubectl exec -it my-pod -c vplcnextcontrol1000 -- bashunzip pack.zipcd packcp -r apps config data projects ../chmod 777 -R /opt/plcnext/apps /opt/plcnext/config /opt/plcnext/data /opt/plcnext/projects

重启系统

systemctl restart plcnext

修正防火墙

systemctl restart firewall-preinit
systemctl restart firewall
systemctl restart plcnext
# now the firewall should work

修正Profinet Device设备

固件里默认NIC0是作为pn的NIC,但是现在NIC1才是macvlan设备,所以要设置为NIC1

nano /etc/plcnext/Device.redefine.acf.settings<EnvironmentVariable name="ARP_SETTING_PN_CONTROLLER_ADAPTER_INDEX" value="1" redefine="true" />
<EnvironmentVariable name="ARP_SETTING_PN_DEVICE_ADAPTER_INDEX" value="1" redefine="true" />change to =><EnvironmentVariable name="ARP_SETTING_PN_CONTROLLER_ADAPTER_INDEX" value="2" redefine="true" />
<EnvironmentVariable name="ARP_SETTING_PN_DEVICE_ADAPTER_INDEX" value="2" redefine="true" />nano /etc/plcnext/device/Io/PnS/PnS.target.config      <Var name="InterfaceName">eth0</Var>change to =><Var name="InterfaceName">eth1</Var>systemctl restart plcnext# check wbm profinet 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPC Client第5讲(wxwidgets):初始界面的事件处理;按照配置文件初始化界面的内容

接上一讲&#xff0c;即实现下述界面的事件处理代码&#xff1b;并且按照配置文件初始化界面的内容&#xff08;三、&#xff09; 事件处理的基础知识&#xff0c;见下述链接五、 OPC Client第3讲&#xff08;wxwidgets&#xff09;&#xff1a;wxFormBuilder&#xff1b;基础…

从乳制品行业转型看智能化升级新机遇——兼谈R²AIN SUITE的赋能实践

一、市场现状&#xff1a;乳制品行业迎来智能化转型关键期 中国乳制品行业在经历高速增长与深度调整后&#xff0c;已进入以"安全、效率、创新"为核心的新发展阶段。根据施耐德电气白皮书数据显示&#xff0c;2019年乳制品合格率达99.8%[1]&#xff0c;液态奶占据77…

[20250522]目前市场上主流AI开发板及算法盒子的芯片配置、架构及支持的AI推理框架的详细梳理

目前市场上主流AI开发板及算法盒子的芯片配置、架构及支持的AI推理框架的详细梳理

【Golang笔记03】error、panic、fatal错误处理学习笔记

Golang笔记&#xff1a;错误处理学习笔记 一、进阶学习 1.1、错误&#xff08;异常处理&#xff09; Go语言中也有和Java中的异常处理相关的机制&#xff0c;不过&#xff0c;在Go里面不叫异常&#xff0c;而是叫做&#xff1a;错误。错误分为三类&#xff0c;分别是&#x…

Python可视化设计原则

在数据驱动的时代&#xff0c;可视化不仅是结果的呈现方式&#xff0c;更是数据故事的核心载体。Python凭借其丰富的生态库&#xff08;Matplotlib/Seaborn/Plotly等&#xff09;&#xff0c;已成为数据可视化领域的主力工具。但工具只是起点&#xff0c;真正让图表产生价值的&…

​​WPF入门与XAML基础:从零开始构建你的第一个WPF应用​

从零开始构建你的第一个WPF应用​ 1.什么是WPF&#xff1f;​​2.开发环境搭建​​2.1 安装Visual Studio​​2.2 创建第一个WPF项目​​ 3. WPF项目结构解析​​​​3.1 MainWindow.xaml​​3.2 MainWindow.xaml.cs​​ 4. XAML基础语法​​4.1 属性赋值方式​​4.2 命名空间&…

电子电气架构 --- 下一代汽车电子电气架构中的连接性

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

学习日记-day13-5.22

完成目标&#xff1a; 知识点&#xff1a; 1.抽象注意事项 知识点 核心内容 重点 抽象类实例化限制 抽象类不能直接实例化对象&#xff0c;只能创建非抽象子类的对象 尝试实例化抽象类会触发编译错误 抽象方法与抽象类关系 抽象类不一定包含抽象方法&#xff0c;但含…

华硕无畏Pro14 2025,打造舒适办公新体验

在快节奏、高效率的现代办公环境中&#xff0c;一台得心应手的笔记本无疑是每位职场人士的“第二大脑”与核心生产力工具。它不仅需要承载日常工作的繁杂事务&#xff0c;更要在关键时刻稳定输出&#xff0c;助力我们从容应对各种挑战。 洞悉此需求&#xff0c;华硕推出了全新…

重写B站(网页、后端、小程序)

1. 网页端 1.1 框架 Vue ElementUI axios 1.2 框架搭建步骤 搭建Vue 1.3 配置文件 main.js import {createApp} from vue import ElementUi from element-plus import element-plus/dist/index.css; import axios from "axios"; import router from…

MySQL数据 在 磁盘上是什么样子的

MySQL数据 在 磁盘上是什么样子的&#xff0c;取决于所使用的存储引擎。存储于引擎 是作用在 表! 上的。 存储引擎 百度百科是这样定义存储引擎的&#xff1a;MySQL 中的数据用各种不同的技术存储在文件&#xff08;或者内存&#xff09;中&#xff0c;这些不同的技术以及配套…

MySQL的相关操作

目录 一. 字符串函数 二. group by分组 2.1 作用 2.2 格式 2.3 举例 三. order by排序 3.1 格式 3.2 举例 四. limit 4.1 作用 4.2 举例 五. having 5.1 作用 5.2 举例 六. 正则表达式 七. 多表查询 7.1 定义 7.2 子查询 7.3 联合查询 纵向合并 7.4 交叉连…

网络安全-等级保护(等保) 2-7-3 GB/T 25058—2019 第7章 安全设计与实施

############################################################################### 对于安全厂家而言&#xff0c;最关心的内容在本章节&#xff0c;根据已确定的安全总体方案&#xff0c;完成技术措施和管理措施的详细设计和实施&#xff0c;包含具体的安全产品和管理要求。…

【Spring Boot】配置实战指南:Properties与YML的深度对比与最佳实践

目录 1.前言 2.正文 2.1配置文件的格式 2.2properties 2.2.1基础语法 2.2.2value读取配置文件 2.2.3缺点 2.3yml 2.3.1基础语法 2.3.2配置不同数据类型 2.3.3配置读取 2.3.4配置对象和集合 2.3.5优缺点 2.4综合练习&#xff1a;验证码案例 2.4.1分析需求 2.4.2…

20250519使用TF卡将NanoPi NEO core开发板刷机为Ubuntu core22.04.3系统完成之后执行poweroff自动关机

1、h3-sd-friendlycore-xenial-4.14-armhf-20210618.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5_WinE…

编译Qt5.15.16并启用pdf模块

编译Qt5.15.16并启用pdf模块 标题1.目录设置 -q-bulid –qt-everywhere-src-5.15.16 –bulid cd bulid 必须&#xff0c;否则会提示Project ERROR: You cannot configure qt separately within a top-level build. create .qmake.stash and .qmake.super in build folder …

“智”斗秸秆焚烧,考拉悠然以科技之力筑牢生态安全防线

清晨&#xff0c;薄雾笼罩着辽阔的田野&#xff0c;农民们开始了一天的劳作。然而&#xff0c;随着收割季的到来&#xff0c;秸秆焚烧问题也逐渐浮现&#xff0c;成为威胁空气质量与生态安全的隐患。传统监管方式往往显得力不从心&#xff0c;效率低下的困境亟待突破。在此背景…

Nockchain项目部署教程

Nockchain头矿窗口正在打开&#xff0c;不拼设备&#xff0c;现在部署&#xff0c;马上就要开挖了。 一、项目介绍 Nockchain 是结合了POW和ZKVM的区块链协议。 主要特点&#xff1a; 1&#xff09;计算存储新域名空间三位一体架构&#xff0c;高吞吐量 2&#xff09;使用No…

2025年气候持续大风,消纳减少,如何保收益?东润能源整体解决方案持续保收益保增长

引言 随着全球气候变化加剧,2025年极端天气频发,风资源丰富但电网消纳能力不足的问题日益突出,导致许多风电项目面临限电、收益下滑的挑战。如何在复杂的气候和电力市场环境下保障投资收益,成为行业关注的焦点。东润能源凭借领先的技术创新和综合能源解决方案,为风电行业…

2023河南CCPC省赛vp部分补题

A 模拟 暴力 对每个合法的前缀&#xff0c;判断后缀是不是合法 int a[29]; void solve(){string s;cin>>s;int t-1;if(s.size()1){return cout<<"NaN"<<endl,void();}for(int i0;i<27;i) a[i]0;for(int i0;i<s.size();i){a[s[i]-a];if(…