「KUBERNETES」- 常用操作

  CREATED BY JENKINSBOT

常用命令

默认 namespace 配置:

# 修改特定 Context 的默认命名空间
kubectl config set-context "foo-internal" --namespace=ggckad-s2

# 修改当前 Context 的默认命名空间
kubectl config set-context --current --namespace=namepsace_name

从标准输入读取 YAML 定义:

kubectl apply -f <<EOF
kind: xxx
...
EOF

资源管理

参考 06.Kubernetes API Objects 笔记,获取使用 kubectl 管理 Pod Service Ingress Deployment 等等资源的方法(详见子章节)

删除资源定义:

kubectl delete -f foo.yaml

端口转发(kubectl port-forward)

端口转发通常用于测试或者调试,不会在生产中使用,因此这里仅简单介绍,能够满足需求即可。

// 转发 kubernetes-dashboard Service 的 443 端口
// 但是,默认监听 127.0.0.1 地址

# kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 30001:443
Forwarding from 127.0.0.1:30001 -> 8443
Forwarding from [::1]:30001 -> 8443

// 转发 kubernetes-dashboard Service 的 443 端口
// 并使其监听 0.0.0.0 地址

# kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard --address 0.0.0.0 30001:443
Forwarding from 0.0.0.0:30001 -> 8443

// 如果需要直接转发 Pod 的端口

# kubectl port-forward pods/mongo-75f59d57f4-4nd6q 28015:27017

查看资源定义

itaysk/kubectl-neat: Clean up Kubernetes yaml and json output to make it readable
kubectl get -o yaml: is it possible to hide metadata.managedFields? – Stack Overflow

kubectl get deployments.apps cert-manager -o yaml                               

# 关于多余字段:
# managedFields:旧版本将显示 managedFields 字段;Kubectl 1.21 将隐藏 managedFields 字段
# 通过 neat 插件开移除无关字段:kubectl get pod mypod -o yaml | kubectl neat

文件复制

azure aks – How to copy files from kubernetes Pods to local system

kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar                        # 复制本地文件到容器

kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar                        # 复制容器文件到本地

3.1. Listing Resources

查看所有的PODS:kubectl get pods

查看所有的服务和部署:kubectl get services,deployments

查看特定的部署:kubectl get deployment dep-name

查看所有资源:kubectl get all

很多资源都有简写:configmap cm, daemonsets ds, deployments deploy, endpoints ep, events ev, horizontalpodautoscalers hpa, ingresses ing, namespaces ns, nodes no, persistentvolumeclaims pvc, persistentvolumes pv, pods po, replicasets rs, replactioncontrollers rc, resourcequotas quota, serviceaccounts sa, services svc

3.2. Deleting Resources

查看命名空间:kubectl get namespace

删除命名空间:kubectl delete namesapce

根据标签删除特定的资源:kubectl delete svc,deploy -l app=niceone

强行删除PODS:kubectl delete pods pod-name –grace-period=0 –force

删除指定命名空间内的PODS:kubectl delete pods –all –namespace test

!!!不要直接删除被监控的对象,例如由部署控制的POD等等。应该先关闭监控进程,或者用特定的操作删除被管理的资源。例如,可以将一个部署缩小到零个副本,然后就可以有效的删除它所监控的POD了!!!

!!!级联删除和直接删除!!!当删除一个自定义的资源定义时,其所有的依赖对象也会被删除。参考「Garbage Collection」手册。

3.3. Watching Resource Changes with kubectl

观察资源的变化:kubectl get pods –watch # 该命令类似于TOP命令,但是在刷新屏幕时,有时不太可靠

还可以使用:watch kubectl get pods

3.4. Editing Resources with kubectl

使用kubectl edit编辑资源:

	# kubectl run nginx --image=nginx
	# kubectl edit deployment/nginx

然后会在编辑器内打开。修改信息后,系统会提示:deployment “nginx” edited

!!!并不是所有的变更都互触发部署!!!

!!!可以设置EDITOR环境变量来指定编辑器,例如EDITOR=emacs来使用Emacs编辑器!!!

!!!部分触发器由快捷键!!!例如修改部署的镜像版本,可以使用kubectl set image,该命令可以更新已有容器的镜像资源(对部署,副本集,副本控制器,服务进程集,简单的POD都有效)

3.5. Asking kubectl to Explain Resources and Fields

获取字段的信息:

	# kubectl explain service
	# kubectl explain service.metadata
	# kubectl explain service.metadata.namespace

命令kubectl explain从Swagger/OpenAPI定义中摘取由API服务器提供的资源和字段描述。

参考文献

Optional kubectl configurations/Introduction
使用kubectl delete pods xxx删除对应的pod,提示删除成功,但是立马又回生成一个。为何?
Get YAML for deployed Kubernetes services?
how to delete/remove calico cni from my kubernetes cluster
kubectl Port-Forward – Kubernetes Port Forwarding Guide
Command to delete all pods in all kubernetes namespaces – Stack Overflow
How to change default Namespace in Kubernetes | Edureka Community
kubectl Cheat Sheet | Kubernetes