环境信息
Centos-7 3.10.0-1062.9.1
Docker 19.03.15
containerd.io-1.4.13
kubectl-1.25.0
kubeadm-1.25.0
kubelet-1.25.0
kubectl 常用命令汇总 查询命令汇总 kubectl get nodes -o wide kubectl get pods -A -o wide kubectl get deployments -A -o wide kubectl get daemonsets -A -o wide kubectl get replicasets -A -o wide kubectl get services -A -o wide kubectl get endpointslices -A -o wide kubectl get ingresses -A -o wide kubectl get ingressclass -A -o wide kubectl get deployments,replicasets,pods,services,endpointslices,ingresses kubectl get configmaps -A kubectl get storageclasses -o wide kubectl get pv -o wide kubectl get pvc -o wide kubectl get pods -l app=nginx,env=prod # 查看过往相关所有事件,在排查 Pod 重启原因时非常有用 kubectl get events -n default --sort-by='.metadata.creationTimestamp' # kubectl run netshoot-tmp --image=nicolaka/netshoot -it --rm -- /bin/bash
删除命令汇总 kubectl delete service -n <namespace> <name> kubectl delete ingress -n <namespace> <name>
kubeadm 常用命令 kubeadm 命令官方参考文档
创建集群 kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
选项
说明
示例
--pod-network-cidr
指定 pod 的 cidr,安装 CNI 插件时,配置的 CIDR 要和此处一致
--service-cidr
service 使用的 CIDR
--cri-socket
配置集群使用的 CRI,不指定时系统会扫描主机,如果有多个可用 CRI,会出现提示
--apiserver-advertise-address
手动配置 api-server 的 Advertise IP 地址。 不配置的情况下,系统默认选择主机上的默认路由对应网卡上面的 IP
--control-plane-endpoint
配置 api-server 的共享地址,可以是域名或者负载均衡器的 IP 单节点的 Master 后期需要扩展为多节点(高可用)时,需要有此配置,否则不支持(kubeadm)扩展
添加节点到集群 kubeadm join 172.31.10.19:6443 --token 8ca35s.butdpihinkdczvqb --discovery-token-ca-cert-hash sha256:b2793f9a6bea44a64640f99042f11c4ff6 \ --cri-socket=unix:///var/run/cri-dockerd.sock
其中的 token 可以在 master 上使用以下命令查看
$ kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS 8ca35s.butdpihinkdczvqb 19h 2022-09-14T02:54:55Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
默认情况下,令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:
如果你没有 --discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它[1] :
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
kubectl 常用命令 kubectl 常用选项
选项
说明
示例
-n, --namespace=''
指定操作的 namespace
-A, --all-namespaces
列出所有的 namespace 中的资源
-o, --output=
输出格式,常用值包含: - json - yaml - wide
显示 Pod 详细信息
--show-labels
显示资源对象的标签
label
-l, --selector=''
使用标签选择算符选择对象
使用标签选择器列出 Pod 具体用法可以参考帮助信息 kubectl get --help | grep '\-l'
node 查看 node 信息 $ kubectl get nodes NAME STATUS ROLES AGE VERSION ops-kubernetes1 Ready control-plane 5h31m v1.25.0 ops-kubernetes2 Ready <none> 3h6m v1.25.0 ops-kubernetes3 Ready <none> 179m v1.25.0
查看指定节点的状态及其他详细信息
kubectl describe node <节点名称>
标记 node 为不可调度 如果标记节点为不可调度(unschedulable),将阻止新 Pod 调度到该 Node 之上, 但不会影响任何已经在其上的 Pod。
检查集群控制组件的健康状态 API 服务器对外暴露了一个名为 componentstatuses 的 API 资源 ,用来显示每个控制平面组件的健康状态。可以通过以下命令列出各个控制平面组件的健康状态
$ kubectl get componentstatuses Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true","reason":""}
pod 列出所有 pod $ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-flannel kube-flannel-ds-7q2hp 0/1 CrashLoopBackOff 52 (86s ago) 4h3m kube-flannel kube-flannel-ds-k8wd6 0/1 CrashLoopBackOff 47 (16s ago) 135m kube-flannel kube-flannel-ds-x6ck2 0/1 CrashLoopBackOff 29 (3m57s ago) 128m kube-system coredns-565d847f94-b4sgn 0/1 ContainerCreating 0 4h39m kube-system coredns-565d847f94-ml6k5 0/1 ContainerCreating 0 4h39m kube-system etcd-ops-kubernetes1 1/1 Running 0 4h39m kube-system kube-apiserver-ops-kubernetes1 1/1 Running 0 4h39m kube-system kube-controller-manager-ops-kubernetes1 1/1 Running 0 4h39m kube-system kube-proxy-9vwxl 1/1 Running 0 135m kube-system kube-proxy-qxsc7 1/1 Running 0 128m kube-system kube-proxy-v5msf 1/1 Running 0 4h39m kube-system kube-scheduler-ops-kubernetes1 1/1 Running 0 4h39m
查看 Pod 的 yaml 描述文件 kubectl get pod -n testns test-pod-d6bd6996c-dcfgq -o yaml
输出中也会包含 Pod 内部容器的详细状态
使用 kubectl 重启 pod 以下命令重启 kubernetes-dashboard
kubectl get pod kubernetes-dashboard -n kubernetes-dashboard -o yaml | kubectl replace --force -f -
这条命令的意思是 get 当前运行的 pod 的 yaml 声明,并管道重定向输出到 kubectl replace 命令的标准输入,从而达到重启的目的。
连接 Pod 中的容器 命令格式参考
$ kubectl exec test-nginx-deployment-59d795fbf6-bjgcz -it -n default -- bash root@test-nginx-deployment-59d795fbf6-bjgcz:/#
使用 root 用户登陆容器。分别使用以下命令查询 POD 所在的节点和 容器 ID
$ kubectl get pods -n spinnaker -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES spin-clouddriver-85d4985d4c-5rj4d 1/1 Running 0 6d20h 10.244.1.29 k8s-work1 <none> <none> $ kubectl describe pod -n spinnaker spin-clouddriver-85d4985d4c-5rj4d ... Containers: clouddriver: Container ID: docker://010226eaa372bab53c30f82af6a5918ebc46f158ecc6e379ed44f9e2994ed432
如上命令可以查到所在节点和容器 ID (010226eaa372bab53c30f82af6a5918ebc46f158ecc6e379ed44f9e2994ed432),登陆到对应节点,使用 docker 命令以 root 用户登陆容器
docker exec -it -u root 010226eaa372bab53c bash
实时监控 Pod 资源状态的变化 $ kubectl get pods -n frtg --watch NAME READY STATUS RESTARTS AGE frtg-admin-698bfc4998-8mccv 1/1 Running 0 13d frtg-api-748dc4bf87-dptbb 1/1 Running 0 43d frtg-api-748dc4bf87-xnsbr 1/1 Running 0 12d frtg-front-58796b88f7-k58sz 1/1 Running 0 13d frtg-search-d6bd6996c-dcfgq 1/1 Running 0 13d
使用 --watch 选项可以实时监听资源的变化情况。其原理是通过 API Server 的通知客户端资源变更的能力实现。当资源请求变更,API Server 处理变更后,会像订阅了资源变更的客户端发送资源变更的通知。
查看集群中可使用的资源项 $ kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding endpoints ep v1 true Endpoints events ev v1 true Event namespaces ns v1 false Namespace nodes no v1 false Node pods po v1 true Pod podtemplates v1 true PodTemplate secrets v1 true Secret serviceaccounts sa v1 true ServiceAccount services svc v1 true Service apiservices apiregistration.k8s.io/v1 false APIService controllerrevisions apps/v1 true ControllerRevision deployments deploy apps/v1 true Deployment replicasets rs apps/v1 true ReplicaSet jobs batch/v1 true Job endpointslices discovery.k8s.io/v1 true EndpointSlice events ev events.k8s.io/v1 true Event ingresses ing networking.k8s.io/v1 true Ingress networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy runtimeclasses node.k8s.io/v1 false RuntimeClass clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding clusterroles rbac.authorization.k8s.io/v1 false ClusterRole rolebindings rbac.authorization.k8s.io/v1 true RoleBinding roles rbac.authorization.k8s.io/v1 true Role csidrivers storage.k8s.io/v1 false CSIDriver csinodes storage.k8s.io/v1 false CSINode storageclasses sc storage.k8s.io/v1 false StorageClass volumeattachments storage.k8s.io/v1 false VolumeAttachment
以下命令可以分别查看在 namespace 中的资源和不在 namespace 中的资源
# 位于名字空间中的资源 kubectl api-resources --namespaced=true # 不在名字空间中的资源 kubectl api-resources --namespaced=false
日志 查看指定 namespace 中的指定 pod 的日志
kubectl logs kube-flannel-ds-7q2hp -n kube-flannel
默认将显示当前容器的日志,如果要看前一个已经被终止的容器的日志,可以使用选项 --previous
kubectl logs -n spinnaker spin-clouddriver-cd5999f64-ktxkp --previous
namespace 删除 namespace kubectl delete ns kubernetes-dashboard
label 查看 Pod 的 lables
kubectl get pod --show-labels
查看 Pod 中指定的 lables 的值
kubectl get pod -L app,project -n agmjys
使用标签选择器列出 Pod 标签选择器 允许我们选择标记有特定标签的资源对象的子集
以下示例,选择拥有标签 app 的 Pod,不管其值为何。
$ kubectl get pod -n test -l app NAME READY STATUS RESTARTS AGE testpod-admin-698bfc4998-8mccv 1/1 Running 0 8d testpod-api-748dc4bf87-dptbb 1/1 Running 0 38d testpod-api-748dc4bf87-xnsbr 1/1 Running 0 7d3h testpod-front-58796b88f7-k58sz 1/1 Running 0 8d testpod-search-d6bd6996c-dcfgq 1/1 Running 0 8d
以下示例,选择没有标签 app 的 Pod。
kubectl get pod -n test -l '!app'
以下示例,选择符合标签和值 app=testpod-api 的 Pod
$ kubectl get pod -n test -l app=testpod-api NAME READY STATUS RESTARTS AGE testpod-api-748dc4bf87-dptbb 1/1 Running 0 38d testpod-api-748dc4bf87-xnsbr 1/1 Running 0 7d3h
以下示例,选择具体有标签 app,但是值不为 testpod-api 的 Pod
$ kubectl get pod -n test -l app!=testpod-api NAME READY STATUS RESTARTS AGE testpod-admin-698bfc4998-8mccv 1/1 Running 0 8d testpod-front-58796b88f7-k58sz 1/1 Running 0 8d testpod-search-d6bd6996c-dcfgq 1/1 Running 0 8d
以下示例,列出拥有标签 app,且其值为 testpod-api 或者 testpod-front 的 Pod
$ kubectl get pod -n test -l 'app in (testpod-api,testpod-front)' NAME READY STATUS RESTARTS AGE testpod-api-748dc4bf87-dptbb 1/1 Running 0 38d testpod-api-748dc4bf87-xnsbr 1/1 Running 0 7d3h testpod-front-58796b88f7-k58sz 1/1 Running 0 8d
以下示例,列出拥有标签 app,且其值不为 testpod-api 或者 testpod-front 的 Pod
$ kubectl get pod -n test -l 'app notin (testpod-api,testpod-front)' NAME READY STATUS RESTARTS AGE testpod-admin-698bfc4998-8mccv 1/1 Running 0 8d testpod-search-d6bd6996c-dcfgq 1/1 Running 0 8d
以下示例,列出同时拥有标签 app=testpod-api 和 project=testpod 的 Pod 。使用逗号分割的多个条件时,必须满足所有匹配才算成功匹配到选择算符。
$ kubectl get pod -n test -l 'app=testpod-api,project=testpod' NAME READY STATUS RESTARTS AGE testpod-api-748dc4bf87-dptbb 1/1 Running 0 38d testpod-api-748dc4bf87-xnsbr 1/1 Running 0 7d3h
证书管理 查看集群证书过期时间 # kubeadm certs check-expiration [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Sep 24, 2024 08:15 UTC 364d no apiserver Sep 24, 2024 07:21 UTC 364d ca no apiserver-etcd-client Sep 24, 2024 07:21 UTC 364d etcd-ca no apiserver-kubelet-client Sep 24, 2024 07:21 UTC 364d ca no controller-manager.conf Sep 24, 2024 07:21 UTC 364d no etcd-healthcheck-client Sep 24, 2024 07:21 UTC 364d etcd-ca no etcd-peer Sep 24, 2024 07:21 UTC 364d etcd-ca no etcd-server Sep 24, 2024 07:21 UTC 364d etcd-ca no front-proxy-client Sep 24, 2024 07:21 UTC 364d front-proxy-ca no scheduler.conf Sep 24, 2024 07:21 UTC 364d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Sep 19, 2032 05:55 UTC 8y no etcd-ca Sep 19, 2032 05:55 UTC 8y no front-proxy-ca Sep 19, 2032 05:55 UTC 8y no
查看 secret 中证书的信息 Kubenetes 系统中,TLS 证书都是以 secret 的形式加密存储,要检查证书信息。参考以下命令
查看 secret ,其中 TYPE 为 kubernetes.io/tls 的是 ssl/tls 证书加密后的数据
# kubectl get secret -n cattle-system NAME TYPE DATA AGE cattle-credentials-0ce519b Opaque 3 368d cattle-credentials-3ab0831 Opaque 3 168d cattle-credentials-52bbb17 Opaque 3 168d cattle-credentials-67b55ac Opaque 3 368d cattle-token-6sh6m kubernetes.io/service-account-token 3 368d default-token-9qw6z kubernetes.io/service-account-token 3 368d serving-cert kubernetes.io/tls 2 368d stv-aggregation Opaque 5 368d tls-rancher kubernetes.io/tls 2 368d tls-rancher-internal kubernetes.io/tls 2 87d tls-rancher-internal-ca kubernetes.io/tls 2 368d # kubectl get secret tls-rancher -n cattle-system -o yaml apiVersion: v1 data: tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVUyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQTdNUnd3R2dZRFZRUUtFeE5rZVc1aGJXbGoKYkdsemRHVnVaWEl0YjNKbk1Sc3dHUVlEVlFRREV4SmtlVzVoYldsamJHbHpkR1Z1WlhJdFkyRXdIaGNOTWpJdwpPVEl5TURjd09ERTBXaGNOTXpJd09URTVNRGN3T0RFMFdqQTdNUnd3R2dZRFZRUUtFeE5rZVc1aGJXbGpiR2x6CmRHVnVaWEl0YjNKbk1Sc3dHUVlEVlFRREV4SmtlVzVoYldsamJHbHpkR1Z1WlhJdFkyRXdXVEFUQmdjcWhrak8KUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVFWWHN5NHpjak9CTE0wMVltTmlJSlhaQVVibVBxMUpRbGRSYmZSMEp0UQpCTFNZWlQxSUV4cmFRc1pwNjRoSGIzdTdQQTFxZ1p6ZVVmZy8wVTN2ZlFTcG8wSXdRREFPQmdOVkhROEJBZjhFCkJBTUNBcVF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVdjJiOWRrRGtudmZjQXNEMXplSEEKTE5XdGJJQXdDZ1lJS29aSXpqMEVBd0lEU1FBd1JnSWhBTUpGVHZ3aXE0YWkxUkhTZEx5cWt6dHBVblFSeFV4LwpMRDRRcVJEVXJhMDZBaUVBNk5lTkxIZHhhLzI4UDRra21uU0ZnN2Fhb0wwYytwanVDY2ZqVkxGZFNlND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= tls.key: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUEwMTFEeDg1bERackdNamJSNlpPVmlHeUN0OWUweWdaZW1FNUdoOUNlTitvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFRlY3TXVNM0l6Z1N6Tk5XSmpZaUNWMlFGRzVqNnRTVUpYVVczMGRDYlVBUzBtR1U5U0JNYQoya0xHYWV1SVIyOTd1endOYW9HYzNsSDRQOUZONzMwRXFRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= kind: Secret metadata: annotations: field.cattle.io/projectId: c-m-d8r2b4x5:p-8csc7 creationTimestamp: "2022-09-22T07:08:14Z" name: tls-rancher namespace: cattle-system resourceVersion: "11533" uid: 2d2410f3-0325-45c2-9a2a-5937c8fd7a53 type: kubernetes.io/tls
要解密其中的数据并查看证书信息,参考以下步骤
提取证书内容。使用 kubectl 命令提取 Secret 中的 tls.crt 字段(这是证书内容),然后使用 base64 解码它 kubectl get secret tls-rancher -n cattle-system -o jsonpath="{.data.tls\.crt}" | base64 --decode > tls-rancher.crt
查看证书信息 # openssl x509 -in tls-rancher.crt -noout -enddate notAfter=Sep 19 07:08:14 2032 GMT # openssl x509 -in tls-rancher.crt -text Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: ecdsa-with-SHA256 Issuer: O=dynamiclistener-org, CN=dynamiclistener-ca Validity Not Before: Sep 22 07:08:14 2022 GMT Not After : Sep 19 07:08:14 2032 GMT Subject: O=dynamiclistener-org, CN=dynamiclistener-ca Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:15:5e:cc:b8:cd:c8:ce:04:b3:34:d5:89:8d:88: 82:57:64:05:1b:98:fa:b5:25:09:5d:45:b7:d1:d0: 9b:50:04:b4:98:65:3d:48:13:1a:da:42:c6:69:eb: 88:47:6f:7b:bb:3c:0d:6a:81:9c:de:51:f8:3f:d1: 4d:ef:7d:04:a9 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment, Certificate Sign X509v3 Basic Constraints: critical CA:TRUE X509v3 Subject Key Identifier: BF:66:FD:76:40:E4:9E:F7:DC:02:C0:F5:CD:E1:C0:2C:D5:AD:6C:80 Signature Algorithm: ecdsa-with-SHA256 30:46:02:21:00:c2:45:4e:fc:22:ab:86:a2:d5:11:d2:74:bc: aa:93:3b:69:52:74:11:c5:4c:7f:2c:3e:10:a9:10:d4:ad:ad: 3a:02:21:00:e8:d7:8d:2c:77:71:6b:fd:bc:3f:89:24:9a:74: 85:83:b6:9a:a0:bd:1c:fa:98:ee:09:c7:e3:54:b1:5d:49:ee -----BEGIN CERTIFICATE----- MIIBqDCCAU2gAwIBAgIBADAKBggqhkjOPQQDAjA7MRwwGgYDVQQKExNkeW5hbWlj bGlzdGVuZXItb3JnMRswGQYDVQQDExJkeW5hbWljbGlzdGVuZXItY2EwHhcNMjIw OTIyMDcwODE0WhcNMzIwOTE5MDcwODE0WjA7MRwwGgYDVQQKExNkeW5hbWljbGlz LNWtbIAwCgYIKoZIzj0EAwIDSQAwRgIhAMJFTvwiq4ai1RHSdLyqkztpUnQRxUx/ LD4QqRDUra06AiEA6NeNLHdxa/28P4kkmnSFg7aaoL0c+pjuCcfjVLFdSe4= -----END CERTIFICATE-----
deployment Pod 更新后的回退管理 在 Kubernetes 中,使用 Deployment 管理的 Pod,在通过 Delpoyment 更新后,会记录 Pod 的更新记录,可以查看 Pod 更新记录并根据更新记录进行回退。核心命令为 kubectl rollout
查看 Pod 更新记录 要查看 Pod 更新记录,使用以下命令。需要注意 Deployment 的格式: deployment/<deployment-name>,否则报 error: the server doesn't have a resource type 错误
# kubectl rollout history deployment/ops-test -n ops-test deployment.apps/ops-test REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> 4 <none> 5 <none> 6 <none> 7 <none> 8 <none> 9 <none>
CHANGE-CAUSE 列显示 <none>,意味着没有记录每个修订的变更原因。要记录变更原因,需要在应用配置中包含正确的注解。例如,你可以在你的 Kubernetes manifests 中添加 kubernetes.io/change-cause 注解来记录变更原因。
如果要查看某个历史版本的详细信息,使用以下命令,要指定的版本使用参数 --revision=1
# kubectl rollout history deployment/ops-test -n ops-test --revision=1 deployment.apps/ops-test with revision #1 Pod Template: Labels: app.kubernetes.io/managed-by=spinnaker app.kubernetes.io/name=ops-test env=prod pod-template-hash=f47477b78 project=ops-test Annotations: artifact.spinnaker.io/location: ops-test artifact.spinnaker.io/name: ops-test artifact.spinnaker.io/type: kubernetes/deployment artifact.spinnaker.io/version: moniker.spinnaker.io/application: ops-test moniker.spinnaker.io/cluster: deployment ops-test Init Containers:
Pod 回退操作 在确定好要回退的版本后,执行以下命令,可回退到指定的版本
kubectl rollout undo deployment/ops-test --to-revision=<revision-number> -n ops-test
其他常见操作 获取节点上的 kube-proxy 代理模式 kube-proxy 负责 Service 到后端 Pod 的转发规则管理,默认使用 iptables,可选模式还包括 IPVS 和 userspace (性能太差,几乎不使用),要查看节点使用的 kube-proxy 模式,可以执行以下命令查看
$ kubectl get nodes NAME STATUS ROLES AGE VERSION kubernetes-node-6jst Ready <none> 2h v1.13.0 kubernetes-node-cx31 Ready <none> 2h v1.13.0 kubernetes-node-jj1t Ready <none> 2h v1.13.0
例如查看节点 kubernetes-node-jj1t 上的 kube-proxy 的模式,登陆到节点 kubernetes-node-jj1t,执行命令
$ curl http://localhost:10249/proxyMode iptables
kube-proxy 监听在端口 127.0.0.1:10249,只能本机访问。
参考链接 kubectl 命令参考
脚注