kubernetes 常用命令示例

环境信息

  • 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

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 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

kubeadm token create

如果你没有 --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。

kubectl cordon $NODENAME

检查集群控制组件的健康状态

API 服务器对外暴露了一个名为 componentstatusesAPI 资源,用来显示每个控制平面组件的健康状态。可以通过以下命令列出各个控制平面组件的健康状态

$ 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-apiproject=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 ,其中 TYPEkubernetes.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,可选模式还包括 IPVSuserspace (性能太差,几乎不使用),要查看节点使用的 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 命令参考

脚注