Hello mates, I'm developing script deploying whole Kubernetes enviroment + SAS Viya4 locally on one machine. I've done lot of effort to make it work as desired. Finally script is close to be ready and of course like other my "hardcore tasks" to by shared with you.
I know that there is limited support from SAS on custom made clusters so I'm asking you - fellow community for help.
I know that there is limited support from SAS on custom made clusters so I'm asking you - fellow community for help.
The problem I'm facing is that 99% of my pods have "sas-consul-client secret not found", and of course I researched https://support.sas.com/kb/67/349.html , created specified psps and still .. doesn't work.
The biggest mystery is... that all the yamls in site-config, sas-bases, sas-orchestra which are used to deploy ... don't contain creating this secret. There are only SecRefs 😐
Ok, here's my environment:
1. Installed kubelet=$KUBEVERSION kubectl=$KUBEVERSION kubeadm=$KUBEVERSION where KUBEVERSION="1.21.5-00"
2. Turned swap off
3. Installed docker
4. Inited cluster with kubeadm init --pod-network-cidr=$NETWORKCIDR --apiserver-advertise-address=$NETWORKADDR where NETWORKCIDR="192.168.0.0/16" && NETWORKADDR="10.0.110.99"
5. Created PSPs :
- psp-privileged.yaml << EOF
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: privileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
spec:
privileged: true
allowPrivilegeEscalation: true
allowedCapabilities:
- '*'
volumes:
- '*'
hostNetwork: true
hostPorts:
- min: 0
max: 65535
hostIPC: true
hostPID: true
runAsUser:
rule: 'RunAsAny'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
EOF
psp-baseline.yaml << EOF
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: baseline
annotations:
# Optional: Allow the default AppArmor profile, requires setting the default.
apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
spec:
privileged: false
# The moby default capability set, minus NET_RAW
allowedCapabilities:
- 'CHOWN'
- 'DAC_OVERRIDE'
- 'FSETID'
- 'FOWNER'
- 'MKNOD'
- 'SETGID'
- 'SETUID'
- 'SETFCAP'
- 'SETPCAP'
- 'NET_BIND_SERVICE'
- 'SYS_CHROOT'
- 'KILL'
- 'AUDIT_WRITE'
# Allow all volume types except hostpath
volumes:
# 'core' volume types
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
# Assume that ephemeral CSI drivers & persistentVolumes set up by the cluster admin are safe to use.
- 'csi'
- 'persistentVolumeClaim'
- 'ephemeral'
# Allow all other non-hostpath volume types.
- 'awsElasticBlockStore'
- 'azureDisk'
- 'azureFile'
- 'cephFS'
- 'cinder'
- 'fc'
- 'flexVolume'
- 'flocker'
- 'gcePersistentDisk'
- 'gitRepo'
- 'glusterfs'
- 'iscsi'
- 'nfs'
- 'photonPersistentDisk'
- 'portworxVolume'
- 'quobyte'
- 'rbd'
- 'scaleIO'
- 'storageos'
- 'vsphereVolume'
hostNetwork: false
hostIPC: false
hostPID: false
readOnlyRootFilesystem: false
runAsUser:
rule: 'RunAsAny'
seLinux:
# This policy assumes the nodes are using AppArmor rather than SELinux.
# The PSP SELinux API cannot express the SELinux Pod Security Standards,
# so if using SELinux, you must choose a more restrictive default.
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
EOF
psp-restricted.yaml << EOF
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'
apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
spec:
privileged: false
# Required to prevent escalations to root.
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
# Allow core volume types.
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
# Assume that ephemeral CSI drivers & persistentVolumes set up by the cluster admin are safe to use.
- 'csi'
- 'persistentVolumeClaim'
- 'ephemeral'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
# Require the container to run without root privileges.
rule: 'MustRunAsNonRoot'
seLinux:
# This policy assumes the nodes are using AppArmor rather than SELinux.
rule: 'RunAsAny'
supplementalGroups:
rule: 'MustRunAs'
ranges:
# Forbid adding the root group.
- min: 1
max: 65535
fsGroup:
rule: 'MustRunAs'
ranges:
# Forbid adding the root group.
- min: 1
max: 65535
readOnlyRootFilesystem: false
EOF6. Installed Calico, Metallb, Ingress
7. Created NFS Server and NFS Subdir Provisioner
8. Downloaded and created ARK-Report (in attachment)
9. Installed cert-manager and custom CA autority
1. Created directory structure for sasoperator and sas deployment
2. Successfully deployed sasoperator
3. Created kustomization.yaml for site-deployment
namespace: {{ NAME-OF-NAMESPACE }}
resources:
- sas-bases/base
- sas-bases/overlays/cert-manager-issuer
- sas-bases/overlays/network/networking.k8s.io
- sas-bases/overlays/cas-server
- sas-bases/overlays/internal-postgres
# If your deployment contains programming-only offerings only, comment out the next line
- sas-bases/overlays/internal-elasticsearch
- sas-bases/overlays/update-checker
- sas-bases/overlays/cas-server/auto-resources
configurations:
- sas-bases/overlays/required/kustomizeconfig.yaml
transformers:
# If your deployment does not support privileged containers or if your deployment
# contains programming-only offerings, comment out the next line
- sas-bases/overlays/internal-elasticsearch/sysctl-transformer.yaml
- sas-bases/overlays/required/transformers.yaml
- site-config/security/cert-manager-provided-ingress-certificate.yaml
- sas-bases/overlays/cas-server/auto-resources/remove-resources.yaml
# If your deployment contains programming-only offerings only, comment out the next line
- sas-bases/overlays/internal-elasticsearch/internal-elasticsearch-transformer.yaml
# Mount information
# - site-config/{{ DIRECTORY-PATH }}/cas-add-host-mount.yaml
components:
- sas-bases/components/security/core/base/full-stack-tls
- sas-bases/components/security/network/networking.k8s.io/ingress/nginx.ingress.kubernetes.io/full-stack-tls
patches:
- path: site-config/storageclass.yaml
target:
kind: PersistentVolumeClaim
annotationSelector: sas.com/component-name in (sas-backup-job,sas-data-quality-services,sas-commonfiles,sas-cas-operator,sas-pyconfig)
# License information
# secretGenerator:
# - name: sas-license
# type: sas.com/license
# behavior: merge
# files:
# - SAS_LICENSE=license.jwt
configMapGenerator:
- name: ingress-input
behavior: merge
literals:
- INGRESS_HOST={{ NAME-OF-INGRESS-HOST }}
- name: sas-shared-config
behavior: merge
literals:
- SAS_SERVICES_URL=https://{{ NAME-OF-INGRESS-HOST }}:{{ PORT }}
# - SAS_URL_EXTERNAL_VIYA={{ EXTERNAL-PROXY-URL }}
EOFChanged values and finally kustomization.yaml looks like :
namespace: sasoperator
resources:
- sas-bases/base
- sas-bases/overlays/cert-manager-issuer
- sas-bases/overlays/network/networking.k8s.io
- sas-bases/overlays/cas-server
- sas-bases/overlays/internal-postgres
# If your deployment contains programming-only offerings only, comment out the next line
- sas-bases/overlays/internal-elasticsearch
- sas-bases/overlays/update-checker
configurations:
- sas-bases/overlays/required/kustomizeconfig.yaml
transformers:
# If your deployment does not support privileged containers or if your deployment
# contains programming-only offerings, comment out the next line
- sas-bases/overlays/internal-elasticsearch/sysctl-transformer.yaml
- sas-bases/overlays/required/transformers.yaml
- site-config/security/cert-manager-provided-ingress-certificate.yaml
# If your deployment contains programming-only offerings only, comment out the next line
- sas-bases/overlays/internal-elasticsearch/internal-elasticsearch-transformer.yaml
# Mount information
# - site-config/{{ DIRECTORY-PATH }}/cas-add-host-mount.yaml
components:
- sas-bases/components/security/core/base/full-stack-tls
- sas-bases/components/security/network/networking.k8s.io/ingress/nginx.ingress.kubernetes.io/full-stack-tls
patches:
- path: site-config/storageclass.yaml
target:
kind: PersistentVolumeClaim
annotationSelector: sas.com/component-name in (sas-backup-job,sas-data-quality-services,sas-commonfiles,sas-cas-operator,sas-pyconfig)
# License information
# secretGenerator:
# - name: sas-license
# type: sas.com/license
# behavior: merge
# files:
# - SAS_LICENSE=license.jwt
configMapGenerator:
- name: ingress-input
behavior: merge
literals:
- INGRESS_HOST=vmkub01.local
- name: sas-shared-config
behavior: merge
literals:
- SAS_SERVICES_URL=https://vmkub01.local:443
# - SAS_URL_EXTERNAL_VIYA={{ EXTERNAL-PROXY-URL }}Pulled ark
docker pull cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-orchestration:1.64.0-20211012.1634057996496
docker tag cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-orchestration:1.64.0-20211012.1634057996496 sas-orchestration
created .yaml deployment with ark
docker run --rm \ -v $(pwd):/tmp/files \ sas-orchestration \ create sas-deployment-cr \ --deployment-data /tmp/files/$CERTS \ --license /tmp/files/$LICENCE \ --user-content /tmp/files/deploy \ --cadence-name $CADENCE \ --cadence-version $CADENCEVERSION \ > viya4-sasdeployment.yaml
where
export LICENCE="SASViyaV4_9xxxx_0_stable_2021.1.6_license_2021-10-21T071701.jwt" export CERTS="SASViyaV4_9xxxx_certs.zip" export SASNAMESPACE="sasoperator" export CADENCE="stable" export CADENCEVERSION="2021.1.6"
and file looks like (without certs and license ofc):
---
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: null
name: sas-viya
stringData:
cacert: |
-----BEGIN CERTIFICATE-----
xxx
-----END CERTIFICATE-----
cert: |
-----BEGIN RSA PRIVATE KEY-----
xxxx
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
xxx
-----END CERTIFICATE-----
license:
xxx
---
apiVersion: orchestration.sas.com/v1alpha1
kind: SASDeployment
metadata:
annotations:
operator.sas.com/checksum: ""
creationTimestamp: null
name: sas-viya
spec:
caCertificate:
secretKeyRef:
key: cacert
name: sas-viya
cadenceName: stable
cadenceVersion: 2021.1.6
clientCertificate:
secretKeyRef:
key: cert
name: sas-viya
license:
secretKeyRef:
key: license
name: sas-viya
repositoryWarehouse:
updatePolicy: Never
userContent:
files:
kustomization.yaml: |
namespace: sasoperator
resources:
- sas-bases/base
- sas-bases/overlays/cert-manager-issuer
- sas-bases/overlays/network/networking.k8s.io
- sas-bases/overlays/cas-server
- sas-bases/overlays/internal-postgres
# If your deployment contains programming-only offerings only, comment out the next line
- sas-bases/overlays/internal-elasticsearch
- sas-bases/overlays/update-checker
configurations:
- sas-bases/overlays/required/kustomizeconfig.yaml
transformers:
# If your deployment does not support privileged containers or if your deployment
# contains programming-only offerings, comment out the next line
- sas-bases/overlays/internal-elasticsearch/sysctl-transformer.yaml
- sas-bases/overlays/required/transformers.yaml
- site-config/security/cert-manager-provided-ingress-certificate.yaml
# If your deployment contains programming-only offerings only, comment out the next line
- sas-bases/overlays/internal-elasticsearch/internal-elasticsearch-transformer.yaml
# Mount information
# - site-config/{{ DIRECTORY-PATH }}/cas-add-host-mount.yaml
components:
- sas-bases/components/security/core/base/full-stack-tls
- sas-bases/components/security/network/networking.k8s.io/ingress/nginx.ingress.kubernetes.io/full-stack-tls
patches:
- path: site-config/storageclass.yaml
target:
kind: PersistentVolumeClaim
annotationSelector: sas.com/component-name in (sas-backup-job,sas-data-quality-services,sas-commonfiles,sas-cas-operator,sas-pyconfig)
# License information
# secretGenerator:
# - name: sas-license
# type: sas.com/license
# behavior: merge
# files:
# - SAS_LICENSE=license.jwt
configMapGenerator:
- name: ingress-input
behavior: merge
literals:
- INGRESS_HOST=vmkub01.local
- name: sas-shared-config
behavior: merge
literals:
- SAS_SERVICES_URL=https://vmkub01.local:443
# - SAS_URL_EXTERNAL_VIYA={{ EXTERNAL-PROXY-URL }}
sas-bases: ""
site-config/security/cert-manager-provided-ingress-certificate.yaml: "## Example PatchTransformer to patch the secret used by nginx ingress objects\n##\n## In the following code, the locations that require user specified values are indicated by a capitalized and\n## hyphenated name set off by curly braces and a space at each end. You should replace this token with the \n## actual value.\n## Replace the curly braces, interior spaces, and the variable name.\n## For instance, \"sas-viya-issuer\"\n## should be replaced with the name of the cert-manager issuer that will issue certificates used to make\n## TLS connections to the SAS Viya applications, such as sas-viya-issuer.\n## If you use the suggested example, the correct, final syntax would be:\n## value: sas-viya-issuer\n##\n##\n---\napiVersion: builtin\nkind: PatchTransformer\nmetadata:\n name: sas-cert-manager-ingress-annotation-transformer\npatch: |-\n - op: add\n path: /metadata/annotations/cert-manager.io~1issuer\n value: sas-viya-issuer # name of the cert-manager issuer that will supply the Ingress cert, such as sas-viya-issuer\ntarget:\n kind: Ingress\n name: .*"
site-config/storageclass.yaml: |
kind: RWXStorageClass
metadata:
name: wildcard
spec:
storageClassName: nfs-clientthen :
kubectl apply -f viya4-sasdeployment.yaml -n sasoperator
finally got :
NAME STATE CADENCENAME CADENCEVERSION CADENCERELEASE AGE sas-viya SUCCEEDED stable 2021.1.6 20211029.1635519350329 7h8m
but:
sas-model-management-c894776d9-dsvww 0/1 Init:CreateContainerConfigError 0 7h53m sas-model-manager-app-795848d4db-f9tx5 0/1 CreateContainerConfigError 0 7h53m sas-model-publish-f4f9f5d7d-c7hrc 0/1 Init:CreateContainerConfigError 0 7h53m sas-model-repository-86f4b6cb47-gwddw 0/1 CreateContainerConfigError 0 7h53m sas-model-studio-app-5bd79dfdb-7kwxz 0/1 CreateContainerConfigError 0 7h53m sas-natural-language-conversations-576674865d-wssnw 0/1 CreateContainerConfigError 0 7h53m sas-natural-language-generation-5bc9f5b9-28cq9 0/1 CreateContainerConfigError 0 7h53m sas-natural-language-understanding-64d776d46b-j9wkt 0/1 CreateContainerConfigError 0 7h53m sas-notifications-554875b7d5-99446 0/1 Init:CreateContainerConfigError 0 7h53m sas-office-addin-app-5fc7d68d96-v5rr7 0/1 CreateContainerConfigError 0 7h53m sas-opendistro-operator-56f45fb488-lsqkw 0/1 CreateContainerConfigError 0 7h53m sas-parse-execution-provider-54b6567f59-rrhwv 0/1 CreateContainerConfigError 0 7h53m sas-preferences-656d9cd848-87njx 0/1 Init:CreateContainerConfigError 0 7h53m sas-prepull-85c69b74c7-bhgsn 1/1 Running 0 7h54m sas-projects-8955cf56f-v8tf4 0/1 CreateContainerConfigError 0 7h53m sas-pyconfig-j2zgm 0/1 Pending 0 7h53m sas-rabbitmq-server-0 0/1 Pending 0 7h53m sas-rabbitmq-server-1 0/1 Pending 0 7h53m sas-rabbitmq-server-2 0/1 Pending 0 7h53m sas-readiness-78955dc49d-mg8fp 0/1 CreateContainerConfigError 0 7h53m sas-report-distribution-6d6b55ddd5-67mq4 0/1 Init:CreateContainerConfigError 0 7h53m sas-report-execution-7498cf5d86-rrlgz 0/1 CreateContainerConfigError 0 7h53m sas-report-renderer-6fd7d8d5-fkjcd 0/1 CreateContainerConfigError 0 7h53m sas-report-services-group-7d8564487d-txjmq 0/1 CreateContainerConfigError 0 7h53m sas-scheduled-backup-job-27260700-fzmf9 0/2 Pending 0 5h56m sas-scheduler-776d8686c9-v7jml 0/1 CreateContainerConfigError 0 7h53m sas-score-definitions-6bf66dcfd-xn6gw 0/1 Init:CreateContainerConfigError 0 7h53m sas-score-execution-8d96cf55b-twvqk 0/1 Pending 0 7h53m
and all the pods with errors are like this (describe pod) :
Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 35m default-scheduler Successfully assigned sasoperator/sas-conversation-designer-app-646ff4697c-k2xcf to vmkub01 Normal Pulling 35m kubelet Pulling image "cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435" Normal Pulled 34m kubelet Successfully pulled image "cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435" in 59.23941659s Normal Created 34m kubelet Created container sas-certframe Normal Started 34m kubelet Started container sas-certframe Normal Pulling 34m kubelet Pulling image "cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-conversation-designer-app:2.9.1-20211013.1634156561133" Normal Pulled 24m kubelet Successfully pulled image "cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-conversation-designer-app:2.9.1-20211013.1634156561133" in 10m17.950160092s Warning Failed 22m (x11 over 24m) kubelet Error: secret "sas-consul-client" not found Normal Pulled 19s (x110 over 24m) kubelet Container image "cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-conversation-designer-app:2.9.1-20211013.1634156561133" already present on machine
Please help me get rid of this (error ofc :D)
Finally to get rid of this specific problem :
Creation of standalone NFS server should look like :
# NFS : export STORAGEFOLDER="/home/saspodstorage" export NFSRULES="*(rw,sync,no_subtree_check,crossmnt,fsid=0)" # This is most important - world access to share export NFSNETWORK="10.0.110.0/24" # It firewall network subnet for other hosts export NFSSERVER="10.0.110.99" # NFS Server IP
Instalation :
# ---- NFS Server -------------------- sudo apt -y install nfs-kernel-server sudo cat /proc/fs/nfsd/versions sudo mkdir -p /srv/nfs4/nfs-share sudo mkdir -p $STORAGEFOLDER sudo mount --bind $STORAGEFOLDER /srv/nfs4/nfs-share sudo echo "$STORAGEFOLDER /srv/nfs4/nfs-share none bind 0 0" >> /etc/fstab sudo mount -a sudo ufw allow from $NFSNETWORK to any port nfs sudo echo "/srv/nfs4/nfs-share $NFSRULES" >> /etc/exports sudo chmod 777 -R $STORAGEFOLDER sudo exportfs -ar sudo exportfs -v sudo systemctl restart nfs-server # It's important to restart service sleep 1m clear # --------------------------------------------------------
Provisioner (default RBAC is enabled, I got it to work without security tuning just placing it in the same namespace as sasoperator)
# ---- NFS Subdir Subdir External Provisioner -
kubectl create ns sasoperator
echo -e "Rozpoczynam\v instlacje\v NFS \v Subdir \v Subdir \v External \v Provisioner"
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=$NFSSERVER \
--set nfs.path=/srv/nfs4/nfs-share \
--set storageClass.defaultClass=true \
--set storageClass.accessModes=ReadWriteMany \
--namespace sasoperator
# --------------------------------------------------------After giving it some time
tee test-pod.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-client
resources:
requests:
storage: 1Mi
---
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: gcr.io/google_containers/busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
EOF
kubectl apply -f test-pod.yaml -n sasoperator
sleep 1m
kubectl describe pod test-pod -n sasoperatorAnd now sas-consul-client secret is out 🙂
Now I'm facing problem which theoreticly could stop whole idea of single machine deployment - limits of 110 pods per node in k8s..
😉
Did you go through the "Verify" steps of that SAS note? If yes, what was the output?
Hello there (general Kenobi:D)
and the second one
it looks that all of the components are pending BUT , replying to private message from sas mate I've discovered that there is somekind space issue
I'm going to read about this
You can see why a pod is pending using kubectl describe <pod>, in this case it is probably because the PVC for the consul servers is pending. The logs for your nfs-client storage provider might give some insight on why they are pending.
Probably "kubectl -n nfs-client get po" to get the the name of the nfs provisioner pod
then "kubectl -n nfs-client logs <pod_name> | less" to read that log.
$ kubectl -n nfs-client get po
NAME READY STATUS RESTARTS AGE
nfs-subdir-external-provisioner-75c47b46d9-9xvkp 1/1 Running 0 23h $ kubectl -n nfs-client logs nfs-subdir-external-provisioner-75c47b46d9-9xvkp | less
I'm not sure how you are creating your cluster, but those 100% occupied volumes appear to be for snaps (a wholly separate topic) which are essentially separate volumes for application images, I think it's normal for those to be 100%, see this link for more info on that path.
https://snapcraft.io/docs/system-snap-directory
You can use something like this to test your provisioner:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-client
resources:
requests:
storage: 1Mi
---
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: gcr.io/google_containers/busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
Thanks mate, now I see the problem, it's with PersistentVolumeClaim, after that test it came up with :
root@vmkub01:~# kubectl describe pod test-pod -n sasoperator
Name: test-pod
Namespace: sasoperator
Priority: 0
Node: <none>
Labels: <none>
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:
test-pod:
Image: gcr.io/google_containers/busybox:1.24
Port: <none>
Host Port: <none>
Command:
/bin/sh
Args:
-c
touch /mnt/SUCCESS && exit 0 || exit 1
Environment: <none>
Mounts:
/mnt from nfs-pvc (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-fd9g8 (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
nfs-pvc:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: test-claim
ReadOnly: false
kube-api-access-fd9g8:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 39s (x2 over 40s) default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.It look like
root@vmkub01:~# kubectl describe pod sas-consul-server-0 -n sasoperator
Name: sas-consul-server-0
Namespace: sasoperator
Priority: 0
Node: <none>
Labels: app=sas-consul-server
app.kubernetes.io/name=sas-consul-server
controller-revision-hash=sas-consul-server-599b54cc66
sas.com/deployment=sas-viya
statefulset.kubernetes.io/pod-name=sas-consul-server-0
workload.sas.com/class=stateful
Annotations: prometheus.io/scheme: https
sas.com/certificate-file-format: pem
sas.com/component-name: sas-consul-server
sas.com/component-version: 1.310006.0-20211014.1634217840806
sas.com/kustomize-base: base
sas.com/tls-enabled-ports: all
sas.com/tls-mode: full-stack
sas.com/version: 1.310006.0
seccomp.security.alpha.kubernetes.io/pod: runtime/default
sidecar.istio.io/inject: false
sidecar.istio.io/proxyCPU: 15m
sidecar.istio.io/proxyMemory: 115Mi
traffic.sidecar.istio.io/excludeInboundPorts: 8301
Status: Pending
IP:
IPs: <none>
Controlled By: StatefulSet/sas-consul-server
Init Containers:
sas-certframe:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435
Port: <none>
Host Port: <none>
Limits:
cpu: 500m
memory: 500Mi
Requests:
cpu: 50m
memory: 50Mi
Environment Variables from:
sas-certframe-config-2ch97fd95b ConfigMap Optional: false
sas-certframe-ingress-certificate-config-cmm2t44t88 ConfigMap Optional: false
sas-certframe-user-config-c4ch2c59m7 ConfigMap Optional: false
Environment:
KUBE_POD_NAME: sas-consul-server-0 (v1:metadata.name)
SAS_CERTFRAME_TOKEN_DIR: /certframe-token
SAS_ADDITIONAL_CA_CERTIFICATES_DIR: /customer-provided-ca-certificates
Mounts:
/certframe-token from certframe-token (rw)
/customer-provided-ca-certificates from customer-provided-ca-certificates (rw)
/security from security (rw)
sas-certframe-client-token-generator:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435
Port: <none>
Host Port: <none>
Limits:
cpu: 500m
memory: 500Mi
Requests:
cpu: 50m
memory: 50Mi
Environment:
SAS_KEYS_SECRET_NAME: sas-consul-client
SAS_KEYS_KEY_NAMES: CONSUL_HTTP_TOKEN
SAS_SECURITY_ARTIFACTS_DIR: /security
SAS_CERTFRAME_TOKEN_DIR: /certframe-token
Mounts:
/certframe-token from certframe-token (rw)
/security from security (rw)
sas-certframe-management-token-generator:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435
Port: <none>
Host Port: <none>
Limits:
cpu: 500m
memory: 500Mi
Requests:
cpu: 50m
memory: 50Mi
Environment:
SAS_KEYS_SECRET_NAME: sas-consul-management
SAS_KEYS_KEY_NAMES: CONSUL_MANAGEMENT_TOKEN CONSUL_TOKENS_ENCRYPTION
SAS_KEYS_KEY_TYPES: uuid base64
SAS_SECURITY_ARTIFACTS_DIR: /security
SAS_CERTFRAME_TOKEN_DIR: /certframe-token
Mounts:
/certframe-token from certframe-token (rw)
/security from security (rw)
Containers:
sas-consul-server:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-consul-server:1.310006.0-20211014.1634217840806
Ports: 8300/TCP, 8301/TCP, 8301/UDP, 8500/TCP
Host Ports: 0/TCP, 0/TCP, 0/UDP, 0/TCP
Limits:
cpu: 1
memory: 1Gi
Requests:
cpu: 250m
memory: 150Mi
Liveness: exec [sh /opt/sas/viya/home/bin/consul-liveness-probe.sh] delay=45s timeout=1s period=30s #success=1 #failure=3
Readiness: exec [sh /opt/sas/viya/home/bin/consul-readiness-probe.sh] delay=45s timeout=1s period=30s #success=1 #failure=3
Startup: exec [sh /opt/sas/viya/home/bin/consul-startup-probe.sh] delay=45s timeout=1s period=30s #success=1 #failure=3
Environment Variables from:
sas-tls-config-f8ccd48c6m ConfigMap Optional: false
sas-shared-config-9dh449kdkb ConfigMap Optional: false
sas-consul-client Secret Optional: false
sas-consul-management Secret Optional: false
ingress-input-mfh55658f2 ConfigMap Optional: false
Environment:
CONSUL_BOOTSTRAP_EXPECT: 3
CONSUL_CLIENT_ADDRESS: 0.0.0.0
CONSUL_DATACENTER_NAME: viya
Mounts:
/consul/data from sas-viya-consul-data-volume (rw)
/opt/sas/viya/config/etc/SASSecurityCertificateFramework/cacerts from security (rw,path="cacerts")
/opt/sas/viya/config/etc/SASSecurityCertificateFramework/private from security (rw,path="private")
/opt/sas/viya/config/etc/SASSecurityCertificateFramework/tokens/consul/default from tmp-volume (rw,path="consul-tokens")
/opt/sas/viya/config/etc/consul.d from tmp-volume (rw,path="consul.d")
/opt/sas/viya/config/etc/consul.d/default from sitedefault-vol (rw)
/opt/sas/viya/config/tmp/sas-consul from tmp-volume (rw,path="sas-consul")
/security from security (rw)
/tmp from tmp-volume (rw,path="tmp")
Conditions:
Type Status
PodScheduled False
Volumes:
sas-viya-consul-data-volume:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: sas-viya-consul-data-volume-sas-consul-server-0
ReadOnly: false
sitedefault-vol:
Type: Projected (a volume that contains injected data from multiple sources)
ConfigMapName: sas-consul-config-7m8mcgtm5c
ConfigMapOptional: <nil>
SecretName: sas-consul-config-6m98g47d77
SecretOptionalName: <nil>
tmp-volume:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
certframe-token:
Type: Secret (a volume populated by a Secret)
SecretName: sas-certframe-token
Optional: false
security:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
customer-provided-ca-certificates:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: sas-customer-provided-ca-certificates-29kdmk686c
Optional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
workload.sas.com/class=stateful:NoSchedule
workload.sas.com/class=stateless:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 8s (x279 over 6h15m) default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.
root@vmkub01:~# kubectl describe pod sas-consul-server-0 -n sasoperator
Name: sas-consul-server-0
Namespace: sasoperator
Priority: 0
Node: <none>
Labels: app=sas-consul-server
app.kubernetes.io/name=sas-consul-server
controller-revision-hash=sas-consul-server-599b54cc66
sas.com/deployment=sas-viya
statefulset.kubernetes.io/pod-name=sas-consul-server-0
workload.sas.com/class=stateful
Annotations: prometheus.io/scheme: https
sas.com/certificate-file-format: pem
sas.com/component-name: sas-consul-server
sas.com/component-version: 1.310006.0-20211014.1634217840806
sas.com/kustomize-base: base
sas.com/tls-enabled-ports: all
sas.com/tls-mode: full-stack
sas.com/version: 1.310006.0
seccomp.security.alpha.kubernetes.io/pod: runtime/default
sidecar.istio.io/inject: false
sidecar.istio.io/proxyCPU: 15m
sidecar.istio.io/proxyMemory: 115Mi
traffic.sidecar.istio.io/excludeInboundPorts: 8301
Status: Pending
IP:
IPs: <none>
Controlled By: StatefulSet/sas-consul-server
Init Containers:
sas-certframe:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435
Port: <none>
Host Port: <none>
Limits:
cpu: 500m
memory: 500Mi
Requests:
cpu: 50m
memory: 50Mi
Environment Variables from:
sas-certframe-config-2ch97fd95b ConfigMap Optional: false
sas-certframe-ingress-certificate-config-cmm2t44t88 ConfigMap Optional: false
sas-certframe-user-config-c4ch2c59m7 ConfigMap Optional: false
Environment:
KUBE_POD_NAME: sas-consul-server-0 (v1:metadata.name)
SAS_CERTFRAME_TOKEN_DIR: /certframe-token
SAS_ADDITIONAL_CA_CERTIFICATES_DIR: /customer-provided-ca-certificates
Mounts:
/certframe-token from certframe-token (rw)
/customer-provided-ca-certificates from customer-provided-ca-certificates (rw)
/security from security (rw)
sas-certframe-client-token-generator:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435
Port: <none>
Host Port: <none>
Limits:
cpu: 500m
memory: 500Mi
Requests:
cpu: 50m
memory: 50Mi
Environment:
SAS_KEYS_SECRET_NAME: sas-consul-client
SAS_KEYS_KEY_NAMES: CONSUL_HTTP_TOKEN
SAS_SECURITY_ARTIFACTS_DIR: /security
SAS_CERTFRAME_TOKEN_DIR: /certframe-token
Mounts:
/certframe-token from certframe-token (rw)
/security from security (rw)
sas-certframe-management-token-generator:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-certframe:3.20.7-20211015.1634318362435
Port: <none>
Host Port: <none>
Limits:
cpu: 500m
memory: 500Mi
Requests:
cpu: 50m
memory: 50Mi
Environment:
SAS_KEYS_SECRET_NAME: sas-consul-management
SAS_KEYS_KEY_NAMES: CONSUL_MANAGEMENT_TOKEN CONSUL_TOKENS_ENCRYPTION
SAS_KEYS_KEY_TYPES: uuid base64
SAS_SECURITY_ARTIFACTS_DIR: /security
SAS_CERTFRAME_TOKEN_DIR: /certframe-token
Mounts:
/certframe-token from certframe-token (rw)
/security from security (rw)
Containers:
sas-consul-server:
Image: cr.sas.com/viya-4-x64_oci_linux_2-docker/sas-consul-server:1.310006.0-20211014.1634217840806
Ports: 8300/TCP, 8301/TCP, 8301/UDP, 8500/TCP
Host Ports: 0/TCP, 0/TCP, 0/UDP, 0/TCP
Limits:
cpu: 1
memory: 1Gi
Requests:
cpu: 250m
memory: 150Mi
Liveness: exec [sh /opt/sas/viya/home/bin/consul-liveness-probe.sh] delay=45s timeout=1s period=30s #success=1 #failure=3
Readiness: exec [sh /opt/sas/viya/home/bin/consul-readiness-probe.sh] delay=45s timeout=1s period=30s #success=1 #failure=3
Startup: exec [sh /opt/sas/viya/home/bin/consul-startup-probe.sh] delay=45s timeout=1s period=30s #success=1 #failure=3
Environment Variables from:
sas-tls-config-f8ccd48c6m ConfigMap Optional: false
sas-shared-config-9dh449kdkb ConfigMap Optional: false
sas-consul-client Secret Optional: false
sas-consul-management Secret Optional: false
ingress-input-mfh55658f2 ConfigMap Optional: false
Environment:
CONSUL_BOOTSTRAP_EXPECT: 3
CONSUL_CLIENT_ADDRESS: 0.0.0.0
CONSUL_DATACENTER_NAME: viya
Mounts:
/consul/data from sas-viya-consul-data-volume (rw)
/opt/sas/viya/config/etc/SASSecurityCertificateFramework/cacerts from security (rw,path="cacerts")
/opt/sas/viya/config/etc/SASSecurityCertificateFramework/private from security (rw,path="private")
/opt/sas/viya/config/etc/SASSecurityCertificateFramework/tokens/consul/default from tmp-volume (rw,path="consul-tokens")
/opt/sas/viya/config/etc/consul.d from tmp-volume (rw,path="consul.d")
/opt/sas/viya/config/etc/consul.d/default from sitedefault-vol (rw)
/opt/sas/viya/config/tmp/sas-consul from tmp-volume (rw,path="sas-consul")
/security from security (rw)
/tmp from tmp-volume (rw,path="tmp")
Conditions:
Type Status
PodScheduled False
Volumes:
sas-viya-consul-data-volume:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: sas-viya-consul-data-volume-sas-consul-server-0
ReadOnly: false
sitedefault-vol:
Type: Projected (a volume that contains injected data from multiple sources)
ConfigMapName: sas-consul-config-7m8mcgtm5c
ConfigMapOptional: <nil>
SecretName: sas-consul-config-6m98g47d77
SecretOptionalName: <nil>
tmp-volume:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
certframe-token:
Type: Secret (a volume populated by a Secret)
SecretName: sas-certframe-token
Optional: false
security:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
customer-provided-ca-certificates:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: sas-customer-provided-ca-certificates-29kdmk686c
Optional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
workload.sas.com/class=stateful:NoSchedule
workload.sas.com/class=stateless:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 20s (x279 over 6h15m) default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.Here come's the problem, I'm going to analyze the whole way creating my nfs storage class and provisioner
1 pod has unbound immediate PersistentVolumeClaims
Assuming you have a separate NFS server you are using for this, I create my nfs storage class using this (replace nfs.example.com and /srv/share with the values for your NFS server share, and make sure the share has world writeable permissions):
kubectl create ns nfs-client
nfsserver=nfs.example.com nfsshare="/srv/share" nfstmp=$(mktemp -d) cd $nfstmp git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git cd nfs-subdir-external-provisioner/charts/nfs-subdir-external-provisioner/ helm install nfs-subdir-external-provisioner . --namespace nfs-client --set nfs.server=$nfsserver --set nfs.path=$nfsshare --set storageClass.accessModes=ReadWriteMany
cd rm -rf $nfstmp
Hey ! that answer was awesome, mostly "world wireatble allow".
I changed allow properties and test-pod started. My whole NFS script looks like (part of whole Viya4 SMD Deployment script) :
export STORAGEFOLDER="/home/saspodstorage"
export NFSRULES="0.0.0.0/0(rw,sync,no_subtree_check,crossmnt,fsid=0)"
export NFSNETWORK="10.0.110.0/24"
export NFSSERVER="10.0.110.99"
# ---- Install NFS Server --------------------
sudo apt -y install nfs-kernel-server
sudo cat /proc/fs/nfsd/versions
sudo mkdir -p /srv/nfs4/nfs-share
sudo mkdir -p $STORAGEFOLDER
sudo mount --bind $STORAGEFOLDER /srv/nfs4/nfs-share
sudo echo "$STORAGEFOLDER /srv/nfs4/nfs-share none bind 0 0" >> /etc/fstab
sudo mount -a
sudo ufw allow from $NFSNETWORK to any port nfs
sudo echo "/srv/nfs4/nfs-share $NFSRULES" >> /etc/exports
sudo exportfs -ar
sudo exportfs -v
clear
# --------------------------------------------------------
# ---- InstallNFS Subdir Subdir External Provisioner -
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=$NFSSERVER \
--set nfs.path=/srv/nfs4/nfs-share \
--set storageClass.defaultClass=true \
--set storageClass.accessModes=ReadWriteMany
Ok, finally I got rid of that problem, now I'm fighting with some other ones, I'm going to resolve it by myself, if not succeed .... I would appreciate communities help 😄
Finally to get rid of this specific problem :
Creation of standalone NFS server should look like :
# NFS : export STORAGEFOLDER="/home/saspodstorage" export NFSRULES="*(rw,sync,no_subtree_check,crossmnt,fsid=0)" # This is most important - world access to share export NFSNETWORK="10.0.110.0/24" # It firewall network subnet for other hosts export NFSSERVER="10.0.110.99" # NFS Server IP
Instalation :
# ---- NFS Server -------------------- sudo apt -y install nfs-kernel-server sudo cat /proc/fs/nfsd/versions sudo mkdir -p /srv/nfs4/nfs-share sudo mkdir -p $STORAGEFOLDER sudo mount --bind $STORAGEFOLDER /srv/nfs4/nfs-share sudo echo "$STORAGEFOLDER /srv/nfs4/nfs-share none bind 0 0" >> /etc/fstab sudo mount -a sudo ufw allow from $NFSNETWORK to any port nfs sudo echo "/srv/nfs4/nfs-share $NFSRULES" >> /etc/exports sudo chmod 777 -R $STORAGEFOLDER sudo exportfs -ar sudo exportfs -v sudo systemctl restart nfs-server # It's important to restart service sleep 1m clear # --------------------------------------------------------
Provisioner (default RBAC is enabled, I got it to work without security tuning just placing it in the same namespace as sasoperator)
# ---- NFS Subdir Subdir External Provisioner -
kubectl create ns sasoperator
echo -e "Rozpoczynam\v instlacje\v NFS \v Subdir \v Subdir \v External \v Provisioner"
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=$NFSSERVER \
--set nfs.path=/srv/nfs4/nfs-share \
--set storageClass.defaultClass=true \
--set storageClass.accessModes=ReadWriteMany \
--namespace sasoperator
# --------------------------------------------------------After giving it some time
tee test-pod.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-client
resources:
requests:
storage: 1Mi
---
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: gcr.io/google_containers/busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
EOF
kubectl apply -f test-pod.yaml -n sasoperator
sleep 1m
kubectl describe pod test-pod -n sasoperatorAnd now sas-consul-client secret is out 🙂
Now I'm facing problem which theoreticly could stop whole idea of single machine deployment - limits of 110 pods per node in k8s..
😉
[VIYA4] Deploy Viya 4 Anywhere - Tutorial, Script,... - SAS Support Communities
here comes full script
The SAS Users Group for Administrators (SUGA) is open to all SAS administrators and architects who install, update, manage or maintain a SAS deployment.
SAS technical trainer Erin Winters shows you how to explore assets, create new data discovery agents, schedule data discovery agents, and much more.
Find more tutorials on the SAS Users YouTube channel.