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
kubectl 常用命令汇总
查询命令汇总
kubectl get nodes -o wide |
删除命令汇总
kubectl delete service -n <namespace> <name> |
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 \ |
其中的 token 可以在 master 上使用以下命令查看
kubeadm token list |
默认情况下,令牌会在 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 | \ |
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 |
查看指定节点的状态及其他详细信息
kubectl describe node <节点名称> |
标记 node 为不可调度
如果标记节点为不可调度(unschedulable),将阻止新 Pod 调度到该 Node 之上, 但不会影响任何已经在其上的 Pod。
kubectl cordon $NODENAME |
检查集群控制组件的健康状态
API 服务器对外暴露了一个名为 componentstatuses 的 API 资源,用来显示每个控制平面组件的健康状态。可以通过以下命令列出各个控制平面组件的健康状态
kubectl get componentstatuses |
pod
列出所有 pod
kubectl get pods -A |
查看 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 用户登陆容器。分别使用以下命令查询 POD 所在的节点和 容器 ID
kubectl get pods -n spinnaker -o wide |
如上命令可以查到所在节点和容器 ID ( 010226eaa372bab53c30f82af6a5918ebc46f158ecc6e379ed44f9e2994ed432 ),登陆到对应节点,使用 docker 命令以 root 用户登陆容器
docker exec -it -u root 010226eaa372bab53c bash |
实时监控 Pod 资源状态的变化
kubectl get pods -n frtg --watch |
使用 --watch 选项可以实时监听资源的变化情况。其原理是通过 API Server 的通知客户端资源变更的能力实现。当资源请求变更,API Server 处理变更后,会像订阅了资源变更的客户端发送资源变更的通知。
查看集群中可使用的资源项
kubectl api-resources |
以下命令可以分别查看在 namespace 中的资源和不在 namespace 中的资源
位于名字空间中的资源 |
日志
查看指定 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 |
以下示例,选择 没有标签 app 的 Pod。
kubectl get pod -n test -l '!app' |
以下示例,选择 符合标签和值 app=testpod-api 的 Pod
kubectl get pod -n test -l app=testpod-api |
以下示例,选择 具体有标签 app ,但是值不为 testpod-api 的 Pod
kubectl get pod -n test -l app!=testpod-api |
以下示例,列出 拥有标签 app ,且其值为 testpod-api 或者 testpod-front 的 Pod
kubectl get pod -n test -l 'app in (testpod-api,testpod-front)' |
以下示例,列出 拥有标签 app ,且其值不为 testpod-api 或者 testpod-front 的 Pod
kubectl get pod -n test -l 'app notin (testpod-api,testpod-front)' |
以下示例,列出 同时拥有标签 app=testpod-api 和 project=testpod 的 Pod 。使用逗号分割的多个条件时,必须满足所有匹配才算成功匹配到选择算符。
kubectl get pod -n test -l 'app=testpod-api,project=testpod' |
证书管理
查看集群证书过期时间
kubeadm certs check-expiration |
查看 secret 中证书的信息
Kubenetes 系统中,TLS 证书都是以 secret 的形式加密存储,要检查证书信息。参考以下命令
查看 secret ,其中 TYPE 为 kubernetes.io/tls 的是 ssl/tls 证书加密后的数据
kubectl get secret -n cattle-system |
要解密其中的数据并查看证书信息,参考以下步骤
提取证书内容。使用
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 |
CHANGE-CAUSE 列显示 <none> ,意味着没有记录每个修订的变更原因。要记录变更原因,需要在应用配置中包含正确的注解。例如,你可以在你的 Kubernetes manifests 中添加 kubernetes.io/change-cause 注解来记录变更原因。
如果要查看某个历史版本的详细信息,使用以下命令,要指定的版本使用参数 --revision=1
kubectl rollout history deployment/ops-test -n ops-test --revision=1 |
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 |
例如查看节点 kubernetes-node-jj1t 上的 kube-proxy 的模式,登陆到节点 kubernetes-node-jj1t ,执行命令
curl http://localhost:10249/proxyMode |
kube-proxy监听在端口127.0.0.1:10249,只能本机访问。