{"id":3834,"date":"2024-10-31T13:03:07","date_gmt":"2024-10-31T13:03:07","guid":{"rendered":"https:\/\/john.pentaidea.com\/?p=3834"},"modified":"2025-06-03T06:57:27","modified_gmt":"2025-06-03T06:57:27","slug":"container-faq-updating-2","status":"publish","type":"post","link":"https:\/\/john.pentaidea.com\/?p=3834","title":{"rendered":"Container FAQ (updating)"},"content":{"rendered":"<p><h1>Overview<\/h1>\n<\/p>\n<ul>\n<li>\n<p>term<\/p>\n<\/li>\n<ul>\n<li>\n<p>name of k8s&#8217; objects: can&#8217;t have underline <code>_<\/code><\/p>\n<\/li>\n<li>\n<p>key name of helm&#8217;s value: can&#8217;t have dash <code>-<\/code><\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<h1><span style=\"--inversion-type-color:simple\">K8s<\/span><\/h1>\n<ul>\n<li>\n<p>loop through all specific pod name\u00a0 <\/p>\n<\/li>\n<\/ul>\n<pre><code>for pod in $(kubectl get po -o json | jq -r '.items[] | select(.metadata.name|contains(\"test\")) | .metadata.name'); do echo $pod; kubectl logs $pod --all-containers | grep \" 500 \" ; done\n\n# or replace jq,\u00a0 use :\n| grep test |cut -d\" \" -f1\n<\/code><\/pre>\n<ul>\n<li>\n<p>Scale replica<\/p>\n<\/li>\n<\/ul>\n<pre><code> kubectl scale --replicas=3 deployment\/replicaset\/rs xyz\n<\/code><\/pre>\n<ul>\n<li>\n<p>Check CPU\/Memory usage<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl top pod podname --namespace=XXX\n<\/code><\/pre>\n<ul>\n<li>\n<p>Debug node, check kubelet log of node<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl debug node\/xxxx -it --image=mcr.microsoft.com\/dotnet\/runtime-deps:6.0\nkubectl debug node\/xxxx -it --image=ubuntu -n xxx\n\n# recycle\nkubectl delete pod xxx\n<\/code><\/pre>\n<ul>\n<li>\n<p>Delete all Evicted pods<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl get pods -A | grep Evicted | awk '{print $1,$2,$4}' | xargs kubectl delete pod $2 -n $1\n<\/code><\/pre>\n<ul>\n<li>\n<p>Bulk delete jobs<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl delete jobs --field-selector status.successful=0\n<\/code><\/pre>\n<ul>\n<li>\n<p>Copy file in\/out of pod to root<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl cp examplefile.zip xxpod-2133rfsdf:\/examplefile.zip\n<\/code><\/pre>\n<ul>\n<li>\n<p>Ext4 Folder is not empty<\/p>\n<\/li>\n<ul>\n<li>\n<p>Err<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<pre><code>[ERROR] --initialize specified but the data directory has files in it. Aborting.\n<\/code><\/pre>\n<ul>\n<ul>\n<li>\n<p>Ans<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<pre><code>args:\n\u00a0 - \"--ignore-db-dir=lost+found\"\n<\/code><\/pre>\n<ul>\n<li>\n<p>Get pod event<\/p>\n<\/li>\n<\/ul>\n<pre><code># work on kubectl v1.14 against a v1.11 API\nkubectl get event --namespace abc-namespace --field-selector involvedObject.name=my-pod-zl6m6\nkubectl describe event [POD_NAME] --namespace [POD's_NAMESPACE]\n<\/code><\/pre>\n<ul>\n<li>\n<p>Create self-signed CA<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl create secret tls daas-tls --key daas.trendmicro.com.key --cert daas.trendmicro.com.crt\n<\/code><\/pre>\n<ul>\n<li>\n<p>Install kubectl<\/p>\n<\/li>\n<\/ul>\n<pre><code>curl -LO https:\/\/storage.googleapis.com\/kubernetes-release\/release\/`curl -s https:\/\/storage.googleapis.com\/kubernetes-release\/release\/stable.txt`\/bin\/linux\/amd64\/kubectl\n\nchmod +x .\/kubectl\nsudo mv .\/kubectl \/usr\/local\/bin\/kubectl\u00a0 # For user\nsudo mv .\/kubectl \/usr\/bin\/kubectl\u00a0 # For root\nkubectl version\n<\/code><\/pre>\n<ul>\n<li>\n<p>Apply kubeconfig<\/p>\n<\/li>\n<li>\n<p>Operate current context token<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl config use-context {contextName}\u00a0 \u00a0 # set current context\nkubectl config current-context\u00a0 \u00a0 # get current context\n<\/code><\/pre>\n<ul>\n<li>\n<p>Switch current namespace(context)<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl config set-context --current --namespace={my namespace}\n<\/code><\/pre>\n<ul>\n<li>\n<p>Probe (liveness\/readiness)<\/p>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png\" \/><\/p>\n<p>ref:\u00a0<a href=\"https:\/\/andrewlock.net\/deploying-asp-net-core-applications-to-kubernetes-part-6-adding-health-checks-with-liveness-readiness-and-startup-probes\/\" rev=\"en_rl_none\">https:\/\/andrewlock.net\/deploying-asp-net-core-applications-to-kubernetes-part-6-adding-health-checks-with-liveness-readiness-and-startup-probes\/<\/a><\/p>\n<ul>\n<li>\n<p>Keep running pod<\/p>\n<\/li>\n<\/ul>\n<pre><code>command: [\"ping\", \"-t\", \"google.com\"]\ncommand: [\"\/bin\/sh\", \"-ec\", \"while true; do echo 'test'; sleep 5 ; done\"]\n<\/code><\/pre>\n<ul>\n<li>\n<p>Add command to deployment<\/p>\n<\/li>\n<\/ul>\n<pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n\u00a0 name: command-demo\n\u00a0 labels:\n\u00a0 \u00a0 purpose: demonstrate-command\nspec:\n\u00a0 containers:\n\u00a0 - name: command-demo-container\n\u00a0 \u00a0 image: debian\n\u00a0 \u00a0 command: [\"printenv\"]\n\u00a0 \u00a0 args: [\"HOSTNAME\", \"KUBERNETES_PORT\"]\n\u00a0 restartPolicy: OnFailure\n<\/code><\/pre>\n<ul>\n<li>\n<p>Https (k8s ingress TLS) &#8220;default backend 404&#8221; error<\/p>\n<\/li>\n<ul>\n<li>\n<p>Ans: tls secret not correct, TLS not\u00a0<\/p>\n<\/li>\n<\/ul>\n<li>\n<p>Create TLS secret by file: .crt .key (Letsencrypt)<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl -n XX create secret tls tls-XXX \\\n\u00a0 --cert=signed.crt \\\n\u00a0 --key=domain.key\n<\/code><\/pre>\n<ul>\n<li>\n<p>Create an base64 string for k8s Secret Opaque<\/p>\n<\/li>\n<\/ul>\n<pre><code>echo -n 'password' | base64\n# Or Notepad++ =&gt; MINE tool &gt; Base64 Encode with Unix EOL\n\n&lt;--- sample file\napiVersion: v1\nkind: Secret\nmetadata:\n\u00a0 name: your-secrets\ntype: Opaque\ndata:\n\u00a0 root-password: XXXXXXX\n<\/code><\/pre>\n<ul>\n<li>\n<p>Clean key by patch<\/p>\n<\/li>\n<\/ul>\n<pre><code>$ kubectl patch configmap myconfigmap --type=json -p='[{\"op\": \"remove\", \"path\": \"\/data\/mykey\"}]'\n<\/code><\/pre>\n<ul>\n<li>\n<p>Rollback version<\/p>\n<\/li>\n<\/ul>\n<pre><code># List old\nkubectl rollout history deployment\/app\n# Rollback to\nkubectl rollout undo deployment\/app --to-revision=2\n<\/code><\/pre>\n<ul>\n<li>\n<p>Release pv (Persistent Volume) to be avaliable again.\u00a0 unbind, unbound PV<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl edit pv PV_NAME\n# Remove spec.claimRef\n# Or command:\nkubectl patch pv {{PV_NAME}} --type=json -p='[{\"op\": \"remove\", \"path\": \"\/spec\/claimRef\"}]'\n<\/code><\/pre>\n<ul>\n<li>\n<p>Search and get pod name\u00a0<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl get pods -l app=my-app -o custom-columns=:metadata.name\n<\/code><\/pre>\n<ul>\n<li>\n<p>kubectl Copy file into pod: error directory not exists or not found.\u00a0<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl --kubeconfig=xxx cp {{filename}} {{namespace}}\/{{pod}}:\/{{filename}}\n# {{filename}} is needed!!\n<\/code><\/pre>\n<ul>\n<li>\n<p>Nginx sample<\/p>\n<\/li>\n<\/ul>\n<pre><code>apiVersion: networking.k8s.io\/v1beta1 \nkind: Ingress \nmetadata: \n\u00a0 name: nginx \n\u00a0 annotations: \n\u00a0 \u00a0 kubernetes.io\/ingress.class: nginx \nspec: \n\u00a0 rules: \n\u00a0 - host: via-ingress.pentaidea.com \n\u00a0 \u00a0 http: \n\u00a0 \u00a0 \u00a0 paths: \n\u00a0 \u00a0 \u00a0 - backend: \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 serviceName: nginx \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 servicePort: 80 \n--- \napiVersion: v1 \nkind: Service \nmetadata: \n\u00a0 name: nginx \nspec: \n\u00a0 ports: \n\u00a0 - port: 80 \n\u00a0 \u00a0 targetPort: 80 \n\u00a0 selector: \n\u00a0 \u00a0 app: nginx \n--- \napiVersion: apps\/v1 \nkind: Deployment \nmetadata: \n\u00a0 name: nginx \nspec: \n\u00a0 selector: \n\u00a0 \u00a0 matchLabels: \n\u00a0 \u00a0 \u00a0 app: nginx \n\u00a0 template: \n\u00a0 \u00a0 metadata: \n\u00a0 \u00a0 \u00a0 labels: \n\u00a0 \u00a0 \u00a0 \u00a0 app: nginx \n\u00a0 \u00a0 spec: \n\u00a0 \u00a0 \u00a0 containers: \n\u00a0 \u00a0 \u00a0 - image: nginx \n\u00a0 \u00a0 \u00a0 \u00a0 name: nginx \n\u00a0 \u00a0 \u00a0 \u00a0 ports: \n\u00a0 \u00a0 \u00a0 \u00a0 - containerPort: 80\n<\/code><\/pre>\n<ul>\n<li>\n<p>CronJob sample &#8211; with script file<\/p>\n<\/li>\n<\/ul>\n<pre><code>apiVersion: batch\/v1\nkind: CronJob\nmetadata:\n\u00a0 name: jj-job\n\u00a0 annotations:\n\u00a0 \u00a0 version: &lt;VERSION&gt;\nspec:\n\u00a0 schedule: \"*\/30 * * * *\"\n\u00a0 concurrencyPolicy: Forbid\n\u00a0 successfulJobsHistoryLimit: 1\n\u00a0 failedJobsHistoryLimit: 1\n\u00a0 jobTemplate:\n\u00a0 \u00a0 spec:\n\u00a0 \u00a0 \u00a0 backoffLimit: 0\n\u00a0 \u00a0 \u00a0 template:\n\u00a0 \u00a0 \u00a0 \u00a0 spec:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 volumes:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - name: scripts-volume\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 configMap:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 name: scripts-configmap\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 defaultMode: 0777\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 containers:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - name: jj-job\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image: curlimages\/curl:latest\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 volumeMounts:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - mountPath: \/tmp\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 name: scripts-volume\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 resources:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 limits:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cpu: 400m\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 memory: 512Mi\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 command:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - \/bin\/sh\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - -c\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - \/tmp\/run-script.sh\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 restartPolicy: Never\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 nodeSelector:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 beta.kubernetes.io\/os: linux\n<\/code><\/pre>\n<ul>\n<li>\n<p>CronJob sample<\/p>\n<\/li>\n<\/ul>\n<pre><code>apiVersion: batch\/v1\nkind: CronJob\nmetadata:\n\u00a0 name: jj-triggerjob\nspec:\n\u00a0 schedule: \"* 6 * * *\"\n\u00a0 concurrencyPolicy: Forbid\n\u00a0 failedJobsHistoryLimit: 1\n\u00a0 successfulJobsHistoryLimit: 1\n\u00a0 jobTemplate:\n\u00a0 \u00a0 spec:\n\u00a0 \u00a0 \u00a0 backoffLimit: 1\n\u00a0 \u00a0 \u00a0 ttlSecondsAfterFinished: 3600\n\u00a0 \u00a0 \u00a0 template:\n\u00a0 \u00a0 \u00a0 \u00a0 spec:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 containers:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - name: jj-triggerjob\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image: curlimages\/curl:latest\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 resources:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 limits:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cpu: '200m'\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 memory: '256Mi'\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 requests:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 cpu: '100m'\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 memory: '128Mi'\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 command:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - \/bin\/sh\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - -c\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - \" echo \\\"Running trigger job\\\";\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 status_code=$(curl -ivs -o \/dev\/null -w \\\"%{http_code}\\\" -X GET https:\/\/www.google.com\/ -H \\\"my-trace-id: $(cat \/proc\/sys\/kernel\/random\/uuid)\\\");\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo $status_code;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ! echo $status_code | grep -e \\\"200\\\" -e \\\"301\\\" ;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 then\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \\\"Failed with status code: $status_code\\\";\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \\\"Done trigger job\\\";\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 exit 1;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 fi;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \\\"Passed\\\";\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \\\"Done trigger job\\\";\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # imagepullsecrets:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # - name: XXAccount\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 restartPolicy: Never\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 nodeSelector:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 kubernetes.io\/os: linux\n<\/code><\/pre>\n<ul>\n<ul>\n<li>\n<p>Warning: <\/p>\n<\/li>\n<ul>\n<li>\n<p>always has ; <\/p>\n<\/li>\n<li>\n<p>can&#8217;t use <span>square brackets<\/span> [ ] around with if echo $xxx | grep<\/p>\n<\/li>\n<li>\n<p>Use &#8220;curl -o \/dev\/null -s -w \\&#8221;%{http_code}\\&#8221; &#8221; to get status code<\/p>\n<\/li>\n<\/ul>\n<li>\n<p>Other example<\/p>\n<\/li>\n<ul>\n<li>\n<p>run bash<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<\/ul>\n<pre><code>\u00a0 \u00a0 \u00a0 \u00a0 command: [\"bash\"] \n\u00a0 \u00a0 \u00a0 \u00a0 args:\n\u00a0 \u00a0 \u00a0 \u00a0 - -c\n\u00a0 \u00a0 \u00a0 \u00a0 - echo \"Hello world!\" &amp;&amp; sleep 5 &amp;&amp; exit 42\n<\/code><\/pre>\n<ul>\n<ul>\n<ul>\n<li>\n<p>run inline script<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<\/ul>\n<pre><code>\u00a0 \u00a0 \u00a0 \u00a0 command: \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - python3\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - -c\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - |\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 import os, sys\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if os.environ.get(\"JOB_COMPLETION_INDEX\") == \"2\":\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sys.exit(0)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sys.exit(1)\n<\/code><\/pre>\n<ul>\n<li><\/li>\n<li>\n<p>Unknown object type &#8220;nil&#8221;<\/p>\n<\/li>\n<ul>\n<li>\n<p>error msg<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<pre><code>error: error validating \"\/home\/jj\/deployment.yaml\": error validating data: [ValidationError(Ingress.spec.tls[0].hosts): unknown object type \"nil\" in Ingress.spec.tls[0].hosts[0],\n<\/code><\/pre>\n<ul>\n<ul>\n<li>\n<p>Solve: Fix wrong yaml format.<\/p>\n<\/li>\n<\/ul>\n<li>\n<p>Apply private registry credential<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl create secret generic regcred \\\n\u00a0 \u00a0 --from-file=.dockerconfigjson={{path\/to\/.docker\/config.json}} \\\n\u00a0 \u00a0 --type=kubernetes.io\/dockerconfigjson\n\n# Add to deployment (pod)\nspec:\n\u00a0 containers:\n\u00a0 - name: xxx\n\u00a0 \u00a0 image: xxx\n\u00a0 imagePullSecrets:\n\u00a0 - name: regcred\n<\/code><\/pre>\n<ul>\n<li>\n<p>Deployment not updating after image updated, Force deployment rolling-update<\/p>\n<\/li>\n<\/ul>\n<pre><code>spec:\n\u00a0 template:\n\u00a0 \u00a0 spec:\n\u00a0 \u00a0 \u00a0 containers:\n\u00a0 \u00a0 \u00a0 - image: xxx\n\u00a0 \u00a0 \u00a0 \u00a0 imagePullPolicy: Always\n<\/code><\/pre>\n<ul>\n<li>\n<p>Deployment not updating after configmap updated<\/p>\n<\/li>\n<ul>\n<li>\n<p>Update label to trigger deployment rolling update<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<pre><code>metadata:\n\u00a0 labels:\n\u00a0 \u00a0 configmap-version: 1\n<\/code><\/pre>\n<ul>\n<li>\n<p>ConfigMap has a size limit of 1Mb, exceed error:\u00a0<\/p>\n<\/li>\n<ul>\n<li>\n<p>Msg:\u00a0The ConfigMap &#8220;XXXXXXX&#8221; is invalid: metadata.annotations: Too long: must have at most 262144 characters<\/p>\n<\/li>\n<li>\n<p>Use kubectl replace\u00a0<\/p>\n<\/li>\n<li>\n<p><span><span style=\"font-size: 16px\"><span>Ref:\u00a0<\/span><a href=\"https:\/\/github.com\/coreos\/prometheus-operator\/issues\/535#issuecomment-319936366\" rev=\"en_rl_none\"><span>https:\/\/github.com\/coreos\/prometheus-operator\/issues\/535#issuecomment-319936366<\/span><\/a><\/span><\/span><\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<h1><span style=\"--inversion-type-color:simple\">Helm<\/span><\/h1>\n<ul>\n<li>\n<p><span style=\"--lightmode-color:var(--lightmode-base-color);--darkmode-color:var(--darkmode-base-color)\">apply deployment error<\/span><\/p>\n<\/li>\n<ul>\n<li>\n<p><span style=\"--lightmode-color:var(--lightmode-base-color);--darkmode-color:var(--darkmode-base-color)\">error: <\/span><code>Invalid value: v1.LabelSelector{MatchLabels:map[string]string{\"app\":\"partner\"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable<\/code><\/p>\n<\/li>\n<li>\n<p><span style=\"--lightmode-color:var(--lightmode-base-color);--darkmode-color:var(--darkmode-base-color)\">The <\/span><a href=\"https:\/\/spec.selector.matchLabels.app\"><span style=\"--lightmode-color:var(--lightmode-base-color);--darkmode-color:var(--darkmode-base-color)\">spec.selector.matchLabels.app<\/span><\/a><span style=\"--lightmode-color:var(--lightmode-base-color);--darkmode-color:var(--darkmode-base-color)\">,\u00a0 can&#8217;t be changed\/updated after first deploy.<\/span><\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<p><h1><span style=\"--inversion-type-color:simple\">K8s dashboard<\/span><\/h1>\n<\/p>\n<ul>\n<li>\n<p>Paste string to EXEC UI<\/p>\n<\/li>\n<ul>\n<li>\n<p><span style=\"font-family: arial, sans-serif\"><span style=\"font-size: 14px\"><span>ctrl-shift-v<\/span><\/span><\/span><\/p>\n<\/li>\n<\/ul>\n<li>\n<p>Login issue: namespace change to default<\/p>\n<\/li>\n<ul>\n<li>\n<p><b>Solution<\/b>: type it back at uri<\/p>\n<\/li>\n<\/ul>\n<li>\n<p>Login issue: exec into pod via Firefox will redirect back to k8s portal.<\/p>\n<\/li>\n<ul>\n<li>\n<p>Sol: Use other browsers.<\/p>\n<\/li>\n<\/ul>\n<\/ul>\n<p><h1><span style=\"--inversion-type-color:simple\">DockerHub<\/span><\/h1>\n<\/p>\n<ul>\n<li>\n<p>Always get handshake fail when `docker pull`\u00a0\u00a0<\/p>\n<\/li>\n<ul>\n<li>\n<p><b>Solution<\/b>:<\/p>\n<p>Login DockerHub with the account which has no email address.<\/p>\n<\/li>\n<\/ul>\n<li>\n<p>Download image fail: Authentication fail 401<\/p>\n<\/li>\n<ul>\n<li>\n<p><b>Message:<\/b><\/p>\n<p><span><span style=\"font-size: 10pt\"><span>(HTTP code 401) unexpected &#8211; {&#8220;message&#8221;:&#8221;Get<\/span><\/span><\/span> <span><span style=\"font-size: 10pt\"><a href=\"https:\/\/registry-1.docker.io\/v2\/library\/jenkins\/manifests\/2.46.3\" rev=\"en_rl_none\">https:\/\/registry-1.docker.io\/v2\/library\/jenkins\/manifests\/2.46.3<\/a><span>: unauthorized: incorrect username or password&#8221;}\u00a0<\/span><\/span><\/span><\/p>\n<p><b><span style=\"font-family: gotham, helvetica, arial, sans-serif\"><span style=\"font-size: 14px\">Solution:<\/span><\/span><\/b><\/p>\n<p><span><span style=\"font-size: 14px\"><span>logging into Kitematic with your username instead of email.<\/span><\/span><\/span><\/p>\n<\/li>\n<\/ul>\n<li>\n<p><span><span>Check the files permission in docker image<\/span><\/span><\/p>\n<p><span><span>docker run &#8211;rm -ti &#8211;entrypoint sh jj\/docker-stacks -c &#8220;ls -alF \/usr\/local\/bin\/&#8221;\u00a0<\/span><\/span><\/p>\n<\/li>\n<\/ul>\n<p><h1><span style=\"--inversion-type-color:simple\">Docker<\/span><\/h1>\n<\/p>\n<ul>\n<li>\n<p>Switch user<\/p>\n<\/li>\n<\/ul>\n<pre><code>Dockerfile\n---\nFROM tw.registry.trendmicro.com\/ik8s\/win-dotnetcore-runtime:3.1-nanoserver-1809\nUSER \"ContainerAdministrator\"\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Force delete pod<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl -n yyy delete pods xxxx --force --grace-period 0\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Docker with GrayLog<\/span><\/p>\n<\/li>\n<li>\n<p><span style=\"font-size: 16px\">Unable to start container by docker-compose<\/span><\/p>\n<\/li>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Msg: &#8220;UnixHTTPConnectionPool(host=&#8217;localhost&#8217;, port=None): Read timed out. (read timeout=60)&#8221;<\/span><\/p>\n<\/li>\n<li>\n<p><span style=\"font-size: 16px\">Ans: ` sudo service docker restart`<\/span><\/p>\n<\/li>\n<\/ul>\n<li>\n<p><span style=\"font-size: 16px\">[Character in Dockerfile]: &#8221; will be split by space\u00a0<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>in echo \" xxx string \" &gt; file.txt\n\n# result: file.txt\n# xxx\n# string\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">[Character in Dockerfile]: &#8221; will be remove inside &#8216; &#8220;xxx&#8221; &#8216;<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>echo ' \"xxx string\" ' &gt; file.txt\n\n# result: file.txt\n#\u00a0 xxx string\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">[Cronjob] &#8211; Clean container&amp;image daily at mid-night<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code># Clean container\n0 0 * * * docker rm -f $(docker ps -aq)\n# Clean image without baseImage\n0 5 * * * docker image prune -f; docker rmi -f $(docker images | awk '\/^[^m][^c][^r]*\/{ print $3 }')\n0 5 * * * docker rmi -f $(docker images | awk '$1 !~\/ik8s\/{ print $3 }')\n0 5 * * * docker image prune -f --filter=\"dangling=true\"; docker image prune -f --all --filter until=168h\n\n# Clean all unused build cache\ndocker builder prune -a\n# Clean all\ndocker system prune -a\n# Clean image older than 48h\ndocker image prune -f --all --filter until=48h\n# Clean dangling images\ndocker rmi $(sudo docker images -f \"dangling=true\" -q)\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Not enough memory to start Docker on Windows<\/span><\/p>\n<\/li>\n<ul>\n<li>\n<p>Modify `C:\\Program Files\\Docker\\Docker\\resources\\MobyLinux.ps1` and change `$Memory = 512`\u00a0 MB as you want<\/p>\n<\/li>\n<\/ul>\n<li>\n<p><span style=\"font-family: Tahoma\"><span style=\"font-size: 16px\"><span>Install with `sudo` but `docker run` without it,\u00a0 got error: &#8220;<\/span><\/span><\/span><span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>docker:<\/span><\/span><\/span> <span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>Got<\/span><\/span><\/span> <span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>permission denied<\/span><\/span><\/span> <span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>while<\/span><\/span><\/span> <span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>trying to connect to the<\/span><\/span><\/span> <span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>Docker<\/span><\/span><\/span> <span style=\", monospace, sans-serif\"><span style=\"font-size: 13px\"><span>daemon socket at unix:<\/span><span>\/\/\/var\/run\/docker.sock: Post http:\/\/%2Fvar%2Frun%2Fdocker.sock\/v1.35\/containers\/create: dial unix \/var\/run\/docker.sock: connect: permission denied.See &#8216;docker run &#8211;help&#8217;.<\/span><\/span><\/span><span style=\"font-family: Tahoma\"><span style=\"font-size: 16px\"><span>&#8220;.<\/span><\/span><\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>sudo groupadd docker\nsudo usermod -aG docker $USER\u00a0 # Add user into group\n\nRef: https:\/\/docs.docker.com\/install\/linux\/linux-postinstall\/#manage-docker-as-a-non-root-user\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">ERROR: Get<\/span> <span style=\"font-size: 16px\"><a href=\"https:\/\/registry-1.docker.io\/v2\/\" rev=\"en_rl_none\">https:\/\/registry-1.docker.io\/v2\/<\/a>: remote error: tls: handshake failure<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>docker login\u00a0 # Yes, login first\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Windows 10: Change docker images and any stuff to another folder, notice that the slash and case of character.<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>-- C:\\ProgramData\\docker\\config\\daemon.json --\n{\n\u00a0 \"registry-mirrors\": [],\n\u00a0 \"insecure-registries\": [],\n\u00a0 \"debug\": true,\n\u00a0 \"experimental\": false,\n\u00a0 \"graph\":\"D:\\\\ProgramData\\\\docker\"\n}\n<\/code><\/pre>\n<ul>\n<li>\n<p><b><span style=\"font-size: 16px\">docker: Error response from daemon: driver failed programming external connectivity on endpoint<\/span><\/b><\/p>\n<\/li>\n<ul>\n<li>\n<p>Restart docker<\/p>\n<\/li>\n<\/ul>\n<li>\n<p><b>The SPA default page middleware could not return the default page &#8216;\/index.html&#8217; because it was not found, and no other middleware handled the request.<\/b><\/p>\n<\/li>\n<li>\n<p><b>mkdir \/host_mnt\/c: file exists.<\/b><\/p>\n<\/li>\n<ul>\n<li>\n<p>Re-apply Shared Drive in docker-Desktop.<\/p>\n<\/li>\n<\/ul>\n<li><\/li>\n<\/ul>\n<p><h1><span style=\"--inversion-type-color:simple\">Docker compose<\/span><\/h1>\n<\/p>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Setting up network mode (avoid IP not found)<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>version: '3.1'\n\nservices:\n\u00a0 zookeeper-1:\n\u00a0 \u00a0 image: zookeeper:3.4.13\n\u00a0 \u00a0 container_name: zk\n\u00a0 \u00a0 network_mode: bridge\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">Docker IP not match<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code># Check docker container IP\ndocker network inspect XXX\n\n# Rebuild network (restart not working)\ndocker-compose down\ndocker-compose up\n\nPS. docker-compose restart &lt;- won't rebuild\n<\/code><\/pre>\n<ul>\n<li>\n<p><span style=\"font-size: 16px\">ERROR: client version 1.22 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version<\/span><\/p>\n<\/li>\n<\/ul>\n<pre><code>--- docker-compose.yml ---\nversion: '2.1'\n...\n<\/code><\/pre>\n<h1><span style=\"--inversion-type-color:simple\">GKE<\/span><\/h1>\n<ul>\n<li>\n<p>Copy file in\/out of pod to root<\/p>\n<\/li>\n<\/ul>\n<pre><code>kubectl cp examplefile.zip xxpod-2133rfsdf:\/examplefile.zip\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Overview<\/p>\n<\/div>","protected":false},"author":1,"featured_media":3997,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[12,14],"class_list":["post-3834","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts","tag-docker","tag-faq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Container FAQ (updating) - John&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/john.pentaidea.com\/?p=3834\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Container FAQ (updating) - John&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Overview\" \/>\n<meta property=\"og:url\" content=\"https:\/\/john.pentaidea.com\/?p=3834\" \/>\n<meta property=\"og:site_name\" content=\"John&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-31T13:03:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-03T06:57:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2024\/12\/ab50642af2fcab75441e2dc18e76813e.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1842\" \/>\n\t<meta property=\"og:image:height\" content=\"963\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"jj\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"jj\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/john.pentaidea.com\/?p=3834\",\"url\":\"https:\/\/john.pentaidea.com\/?p=3834\",\"name\":\"Container FAQ (updating) - John&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\/\/john.pentaidea.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/john.pentaidea.com\/?p=3834#primaryimage\"},\"image\":{\"@id\":\"https:\/\/john.pentaidea.com\/?p=3834#primaryimage\"},\"thumbnailUrl\":\"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png\",\"datePublished\":\"2024-10-31T13:03:07+00:00\",\"dateModified\":\"2025-06-03T06:57:27+00:00\",\"author\":{\"@id\":\"https:\/\/john.pentaidea.com\/#\/schema\/person\/3d2e5980a7d3023e93b91d668d2a4a4f\"},\"breadcrumb\":{\"@id\":\"https:\/\/john.pentaidea.com\/?p=3834#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/john.pentaidea.com\/?p=3834\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/john.pentaidea.com\/?p=3834#primaryimage\",\"url\":\"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png\",\"contentUrl\":\"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png\",\"width\":1842,\"height\":963},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/john.pentaidea.com\/?p=3834#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/john.pentaidea.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Container FAQ (updating)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/john.pentaidea.com\/#website\",\"url\":\"https:\/\/john.pentaidea.com\/\",\"name\":\"John's Blog\",\"description\":\"\u4e16\u754c\u56e0\u601d\u7dd2\u800c\u8907\u96dc, \u4eba\u56e0\u5922\u60f3\u800c\u5049\u5927\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/john.pentaidea.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/john.pentaidea.com\/#\/schema\/person\/3d2e5980a7d3023e93b91d668d2a4a4f\",\"name\":\"jj\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/john.pentaidea.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a685414cd92056415bc823b5cfbbf95a44a98df88d8c040b18613724c1c0724b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a685414cd92056415bc823b5cfbbf95a44a98df88d8c040b18613724c1c0724b?s=96&d=mm&r=g\",\"caption\":\"jj\"},\"sameAs\":[\"https:\/\/john.pentaidea.com\"],\"url\":\"https:\/\/john.pentaidea.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Container FAQ (updating) - John&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/john.pentaidea.com\/?p=3834","og_locale":"en_US","og_type":"article","og_title":"Container FAQ (updating) - John&#039;s Blog","og_description":"Overview","og_url":"https:\/\/john.pentaidea.com\/?p=3834","og_site_name":"John&#039;s Blog","article_published_time":"2024-10-31T13:03:07+00:00","article_modified_time":"2025-06-03T06:57:27+00:00","og_image":[{"width":1842,"height":963,"url":"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2024\/12\/ab50642af2fcab75441e2dc18e76813e.png","type":"image\/png"}],"author":"jj","twitter_card":"summary_large_image","twitter_misc":{"Written by":"jj","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/john.pentaidea.com\/?p=3834","url":"https:\/\/john.pentaidea.com\/?p=3834","name":"Container FAQ (updating) - John&#039;s Blog","isPartOf":{"@id":"https:\/\/john.pentaidea.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/john.pentaidea.com\/?p=3834#primaryimage"},"image":{"@id":"https:\/\/john.pentaidea.com\/?p=3834#primaryimage"},"thumbnailUrl":"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png","datePublished":"2024-10-31T13:03:07+00:00","dateModified":"2025-06-03T06:57:27+00:00","author":{"@id":"https:\/\/john.pentaidea.com\/#\/schema\/person\/3d2e5980a7d3023e93b91d668d2a4a4f"},"breadcrumb":{"@id":"https:\/\/john.pentaidea.com\/?p=3834#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/john.pentaidea.com\/?p=3834"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/john.pentaidea.com\/?p=3834#primaryimage","url":"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png","contentUrl":"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png","width":1842,"height":963},{"@type":"BreadcrumbList","@id":"https:\/\/john.pentaidea.com\/?p=3834#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/john.pentaidea.com\/"},{"@type":"ListItem","position":2,"name":"Container FAQ (updating)"}]},{"@type":"WebSite","@id":"https:\/\/john.pentaidea.com\/#website","url":"https:\/\/john.pentaidea.com\/","name":"John's Blog","description":"\u4e16\u754c\u56e0\u601d\u7dd2\u800c\u8907\u96dc, \u4eba\u56e0\u5922\u60f3\u800c\u5049\u5927","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/john.pentaidea.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/john.pentaidea.com\/#\/schema\/person\/3d2e5980a7d3023e93b91d668d2a4a4f","name":"jj","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/john.pentaidea.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a685414cd92056415bc823b5cfbbf95a44a98df88d8c040b18613724c1c0724b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a685414cd92056415bc823b5cfbbf95a44a98df88d8c040b18613724c1c0724b?s=96&d=mm&r=g","caption":"jj"},"sameAs":["https:\/\/john.pentaidea.com"],"url":"https:\/\/john.pentaidea.com\/?author=1"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/john.pentaidea.com\/wp-content\/uploads\/2025\/06\/ab50642af2fcab75441e2dc18e76813e.png","_links":{"self":[{"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/posts\/3834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3834"}],"version-history":[{"count":3,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/posts\/3834\/revisions"}],"predecessor-version":[{"id":3998,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/posts\/3834\/revisions\/3998"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=\/wp\/v2\/media\/3997"}],"wp:attachment":[{"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/john.pentaidea.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}