OCP 4.18 + NeuVector 5.4.1
:::warning
Image請用最新的stable版本。
請先push image到客戶指定的registry。
:::
# 1.建立相關的project、account
```shell=
oc create sa controller -n neuvector
oc create sa enforcer -n neuvector
oc create sa basic -n neuvector
oc create sa updater -n neuvector
oc create sa scanner -n neuvector
oc create sa registry-adapter -n neuvector
oc create sa cert-upgrader -n neuvector
oc -n neuvector adm policy add-scc-to-user privileged -z enforcer
serviceaccount/controller created
serviceaccount/enforcer created
serviceaccount/basic created
serviceaccount/updater created
serviceaccount/scanner created
serviceaccount/registry-adapter created
serviceaccount/cert-upgrader created
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "enforcer"
```
# 2.建立NeuVector controller與設定組態。
```yaml=
allowHostDirVolumePlugin: false
allowHostIPC: false
allowHostNetwork: false
allowHostPID: false
allowHostPorts: false
allowPrivilegeEscalation: false
allowPrivilegedContainer: false
allowedCapabilities: null
apiVersion: security.openshift.io/v1
defaultAddCapabilities: null
fsGroup:
type: RunAsAny
groups: []
kind: SecurityContextConstraints
metadata:
name: neuvector-scc-controller
priority: null
readOnlyRootFilesystem: false
requiredDropCapabilities:
- ALL
runAsUser:
type: RunAsAny
seLinuxContext:
type: RunAsAny
supplementalGroups:
type: RunAsAny
users: []
volumes:
- configMap
- downwardAPI
- emptyDir
- persistentVolumeClaim
- azureFile
- projected
- secret
```
**建立SCC**
```shell=
oc apply -f neuvector-scc-controller.yaml
securitycontextconstraints.security.openshift.io/neuvector-scc-controller created
```
# 3.設定相關的role
```shell=
oc -n neuvector adm policy add-scc-to-user neuvector-scc-controller -z controller
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:neuvector-scc-controller added: "controller"
oc get rolebinding system:openshift:scc:privileged -n neuvector -o wide
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS
system:openshift:scc:privileged ClusterRole/system:openshift:scc:privileged 9m3s neuvector/enforcer
oc get rolebinding system:openshift:scc:neuvector-scc-controller -n neuvector -o wide
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS
system:openshift:scc:neuvector-scc-controller ClusterRole/system:openshift:scc:neuvector-scc-controller 2m6s neuvector/controller
```
# 4.建立相關的CRD
```shell=
# oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/crd-k8s-1.19.yaml
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/waf-crd-k8s-1.19.yaml
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/dlp-crd-k8s-1.19.yaml
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/com-crd-k8s-1.19.yaml
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/vul-crd-k8s-1.19.yaml
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/admission-crd-k8s-1.19.yaml
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/5.4.3_group-definition-k8s.yaml
customresourcedefinition.apiextensions.k8s.io/nvsecurityrules.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvclustersecurityrules.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvwafsecurityrules.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvdlpsecurityrules.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvcomplianceprofiles.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvvulnerabilityprofiles.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvadmissioncontrolsecurityrules.neuvector.com created
customresourcedefinition.apiextensions.k8s.io/nvgroupdefinitions.neuvector.com created
```
# 5.建立相關所需帳號與rolebinding...等。
:::info
請注意第28行的檔案,如果有下載定義檔的話請修改路徑。
:::
```shell=
oc create clusterrole neuvector-binding-app --verb=get,list,watch,update --resource=nodes,pods,services,namespaces
oc create clusterrole neuvector-binding-rbac --verb=get,list,watch --resource=rolebindings.rbac.authorization.k8s.io,roles.rbac.authorization.k8s.io,clusterrolebindings.rbac.authorization.k8s.io,clusterroles.rbac.authorization.k8s.io,imagestreams.image.openshift.io
oc adm policy add-cluster-role-to-user neuvector-binding-app system:serviceaccount:neuvector:controller
oc adm policy add-cluster-role-to-user neuvector-binding-rbac system:serviceaccount:neuvector:controller
oc create clusterrole neuvector-binding-admission --verb=get,list,watch,create,update,delete --resource=validatingwebhookconfigurations,mutatingwebhookconfigurations
oc adm policy add-cluster-role-to-user neuvector-binding-admission system:serviceaccount:neuvector:controller
oc create clusterrole neuvector-binding-customresourcedefinition --verb=watch,create,get,update --resource=customresourcedefinitions
oc adm policy add-cluster-role-to-user neuvector-binding-customresourcedefinition system:serviceaccount:neuvector:controller
oc create clusterrole neuvector-binding-nvsecurityrules --verb=get,list,delete --resource=nvsecurityrules,nvclustersecurityrules
oc create clusterrole neuvector-binding-nvadmissioncontrolsecurityrules --verb=get,list,delete --resource=nvadmissioncontrolsecurityrules
oc create clusterrole neuvector-binding-nvdlpsecurityrules --verb=get,list,delete --resource=nvdlpsecurityrules
oc create clusterrole neuvector-binding-nvwafsecurityrules --verb=get,list,delete --resource=nvwafsecurityrules
oc adm policy add-cluster-role-to-user neuvector-binding-nvsecurityrules system:serviceaccount:neuvector:controller
oc adm policy add-cluster-role-to-user view system:serviceaccount:neuvector:controller --rolebinding-name=neuvector-binding-view
oc adm policy add-cluster-role-to-user neuvector-binding-nvwafsecurityrules system:serviceaccount:neuvector:controller
oc adm policy add-cluster-role-to-user neuvector-binding-nvadmissioncontrolsecurityrules system:serviceaccount:neuvector:controller
oc adm policy add-cluster-role-to-user neuvector-binding-nvdlpsecurityrules system:serviceaccount:neuvector:controller
oc create role neuvector-binding-scanner --verb=get,patch,update,watch --resource=deployments -n neuvector
oc adm policy add-role-to-user neuvector-binding-scanner system:serviceaccount:neuvector:updater system:serviceaccount:neuvector:controller -n neuvector --role-namespace neuvector
oc create clusterrole neuvector-binding-co --verb=get,list --resource=clusteroperators
oc adm policy add-cluster-role-to-user neuvector-binding-co system:serviceaccount:neuvector:enforcer system:serviceaccount:neuvector:controller
oc create role neuvector-binding-secret --verb=get,list,watch --resource=secrets -n neuvector
oc adm policy add-role-to-user neuvector-binding-secret system:serviceaccount:neuvector:controller system:serviceaccount:neuvector:enforcer system:serviceaccount:neuvector:scanner system:serviceaccount:neuvector:registry-adapter -n neuvector --role-namespace neuvector
oc create clusterrole neuvector-binding-nvcomplianceprofiles --verb=get,list,delete --resource=nvcomplianceprofiles
oc create clusterrolebinding neuvector-binding-nvcomplianceprofiles --clusterrole=neuvector-binding-nvcomplianceprofiles --serviceaccount=neuvector:controller
oc create clusterrole neuvector-binding-nvvulnerabilityprofiles --verb=get,list,delete --resource=nvvulnerabilityprofiles
oc create clusterrolebinding neuvector-binding-nvvulnerabilityprofiles --clusterrole=neuvector-binding-nvvulnerabilityprofiles --serviceaccount=neuvector:controller
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/neuvector-roles-k8s.yaml
oc create role neuvector-binding-lease --verb=create,get,update --resource=leases -n neuvector
oc adm policy add-role-to-user neuvector-binding-cert-upgrader system:serviceaccount:neuvector:cert-upgrader -n neuvector --role-namespace neuvector
oc adm policy add-role-to-user neuvector-binding-job-creation system:serviceaccount:neuvector:cert-upgrader -n neuvector --role-namespace neuvector
oc adm policy add-role-to-user neuvector-binding-lease system:serviceaccount:neuvector:controller system:serviceaccount:neuvector:cert-upgrader -n neuvector --role-namespace neuvector
oc create clusterrole neuvector-binding-nvgroupdefinitions --verb=get,list,delete --resource=nvgroupdefinitions
oc create clusterrolebinding neuvector-binding-nvgroupdefinitions --clusterrole=neuvector-binding-nvgroupdefinitions --serviceaccount=neuvector:controller
clusterrole.rbac.authorization.k8s.io/neuvector-binding-app created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-rbac created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-app added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-rbac added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-admission created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-admission added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-customresourcedefinition created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-customresourcedefinition added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvsecurityrules created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvadmissioncontrolsecurityrules created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvdlpsecurityrules created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvwafsecurityrules created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvsecurityrules added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/view added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvwafsecurityrules added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvadmissioncontrolsecurityrules added: "system:serviceaccount:neuvector:controller"
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvdlpsecurityrules added: "system:serviceaccount:neuvector:controller"
role.rbac.authorization.k8s.io/neuvector-binding-scanner created
role.rbac.authorization.k8s.io/neuvector-binding-scanner added: ["system:serviceaccount:neuvector:updater" "system:serviceaccount:neuvector:controller"]
clusterrole.rbac.authorization.k8s.io/neuvector-binding-co created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-co added: ["system:serviceaccount:neuvector:enforcer" "system:serviceaccount:neuvector:controller"]
role.rbac.authorization.k8s.io/neuvector-binding-secret created
role.rbac.authorization.k8s.io/neuvector-binding-secret added: ["system:serviceaccount:neuvector:controller" "system:serviceaccount:neuvector:enforcer" "system:serviceaccount:neuvector:scanner" "system:serviceaccount:neuvector:registry-adapter"]
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvcomplianceprofiles created
clusterrolebinding.rbac.authorization.k8s.io/neuvector-binding-nvcomplianceprofiles created
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvvulnerabilityprofiles created
clusterrolebinding.rbac.authorization.k8s.io/neuvector-binding-nvvulnerabilityprofiles created
role.rbac.authorization.k8s.io/neuvector-binding-cert-upgrader created
role.rbac.authorization.k8s.io/neuvector-binding-job-creation created
role.rbac.authorization.k8s.io/neuvector-binding-lease created
role.rbac.authorization.k8s.io/neuvector-binding-cert-upgrader added: "system:serviceaccount:neuvector:cert-upgrader"
role.rbac.authorization.k8s.io/neuvector-binding-job-creation added: "system:serviceaccount:neuvector:cert-upgrader"
role.rbac.authorization.k8s.io/neuvector-binding-lease added: ["system:serviceaccount:neuvector:controller" "system:serviceaccount:neuvector:cert-upgrader"]
clusterrole.rbac.authorization.k8s.io/neuvector-binding-nvgroupdefinitions created
clusterrolebinding.rbac.authorization.k8s.io/neuvector-binding-nvgroupdefinitions created
```
# 6.確認相關帳號、角色等等是否已經建立完全。
```shell=
oc get ClusterRoleBinding neuvector-binding-app neuvector-binding-rbac neuvector-binding-admission neuvector-binding-customresourcedefinition neuvector-binding-nvsecurityrules neuvector-binding-view neuvector-binding-nvwafsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules neuvector-binding-co -o wide
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS
neuvector-binding-app ClusterRole/neuvector-binding-app 55s neuvector/controller
neuvector-binding-rbac ClusterRole/neuvector-binding-rbac 54s neuvector/controller
neuvector-binding-admission ClusterRole/neuvector-binding-admission 54s neuvector/controller
neuvector-binding-customresourcedefinition ClusterRole/neuvector-binding-customresourcedefinition 54s neuvector/controller
neuvector-binding-nvsecurityrules ClusterRole/neuvector-binding-nvsecurityrules 53s neuvector/controller
neuvector-binding-view ClusterRole/view 52s neuvector/controller
neuvector-binding-nvwafsecurityrules ClusterRole/neuvector-binding-nvwafsecurityrules 52s neuvector/controller
neuvector-binding-nvadmissioncontrolsecurityrules ClusterRole/neuvector-binding-nvadmissioncontrolsecurityrules 52s neuvector/controller
neuvector-binding-nvdlpsecurityrules ClusterRole/neuvector-binding-nvdlpsecurityrules 52s neuvector/controller
neuvector-binding-co ClusterRole/neuvector-binding-co 51s neuvector/enforcer, neuvector/controller
oc get RoleBinding neuvector-binding-scanner neuvector-binding-cert-upgrader neuvector-binding-job-creation neuvector-binding-lease neuvector-binding-secret -n neuvector -o wide
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS
neuvector-binding-scanner Role/neuvector-binding-scanner 96s neuvector/updater, neuvector/controller
neuvector-binding-cert-upgrader Role/neuvector-binding-cert-upgrader 94s neuvector/cert-upgrader
neuvector-binding-job-creation Role/neuvector-binding-job-creation 93s neuvector/cert-upgrader
neuvector-binding-lease Role/neuvector-binding-lease 93s neuvector/controller, neuvector/cert-upgrader
neuvector-binding-secret Role/neuvector-binding-secret 96s neuvector/controller, neuvector/enforcer, neuvector/scanner, neuvector/registry-adapter
```
# 7.建立federate service(如果有需要的話)
```shell=
[root@bastion ~]# vim federate.yaml
[root@bastion ~]# oc create -f federate.yaml
service/neuvector-service-controller-fed-master created
service/neuvector-service-controller-fed-worker created
```
**federate.yaml**
```yaml=
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-controller-fed-master
namespace: neuvector
spec:
ports:
- port: 11443
name: fed
protocol: TCP
type: LoadBalancer
selector:
app: neuvector-controller-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-controller-fed-worker
namespace: neuvector
spec:
ports:
- port: 10443
name: fed
protocol: TCP
type: LoadBalancer
selector:
app: neuvector-controller-pod
```
# 8.建立NeuVector
```shell=
[root@bastion ~]# vim neuvector.yaml
[root@bastion ~]# oc create -f neuvector.yaml
service/neuvector-svc-crd-webhook created
service/neuvector-svc-admission-webhook created
service/neuvector-service-webui created
service/neuvector-svc-controller created
route.route.openshift.io/neuvector-route-webui created
deployment.apps/neuvector-manager-pod created
deployment.apps/neuvector-controller-pod created
Warning: spec.template.metadata.annotations[container.apparmor.security.beta.kubernetes.io/neuvector-enforcer-pod]: deprecated since v1.30; use the "appArmorProfile" field instead
daemonset.apps/neuvector-enforcer-pod created
deployment.apps/neuvector-scanner-pod created
cronjob.batch/neuvector-updater-pod created
```
**neuvector.yaml**
:::spoiler
```yaml=
apiVersion: v1
kind: Service
metadata:
name: neuvector-svc-crd-webhook
namespace: neuvector
spec:
ports:
- port: 443
targetPort: 30443
protocol: TCP
name: crd-webhook
type: ClusterIP
selector:
app: neuvector-controller-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-svc-admission-webhook
namespace: neuvector
spec:
ports:
- port: 443
targetPort: 20443
protocol: TCP
name: admission-webhook
type: ClusterIP
selector:
app: neuvector-controller-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-webui
namespace: neuvector
spec:
ports:
- port: 8443
name: manager
protocol: TCP
type: ClusterIP
selector:
app: neuvector-manager-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-svc-controller
namespace: neuvector
spec:
ports:
- port: 18300
protocol: "TCP"
name: "cluster-tcp-18300"
- port: 18301
protocol: "TCP"
name: "cluster-tcp-18301"
- port: 18301
protocol: "UDP"
name: "cluster-udp-18301"
clusterIP: None
selector:
app: neuvector-controller-pod
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: neuvector-route-webui
namespace: neuvector
spec:
to:
kind: Service
name: neuvector-service-webui
port:
targetPort: manager
tls:
termination: passthrough
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: neuvector-manager-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-manager-pod
replicas: 1
template:
metadata:
labels:
app: neuvector-manager-pod
spec:
serviceAccountName: basic
serviceAccount: basic
containers:
- name: neuvector-manager-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/manager:<version>
env:
- name: CTRL_SERVER_IP
value: neuvector-svc-controller.neuvector
restartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: neuvector-controller-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-controller-pod
minReadySeconds: 60
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 3
template:
metadata:
labels:
app: neuvector-controller-pod
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- neuvector-controller-pod
topologyKey: "kubernetes.io/hostname"
serviceAccountName: controller
serviceAccount: controller
containers:
- name: neuvector-controller-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/controller:<version>
securityContext:
runAsUser: 0
readinessProbe:
exec:
command:
- cat
- /tmp/ready
initialDelaySeconds: 5
periodSeconds: 5
env:
- name: CLUSTER_JOIN_ADDR
value: neuvector-svc-controller.neuvector
- name: CLUSTER_ADVERTISED_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: CLUSTER_BIND_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
# - name: CTRL_PERSIST_CONFIG
# value: "1"
volumeMounts:
# - mountPath: /var/neuvector
# name: nv-share
# readOnly: false
- mountPath: /etc/config
name: config-volume
readOnly: true
terminationGracePeriodSeconds: 300
restartPolicy: Always
volumes:
# - name: nv-share
# persistentVolumeClaim:
# claimName: neuvector-data
- name: config-volume
projected:
sources:
- configMap:
name: neuvector-init
optional: true
- secret:
name: neuvector-init
optional: true
- secret:
name: neuvector-secret
optional: true
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: neuvector-enforcer-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-enforcer-pod
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: neuvector-enforcer-pod
annotations:
container.apparmor.security.beta.kubernetes.io/neuvector-enforcer-pod: unconfined
# Add the following for pre-v1.19
# container.seccomp.security.alpha.kubernetes.io/neuvector-enforcer-pod: unconfined
spec:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
hostPID: true
serviceAccountName: enforcer
serviceAccount: enforcer
containers:
- name: neuvector-enforcer-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/enforcer:<version>
securityContext:
# openshift
seLinuxOptions:
type: unconfined_t
# the following two lines are required for k8s v1.19+. pls comment out both lines if version is pre-1.19. Otherwise, a validating data error message will show
seccompProfile:
type: Unconfined
capabilities:
add:
- SYS_ADMIN
- NET_ADMIN
- SYS_PTRACE
- IPC_LOCK
- NET_RAW
- SYS_CHROOT
- MKNOD
- AUDIT_WRITE
- SETFCAP
env:
- name: CLUSTER_JOIN_ADDR
value: neuvector-svc-controller.neuvector
- name: CLUSTER_ADVERTISED_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: CLUSTER_BIND_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- mountPath: /lib/modules
name: modules-vol
readOnly: true
# - mountPath: /run/runtime.sock
# name: runtime-sock
# readOnly: true
# - mountPath: /host/proc
# name: proc-vol
# readOnly: true
# - mountPath: /host/cgroup
# name: cgroup-vol
# readOnly: true
- mountPath: /var/nv_debug
name: nv-debug
readOnly: false
terminationGracePeriodSeconds: 1200
restartPolicy: Always
volumes:
- name: modules-vol
hostPath:
path: /lib/modules
# - name: runtime-sock
# hostPath:
# path: /var/run/crio/crio.sock
# - name: proc-vol
# hostPath:
# path: /proc
# - name: cgroup-vol
# hostPath:
# path: /sys/fs/cgroup
- name: nv-debug
hostPath:
path: /var/nv_debug
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: neuvector-scanner-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-scanner-pod
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 2
template:
metadata:
labels:
app: neuvector-scanner-pod
spec:
serviceAccountName: scanner
serviceAccount: scanner
containers:
- name: neuvector-scanner-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/scanner:<version>
imagePullPolicy: Always
env:
- name: CLUSTER_JOIN_ADDR
value: neuvector-svc-controller.neuvector
restartPolicy: Always
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: neuvector-updater-pod
namespace: neuvector
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: neuvector-updater-pod
spec:
serviceAccountName: updater
serviceAccount: updater
containers:
- name: neuvector-updater-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/updater:<version>
imagePullPolicy: Always
command:
- /bin/sh
- -c
- TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`; /usr/bin/curl -kv -X PATCH -H "Authorization:Bearer $TOKEN" -H "Content-Type:application/strategic-merge-patch+json" -d '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'`date +%Y-%m-%dT%H:%M:%S%z`'"}}}}}' 'https://kubernetes.default/apis/apps/v1/namespaces/neuvector/deployments/neuvector-scanner-pod'
restartPolicy: Never
```
:::
# 9.確認連線資訊
:::info
連線時請注意您所使用的本機是否有設定正確的hosts指向到NeuVector URL。
:::
```shell=
oc get svc,route -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/neuvector-service-controller-fed-master NodePort 172.30.48.236 <none> 11443:32007/TCP 20h app=neuvector-controller-pod
service/neuvector-service-controller-fed-worker NodePort 172.30.196.154 <none> 10443:32455/TCP 20h app=neuvector-controller-pod
service/neuvector-service-webui ClusterIP 172.30.146.255 <none> 8443/TCP 20h app=neuvector-manager-pod
service/neuvector-svc-admission-webhook ClusterIP 172.30.6.62 <none> 443/TCP 20h app=neuvector-controller-pod
service/neuvector-svc-controller ClusterIP None <none> 18300/TCP,18301/TCP,18301/UDP 20h app=neuvector-controller-pod
service/neuvector-svc-crd-webhook ClusterIP 172.30.36.152 <none> 443/TCP 20h app=neuvector-controller-pod
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/neuvector-route-webui neuvector-route-webui-neuvector.apps.container.demo.com neuvector-service-webui manager passthrough None
```
:::info
如果沒有定義預設帳密的話,請用admin / admin登入
:::
# 10.參考資料與注意事項
[1. 官方文件,照做基本上會成功。](https://open-docs.neuvector.com/deploying/openshift)
:::info
若node有taint,請把相關的pod加上nodeSelector與node label,不然應該會看到daemonSet沒有pod啟動。
:::