kubectl 命令
tags: kubectl,命令
文章目录
kubectl 命令
Kubectl 自动补全
kubectl run
kubectl create
kubectl create namespace
kubectl create pod
kubectl create deployment
kubectl create configmap
kubectl create quota
kubectl create secret
kubectl create job/cronjob
kubectl create serviceaccount
kubectl create rolebinding/role/clusterrolebinding/clusterrole
kubectl exec
kubectl apply
kubectl replace
kubectl expose
kubectl explain
kubectl annotate
kubectl get
kubectl get pods
--selector
--field-selector
--sort-by排序
-o=custom-columns
jsonpath
go-template
kubectl logs
kubectl cordon
kubectl drain
kubectl rollout
kubectl delete
kubectl describe
kubectl label
kubectl set
kubectl scale
kubectl api-resources
kubectl plugin list
kubectl diff
kubectl auth
kubectl certificate
kubectl config
综合
Helpful commands for debugging
Rolling updates and rollouts
Kubectl 自动补全
BASH
source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc # 在您的 bash shell 中永久的添加自动补全
您还可以为 kubectl 使用一个速记别名,该别名也可以与 completion 一起使用:
alias k='kubectl' alias kg='k get' alias kd='k describe' alias kl='k logs' alias ke='k explain' alias kr='k replace' alias kc='k create' alias kgp='k get po' alias kgn='k get no' alias kge='k get ev' alias kex='k exec -it' alias kgc='k config get-contexts' alias ksn='k config set-context --current --namespace' alias kuc='k config use-context' alias krun='k run' export do='--dry-run=client -oyaml' export force='--grace-period=0 --force' source <(kubectl completion bash) source <(kubectl completion bash | sed 's/kubectl/k/g' ) complete -F __start_kubectl k alias krp='k run test --image=busybox --restart=Never' alias kuc='k config use-context'
ZSH
source <(kubectl completion zsh) # 在 zsh 中设置当前 shell 的自动补全 echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc # 在您的 zsh shel
kubectl run
创建并运行一个或多个容器镜像。
创建一个deployment 或job 来管理容器。
语法
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
示例:
启动nginx实例。 kubectl run nginx --image=nginx kubectl run nginx --image=nginx --restart=Never -n mynamespace kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml > pod.yaml kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml | kubectl create -n mynamespace -f - kubectl run busybox --image=busybox --command --restart=Never -it -- env 启动带API组的nginx实例。将来被弃用 kubectl run nginx --image=nginx --generator=run-pod/v1 带有标签function=mantou的pod kubectl run nginx2 --image=nginx --labels function=mantou 多个标签 kubectl run nginx2 --image=nginx --labels function=mantou,disk=ssd # 创建nginx-app的deployment,并记录升级。 kubectl run nginx-app --image=nginx:1.11.0-alpine --record 使用默认命令启动 nginx 容器,但对该命令使用自定义参数(arg1 .. argN) kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN> 启动hazelcast实例,暴露容器端口 5701。 kubectl run hazelcast --image=hazelcast --port=5701 启动hazelcast实例,在容器中设置环境变量“DNS_DOMAIN = cluster”和“POD_NAMESPACE = default”。 kubectl run hazelcast --image=hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default" 启动nginx实例,设置副本数5。 kubectl run nginx --image=nginx --replicas=5 配置cpu与内存的pod kubectl run nginx --image=nginx --restart=Never --requests='cpu=100m,memory=256Mi' --limits='cpu=200m,memory=512Mi' 运行 Dry 打印相应的API对象而不创建它们。 kubectl run nginx --image=nginx --dry-run 在特定的命令空间的一个pod运行多个容器 kubectl run test --image=nginx --image=redis --image=memcached --image=consul --restart=Nerver -n kube-public 启动一个单一的 nginx 实例,但是使用从 JSON 分析的一部分值来重载部署规格. kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }' 启动一个 busybox 的 pod 并将其保留在前台,如果它退出,请不要重新启动它. kubectl run -i -t busybox --image=busybox --restart=Never 启动 cron 作业计算 π 后2000位,每5分钟打印一次. kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'
注意:
Flag --generator
has been deprecated, has no effect and will be removed in the future
--schedule=<schedule> CronJob --restart=Always Deployment --restart=OnFailure Job --restart=Never Pod
如果不指定生成器,kubectl 将按以下顺序考虑其他参数:
--schedule --restart
kubectl create
kubectl create namespace
#创建一个命名空间 kubectl create namespace mynamespace kubectl create namespace myns -o yaml --dry-run
kubectl create pod
#通过pod.json文件创建一个pod。 kubectl create -f ./pod.json 通过stdin的JSON创建一个pod。 cat pod.json | kubectl create -f - API版本为v1的JSON格式的docker-registry.yaml文件创建资源。 kubectl create -f docker-registry.yaml --edit --output-version=v1 -o json
kubectl create deployment
#创建一个deployment kubectl create deployment nginx --image=nginx --restart=always
kubectl create configmap
#创建一个configmap echo -e "foo3=lili\nfoo4=lele" > config.txt kubectl create configmap db-config --from-env-file=config.txt kubectl get cm db-config -o yaml kubectl create configmap config --from-literal=foo=lala --from-literal=foo2=lolo kubectl describe cm config echo -e "var1=val1\n# this is a comment\n\nvar2=val2\n#anothercomment" > config.env kubectl create cm configmap3 --from-env-file=config.env kubectl get cm configmap3 -o yaml echo -e "var3=val3\nvar4=val4" > config4.txt kubectl create cm configmap4 --from-file=special=config4.txt kubectl describe cm configmap4
kubectl create quota
#创建一个quota kubectl create quota myrq --hard=cpu=1,memory=1G,pods=2 --dry-run -o yaml
kubectl create secret
#创建一个secret kubectl create secret generic mysecret --from-literal=password=mypass echo -n admin > username kubectl create secret generic mysecret2 --from-file=username kubectl get secret mysecret2 -o yaml echo YWRtaW4K | base64 -d # on MAC it is -D, which decodes the value and shows 'admin' kubectl get secret mysecret2 -o jsonpath='{.data.username}{"\n"}' | base64 -d kc secret generic my-secret --from-literal=APP_SECRET=sdcdcsdcsdcsdc kc secret generic my-secret --from-file=secret.txt kc secret generic my-secret --from-env-file=secret.env
kubectl create job/cronjob
#创建一个job kubectl create job pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)' kubectl create job busybox --image=busybox --dry-run=client -o yaml -- /bin/sh -c 'while true; do echo hello; sleep 10;done' > job.yaml job.spec.activeDeadlineSeconds=30 #如果执行超过30秒则停止job, job.spec.completions=5 #运行5次 job.spec.parallelism=5 #并行运行5次 #创建一个cronjob,定时任务 kubectl create cronjob busybox --image=busybox --schedule="*/1 * * * *" -- /bin/sh -c 'date; echo Hello from the Kubernetes cluster' kubectl create cronjob time-limited-job --image=busybox --restart=Never --dry-run=client --schedule="* * * * *" -o yaml -- /bin/sh -c 'date; echo Hello from the Kubernetes cluster' > time-limited-job.yaml
kubectl create serviceaccount
#创建一个serviceaccount kubectl create sa myuser kubectl get sa -A kubectl get sa default -o yaml > sa.yaml kubectl run nginx --image=nginx --restart=Never --serviceaccount=myuser -o yaml --dry-run > pod.yaml kubectl create -f pod.yaml kubectl describe pod nginx # will see that a new secret called myuser-token-***** has been mounted
kubectl create rolebinding/role/clusterrolebinding/clusterrole
root@master:~/k8slib# k -n red create rolebinding secret-manager --role=secret-manager --user=jane rolebinding.rbac.authorization.k8s.io/secret-manager created root@master:~/k8slib# k -n blue create role secret-manager --verb=get --verb=list --resource=secrets role.rbac.authorization.k8s.io/secret-manager created root@master:~/k8slib# k -n blue create rolebinding secret-manager --role=secret-manager --user=jane rolebinding.rbac.authorization.k8s.io/secret-manager created #测试 root@master:~/k8slib# k -n red auth can-i get secrets --as jane yes root@master:~/k8slib# k -n red auth can-i get secrets --as tom no root@master:~/k8slib# k -n red auth can-i delete secrets --as jane no root@master:~/k8slib# k -n red auth can-i list secrets --as jane no root@master:~/k8slib# k -n blue auth can-i list secrets --as jane yes root@master:~/k8slib# k -n blue auth can-i get secrets --as jane yes root@master:~/k8slib# k -n blue auth can-i get pods --as jane no root@master:~/k8slib# k create clusterrole deploy-deleter --verb delete --resource deployments clusterrole.rbac.authorization.k8s.io/deploy-deleter created root@master:~/k8slib# k create clusterrolebinding deploy-deleter --user jane --clusterrole deploy-deleter clusterrolebinding.rbac.authorization.k8s.io/deploy-deleter created root@master:~/k8slib# k -n red create rolebinding deploy-deleter --user jim --clusterrole deploy-deleter rolebinding.rbac.authorization.k8s.io/deploy-deleter created root@master:~/k8slib# k auth can-i delete deployments --as jane yes root@master:~/k8slib# k auth can-i delete deployments --as jane -n default yes root@master:~/k8slib# k auth can-i delete deployments --as jane -n red yes root@master:~/k8slib# k auth can-i delete pods --as jane -n red no root@master:~/k8slib# k auth can-i delete deployments --as jim -n default no root@master:~/k8slib# k auth can-i delete deployments --as jim -A no root@master:~/k8slib# k auth can-i delete deployments --as jim -n red yes
kubectl exec
kubectl exec -it $(kubectl get pods -n kube-system| grep kube-apiserver|awk '{print $1}')
kubectl apply
# 将pod.json中的配置应用到pod kubectl apply -f ./pod.json # 将控制台输入的JSON配置应用到Pod cat pod.json | kubectl apply -f -
选项
-f, --filename=[]: 包含配置信息的文件名,目录名或者URL。 --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": 输出模式。"-o name"为快捷输出(资源/name). --record[=false]: 在资源注释中记录当前 kubectl 命令。 -R, --recursive[=false]: Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory. --schema-cache-dir="~/.kube/schema": 非空则将API schema缓存为指定文件,默认缓存到'$HOME/.kube/schema' --validate[=true]: 如果为true,在发送到服务端前先使用schema来验证输入。
继承自父命令的选项
--alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 --certificate-authority="": 用以进行认证授权的.cert文件路径。 --client-certificate="": TLS使用的客户端证书路径。 --client-key="": TLS使用的客户端密钥路径。 --cluster="": 指定使用的kubeconfig配置文件中的集群名。 --context="": 指定使用的kubeconfig配置文件中的环境名。 --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 --kubeconfig="": 命令行请求使用的配置文件路径。 --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 --log-dir="": 如果不为空,将日志文件写入此目录。 --log-flush-frequency=5s: 刷新日志的最大时间间隔。 --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 --match-server-version[=false]: 要求服务端和客户端版本匹配。 --namespace="": 如果不为空,命令将使用此namespace。 --password="": API Server进行简单认证使用的密码。 -s, --server="": Kubernetes API Server的地址和端口号。 --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 --token="": 认证到API Server使用的令牌。 --user="": 指定使用的kubeconfig配置文件中的用户名。 --username="": API Server进行简单认证使用的用户名。 --v=0: 指定输出日志的级别。 --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。
kubectl replace
使用配置文件或stdin来替换资源。
语法:
$ kubectl get TYPE NAME -o yaml
示例:
使用pod.json中的数据替换pod。 kubectl replace -f ./pod.json 基于 stdin 输入的 JSON 替换 pod $ cat pod.json | kubectl replace -f - 更新镜像版本(tag)到v4 kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - 强制替换,删除原有资源,然后重新创建资源 kubectl replace --force -f ./pod.json
kubectl expose
将资源暴露为新的Kubernetes Service。
指定deployment、service、replica set、replication controller或pod ,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set只有当其选择器可转换为service支持的选择器时,即当选择器仅包含matchLabels组件时才会作为暴露新的Service。
资源包括(不区分大小写):
pod(po),service(svc),replication controller(rc),deployment(deploy),replica set(rs)
语法
$ kubectl expose (-f FILENAME | TYPE NAME) [–port=port] [–protocol=TCP|UDP] [–target-port=number-or-name] [–name=name] [–external-ip=external-ip-of-service] [–type=type]
示例
为RC的nginx创建service,并通过Service的80端口转发至容器的8000端口上。 kubectl expose rc nginx --port=80 --target-port=8000 创建 type NodePort 类型 svc kubectl expose pod audit-pod --type NodePort --port 5678 为使用副本集RS的复制的 nginx 创建一个服务,该服务使用80端口,并连接到容器的8000端口上 kubectl expose rs nginx --port=80 --target-port=8000 由“nginx-controller.yaml”中指定的type和name标识的RC创建Service,并通过Service的80端口转发至容器的8000端口上。 kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000 为一个 pod 的有效端口创建一个服务,该服务在444的端口使用名为“frontend” kubectl expose pod valid-pod --port=444 --name=frontend 基于上述服务创建第二个服务,将容器端口8443对外暴露为端口443,名称为 “nginx-https” kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https 为端口4100上的复制流应用创建一个服务,平衡UDP流量并命名为“video-stream”. kubectl expose rc streamer --port=4100 --protocol=udp --name=video-stream 为一个 nginx deployment 创建服务,该服务在端口80上运行,并连接到容器的8000端口. kubectl expose deployment nginx --port=80 --target-port=8000
kubectl explain
打印指定的定义资源
能的资源类型包括:pods (po)、services (svc)、replicationcontrollers (rc)、nodes (no)、events (ev)、componentstatus (cs)、limitranges (limits)、persistentvolume (pv)、persistentvolume eclures (pvc)、resourcequotas (quota)、namespaces (ns)、horizontalpodautoscalers (hpa)、endpoints (ep)。
--recursive展示完整的spec递归字段
kubectl explain deployment.spec --recursive
$ kubectl explain deployment.spec KIND: Deployment VERSION: apps/v1 RESOURCE: spec <Object> DESCRIPTION: Specification of the desired behavior of the Deployment. DeploymentSpec is the specification of the desired behavior of the Deployment. FIELDS: minReadySeconds <integer> Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) paused <boolean> Indicates that the deployment is paused. progressDeadlineSeconds <integer> The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. replicas <integer> Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. revisionHistoryLimit <integer> The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. selector <Object> -required- Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. strategy <Object> The deployment strategy to use to replace existing pods with new ones. template <Object> -required- Template describes the pods that will be created.
kubectl explain deployments.spec # or kubectl explain deployment.spec # or kubectl explain deploy.spec
kubectl annotate
更新注释
使用注释 'description' 和值 'my frontend' 更新 pod'foo'. #如果相同的注释多次设置,则只会应用最后一个值 kubectl annotate pods foo description='my frontend' 在 “pod.json” 中更新由类型和名称标识的 pod kubectl annotate -f pod.json description='my frontend' 使用注释 'description' 和值 'my frontend running nginx' 更新 pod'foo',并覆盖任何现有值. kubectl annotate --overwrite pods foo description='my frontend running nginx' 更新命名空间中的所有 pod kubectl annotate pods --all description='my frontend running nginx' 仅当资源与版本1没有变化时才更新 pod'foo'. kubectl annotate pods foo description='my frontend running nginx' --resource-version=1 通过删除名为 “description” 的注释(如果存在)更新 pod'foo'. #不需要 --overwrite 标志. kubectl annotate pods foo description-
kubectl get
kubectl get namespaces kubectl get ns kubectl get event
kubectl get pods
kubectl get pods pod1 pod2 #获取多个pod kubectl get pods -n logging kubectl get pods -n logging -o wide kubectl get pods -A kubectl get po -A kubectl get po -A -o wide --- kubectl get po nginx -o yaml # or kubectl get po nginx -oyaml # or kubectl get po nginx --output yaml # or kubectl get po nginx --output=yaml --- kubectl get pods pods zongxun-test-1 -o yaml -n <namespace> #查看完整创建配置信息 kubectl get pods pods zongxun-test-1 -o yaml -n <namespace> | more #查看部分创建配置信息 kubectl get pods pods zongxun-test-1 -o json -n <namespace> #查看创建配置信息 kubectl get pods -A --show-labels #显示pod并带label kubectl get pods -A -L controller-revision-hash #获取标为controller-revision-hash的pod kubectl get pods -A --watch #动态查看pod状态,如何杀掉pod,状态由running变为terminting #Get only the 'app=v2' pods kubectl get po -l app=v2 # or kubectl get po -l 'app in (v2)' # or kubectl get po --selector=app=v2
–selector
# 获取包含 app=cassandra 标签的所有 Pods 的 version 标签 kubectl get pods --selector=app=cassandra -o \ jsonpath='{.items[*].metadata.labels.version}'
–field-selector
参考资料:https://blog.csdn.net/fly910905/article/details/102572878
- metadata.name=my-service
- metadata.namespace!=default
- status.phase=Pending
kubectl get pods --field-selector status.phase=Running -n kube-system #查看正在运行的pod kubectl get pods --field-selector status.phase=Runnin kubectl get ingress --field-selector foo.bar=baz kubectl get services --field-selector metadata.namespace!=default 链式选择器 kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
–sort-by排序
# 列出当前名字空间下所有 Services,按名称排序 kubectl get services --sort-by=.metadata.name # 列出 Pods,按重启次数排序 kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' # 列举所有 PV 持久卷,按容量排序 kubectl get pv --sort-by=.spec.capacity.storage # 列出事件(Events),按时间戳排序 kubectl get events --sort-by=.metadata.creationTimestamp # 根据重启次数排序列出 pod kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' kubectl get pv --sort-by=.spec.capacity.storage
-o=custom-columns
# 集群中运行着的所有镜像 root@master:~# k get pods -A -o=custom-columns='DATA:spec.containers[*].image' DATA nginx nginx calico/node:v3.16.6 calico/node:v3.16.6 calico/node:v3.16.6 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/kube-apiserver:v1.20.7 k8s.gcr.io/kube-controller-manager:v1.20.7 k8s.gcr.io/kube-proxy:v1.20.7 k8s.gcr.io/kube-proxy:v1.20.7 k8s.gcr.io/kube-proxy:v1.20.7 k8s.gcr.io/kube-scheduler:v1.20.7 kubernetesui/metrics-scraper:v1.0.6 # 列举 default 名字空间中运行的所有镜像,按 Pod 分组 kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image" NAME IMAGE frontend nginx # 除 "k8s.gcr.io/coredns:1.6.2" 之外的所有镜像 root@master:~# kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="calico/node:v3.16.6")].image' DATA nginx nginx <none> <none> <none> k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/kube-apiserver:v1.20.7 k8s.gcr.io/kube-controller-manager:v1.20.7 k8s.gcr.io/kube-proxy:v1.20.7 k8s.gcr.io/kube-proxy:v1.20.7 k8s.gcr.io/kube-proxy:v1.20.7 k8s.gcr.io/kube-scheduler:v1.20.7 kubernetesui/metrics-scraper:v1.0.6 # 输出 metadata 下面的所有字段,无论 Pod 名字为何 kubectl get pods -A -o=custom-columns='DATA:metadata.*' kubectl get pods -o custom-columns='NAME:metadata.name' kubectl get pods \ -o custom-columns='NAME:metadata.name,NODE:spec.nodeName' # Select all elements of a list kubectl get pods -o custom-columns='DATA:spec.containers[*].image' # Select a specific element of a list kubectl get pods -o custom-columns='DATA:spec.containers[0].image' # Select those elements of a list that match a filter expression kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image' # Select all fields under a specific location, regardless of their name kubectl get pods -o custom-columns='DATA:metadata.*' # Select all fields with a specific name, regardless of their location kubectl get pods -o custom-columns='DATA:..image'
jsonpath
# 获取包含 app=cassandra 标签的所有 Pods 的 version 标签 kubectl get pods --selector=app=cassandra -o jsonpath='{.items[*].metadata.labels.version}' # 获取指定 pod 内的容器名字 kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].name}" | tr -s '[[:space:]]' '\n' |sort |uniq # 获取全部节点的 ExternalIP 地址 kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' # 假设你的 Pods 有默认的容器和默认的名字空间,并且支持 'env' 命令,可以使用以下脚本为所有 Pods 生成 ENV 变量。 # 该脚本也可用于在所有的 Pods 里运行任何受支持的命令,而不仅仅是 'env'。 for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod env; done #获取k8s集群节点和k8s版本 $ kubectl get nodes -o=jsonpath=$'{range .items[*]}{@.metadata.name}: {@.status.nodeInfo.kubeletVersion}\n{end}' master: v1.20.1 node1: v1.20.1 node2: v1.20.1 #获取k8s集群节点和docker版本 $ kubectl get nodes -o=jsonpath=$'{range .items[*]}{@.metadata.name}: {@.status.nodeInfo.containerRuntimeVersion}\n{end}' master: docker://19.3.4 node1: docker://19.3.4 node2: docker://19.3.4 #获取node节点apparmor是否开启 kubectl get nodes -o=jsonpath=$'{range .items[*]}{@.metadata.name}: {.status.conditions[?(@.reason=="KubeletReady")].message}\n{end}' master: kubelet is posting ready status. AppArmor enabled node1: kubelet is posting ready status. AppArmor enabled node2: kubelet is posting ready status. AppArmor enabled
go-template
kubectl get myslclusters -A -o go-template --template='{{ range.items }}{{ printf "%s