学习笔记 k8s常用命令
请注意,备份 etcd 数据是一个敏感的操作,建议在执行备份和恢复之前详细了解 etcd 的配置和集群状态。此外,确保备份是定期进行的,以便在需要时能够迅速恢复数据。你可以通过查看 etcd 的配置文件或系统服务来确认具体的数据目录。一个集群上下文(Context)是一组集群、用户和命名空间的组合,用于标识 kubectl 操作的目标。当CPU利用率超过70%时,HPA将尝试增加Pod的数量,但最
k8s常用kubectl命令
K8S服务相关
如果虚拟机关机了,k8s起不来,6443端口拒绝,解决方法:
- 首先查swap、selinux、防火墙看看是否是关闭的,要是处于关闭状态
- 查看虚拟机时间,一定要同步,看机器ip是否变化,不能变,要跟关机之前一样
- 如果前面两个步骤检查没问题,把所有的k8s节点的kubelet重启下,systemctl restart kubelet
- 还不行,那就得再次重启机器了,再次把安装k8s的所有结点的机器重启
- 如果重启之后,还不行,kubeadm reset卸载,重装
systemctl restart containerd
systemctl status containerd
systemctl status kubelet
systemctl restart kubelet
查看版本
kubectl version --short
查看容器运行时
kubectl get nodes -owide
集群
Kubectl基本介绍,以及配置kubeconfig
- kubectl是操作k8s集群的命令行工具,可以安装在k8s的master节点,也可以安装到工作节点
- kubectl在$HOME/.kube目录中查找一个名为config的文件, 你可以通过设置Kubeconfig环境变量或设置–kubeconfig来指定其他的kubeconfig文件
- kubectl通过与apiserver交互可以实现对k8s集群中各种资源的增删改查。
export KUBECONFIG=/etc/kubernetes/admin.conf
ssl 认证
生成一个证书
在kubeconfig下新增加一个lucky这个用户
(1)生成一个私钥
cd /etc/kubernetes/pki/
umask 077; openssl genrsa -out lucky.key 2048
(2)生成一个证书请求
openssl req -new -key lucky.key -out lucky.csr -subj "/CN=lucky"
(3)生成一个证书
openssl x509 -req -in lucky.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out lucky.crt -days 3650
(4)把lucky这个用户添加到kubernetes集群中,可以用来认证apiserver的连接
#创建一个lucky-test名称空间
kubectl create ns lucky-test
#设置集群配置:
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://192.168.40.110:6443 --kubeconfig=/root/test.config
#设置用户凭证:
kubectl config set-credentials lucky --client-certificate=./lucky.crt --client-key=./lucky.key --embed-certs=true --kubeconfig=/root/test.config
#在kubeconfig下新增加上下文
kubectl config set-context lucky@kubernetes --cluster=kubernetes --user=lucky --kubeconfig=/root/test.config
测试lucky 默认权限
切换账号到lucky,默认没有任何权限
kubectl config use-context lucky@kubernetes --kubeconfig=/root/test.config
kubectl get pods --kubeconfig=/root/test.config
显示没权限访问
赋予命名空间权限
把lucky用户通过rolebinding绑定到clusterrole上,授予权限,权限只是在lucky这个名称空间有效
kubectl create rolebinding lucky -n lucky-test --clusterrole=cluster-admin --user=lucky
测试是否有创建pod的权限
kubectl run my-pod --namespace=lucky-test --image=nginx --kubeconfig=/root/test.config
添加一个test的普通用户测试
useradd test
mkdir /home/test/.kube
cp -ar /root/test.config /home/test/.kube/config
chown -R test.test /home/test/
su - test
kubectl get pods -n lucky-test
设置集群上下文配置文件 set-context
设置 Kubernetes 配置文件(kubeconfig)中的上下文信息
kubectl config set-context CONTEXT_NAME --cluster=CLUSTER_NAME --user=USER_NAME --namespace=NAMESPACE_NAME
#具体参数的含义如下:
#CONTEXT_NAME:要设置的上下文的名称。
#--cluster=CLUSTER_NAME:关联的集群名称。
#--user=USER_NAME:关联的用户名称。
#--namespace=NAMESPACE_NAME:关联的命名空间。
创建了一个名为 “my-context” 的上下文,该上下文与名为 “my-cluster” 的集群和名为 “my-user” 的用户关联,以及指定了默认的命名空间为 “my-namespace”:
kubectl config set-context my-context --cluster=my-cluster --user=my-user --namespace=my-namespace
切换到这个新创建的上下文
kubectl config use-context my-context
切换集群
一个集群上下文(Context)是一组集群、用户和命名空间的组合,用于标识 kubectl 操作的目标。
查看所有上下文
kubectl config get-contexts
切换到指定上下文
kubectl config use-context <context-name>
kubectl config use-context my-cluster-context
确认是否切换成功
kubectl config current-context
节点
- cordon 主要用于禁用调度,不会影响已经运行的 Pod。
- drain 则用于节点的优雅退役,它会逐个驱逐节点上的 Pod,并尝试在其他节点上重新调度。
cordon设置节点是维护状态
- kubectl cordon 用于禁用节点的调度禁用节点的调度,防止新的 Pod 被调度到该节点上。这不会影响已经运行在节点上的 Pod。这个命令可以用于临时地排除一个节点,以进行维护或故障排除,而不中断正在运行的工作负载。
kubectl cordon <node_name>
drain 驱逐节点的pod
- drain命令用于从节点上删除Pod,以便可以对节点进行维护或升级。该命令将遍历节点上的每个Pod,并将其删除,同时确保正在进行的工作可以平滑地转移到其他节点上。
kubectl drain --ignore-daemonsets <node_name>
如果存在 DaemonSet 管理的 Pod,你将需要为 kubectl 设置 --ignore-daemonsets 以成功地清空节点。 kubectl drain 子命令自身实际上不清空节点上的 DaemonSet Pod 集合: DaemonSet 控制器(作为控制平面的一部分)会立即用新的等效 Pod 替换缺少的 Pod。 DaemonSet 控制器还会创建忽略不可调度污点的 Pod,这种污点允许在你正在清空的节点上启动新的 Pod。
删除节点
kubectl delete node <node-name>
加入新节点到集群
kubectl run nodes <node-name>
pod 相关
exec登录到pod
使用参数exec -it ,直接登录到pod中
kubectl exec -it jenkins-6fdb9d856f-q89rq -n jenkins-k8s bash
使用参数exec –it进到pod具体容器里
-c指定进入到pod具体容器里
kubectl exec -it pod名字 -c pod里容器的名字 -n namespace -- bash
cp拷贝
用于pod和物理机互相拷贝文件
将pod文件中/etc/hosts 复制到本地的/tmp/hosts
kubectl cp pod名字:/etc/hosts /tmp/hosts
kubectl cp my-pod:/etc/hosts /tmp/hosts -n lucky-test
将 本地text 拷贝到pod中
进入pod查看是否有该文件,再从本地拷贝文件至pod
kubectl cp text my-pod:/tmp/ -n lucky-test
拷贝报错解决
报错信息
kubectl cp --help
想要使用kubectl cp你的容器实例中必须有tar库,如果镜像中tar命令不存在,那么kubectl cp将失败
command terminated with exit code 126
解决办法
进入到pod中,安装tar命令
kubectl exec -it pod名字 bash
#创建阿里yum源,默认此镜像中带的是oracle的源,如果不能使用,就自己创建。
mv /etc/yum.repos.d/public-yum-ol7.repo /opt/
cat > /etc/yum.repos.d/CentOS-Base.repo <<EOF
[base]
name=CentOS7
baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
gpgcheck=0
EOF
yum install tar -y
退出pod后重新执行
kubectl cp pod名字:/etc/hosts /tmp/hosts
查看pod日志
查看pod中具体容器日志
kubectl logs pod名字 -c pod中指定容器的名字
强制删除pod
pod 状态terminal了,需要强制删除,一定要指定对应的namespace
kubectl delete pod <pod_name> -n namespace --grace-period=0 --force
kubectl delete pod test -n namespace --grace-period=0 --force
删除多个pod
#列出所有Pods的资源名称,找到状态为Terminating的pod
kubectl get pods -A | grep Terminating
# 找到pod对应名称
kubectl get pods -A | grep prometheus-server | awk '{print $2}'
#强制删除pod,一定要指定对应namespace才可删除
kubectl delete pod $(kubectl get pods -A | grep prometheus-server | awk '{print $2}') -n monitor-sa --grace-period=0 --force
查看 Pod 中指定容器的日志
如果 Pod 中有多个容器,你可以使用 -c 或 --container 选项指定要查看的容器的名称:
kubectl logs <pod_name> -c <container_name>
kubectl logs my-pod -c my-container
查看之前的日志
显示 Pod 上次运行时的日志
kubectl logs -p <pod_name> -c <container_name>
kubectl logs -p my-pod -c my-container
pod 扩容 scale
Deployment 实现pod的扩容
scale命令用于横向扩展,是kubernetes或者swarm这类容器编辑平台的重要功能之一
kubectl scale deployment <deployment_name> --replicas=<desired_replica_count>
kubectl scale deployment my-deployment --replicas=3
kubectl get deployment
StatefulSet 的扩容
kubectl scale statefulset <statefulset_name> --replicas=<desired_replica_count>
kubectl scale statefulset my-statefulset --replicas=5
kubectl get statefulset
ReplicaSet 的扩容
kubectl scale replicasets <replicaset_name> --replicas=<desired_replica_count>
kubectl scale replicasets my-replicaset --replicas=4
kubectl get replicasets
Horizontal Pod Autoscaler(HPA)根据资源使用情况自动调整Pod的副本数量
当CPU利用率超过70%时,HPA将尝试增加Pod的数量,但最多不超过10个,最少不少于1个
kubectl autoscale deployment my-deployment --cpu-percent=70 --min=1 --max=10
kubectl get hpa
autoscale命令用于自动扩展确认,scale需要手动执行,而autoscale则会根据负载进行调解。而这条命令则可以对Deployment进行设定,通过最小值和最大值的指定进行设定。
kubectl autoscale deployment nginx --min=2 --max=5
edit
动态修改k8s资源,立即生效
比如修改replicas 数量。以便调整pod数量
kubectl get deployment
kubectl edit deployment wordpress
删除和创建 通过yaml文件生成的pod
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml
删除标签
先附加标签,之后进行移除
kubectl get pods --show-labels
kubectl label nodes k8smaster1 node-role.kubernetes.io/work=
kubectl label nodes k8smaster1 node-role.kubernetes.io/work-
删除污点
给k8snode1打上污点 aaa=bbb:NoSchedule
kubectl taint node k8snode1 aaa=bbb:NoSchedule
kubectl describe no | grep -A 2 Taint #查看污点信息
kubectl taint nodes k8snode1 aaa=bbb:NoSchedule- #删除污点
删除 k8s 名称空间,一直卡在 terminating 状态,如何解决?
新开个终端,开启代理
kubectl get namespace qatest -o json >temp.json #输出json格式
vim temp.json
删除如下3行
finalizers
再开启一个新的终端执行如下:
kubectl proxy
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json http://127.0.0.1:8001/api/v1/namespaces/qatest/finalize
ctr相关命令
ctr -n k8s.io images list #查看所有镜像
ctr -n=k8s.io images pull #拉取镜像
ctr -n=k8s.io images pull docker.io/library/nginx:latest #拉取镜像,一定要写从docker.io的library项目 拉取那个镜像,标签是什么
#如:阿里云 拉取镜像
ctr -n=k8s.io images pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.0
ctr -n=k8s.io images tag existing-image:latest new-image:v1.0 #为镜像添加或更新标签。
ctr -n=k8s.io images export nginx.tar docker.io/library/nginx:latest #将镜像导出到 tar 文件。
ctr -n=k8s.io images import nginx.tar #从 tar 文件导入镜像。
ctr -n=k8s.io images rm docker.io/library/nginx:latest #删除一个或多个镜像。
# 实际使用时,你需要根据自己的 Kubernetes 集群环境和 containerd 配置调整命令中的 -n=k8s.io 参数,或者在没有指定命名空间的情况下直接使用 ctr images。如果 containerd 配置了非默认的 socket 路径,你可能还需要指定 -address=/run/containerd/containerd.sock 参数。
查看容器
ctr --namespace=k8s.io c ls
要查看具体某个容器的详细信息,可以按照如下方法查看:
ctr --namespace=k8s.io c info e5620b975527b4d0fc689f17a08aed4f9042401ace75a4018a50a3e1
1ab366f4
#e5620b975527b4d0fc689f17a08aed4f9042401ace75a4018a50a3e1是容器 id
基于 crictl ps 查看容器报错,如何排查?
crictl ps
报错如下:
I1105 17:45:06.653576 42707 util_unix.go:104] "Using this endpoint is deprecated, please
consider using full URL format" endpoint="/run/containerd/containerd.sock"
URL="unix:///run/containerd/containerd.sock"
容器运行时指定的格式有问题,按照如下方法解决
vim /etc/crictl.yaml
runtime-endpoint: /run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
上面配置可以看到 runtime-endpoint:后面的值是/run/containerd/containerd.sock,可以修改
成如下:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
修改好配置之后,重启 containerd 容器
systemctl restart containerd
etcd 备份
定位 etcd 数据目录:
在大多数情况下,etcd 数据目录位于 /var/lib/etcd。你可以通过查看 etcd 的配置文件或系统服务来确认具体的数据目录。
etcdctl --endpoints=<etcd-endpoint> snapshot save <backup-file-name>
etcdctl --endpoints=http://localhost:2379 snapshot save /path/to/backup.db
备份包含证书的集群:
etcdctl --endpoints=<etcd-endpoint> --cacert=/path/to/ca.crt --cert=/path/to/client.crt --key=/path/to/client.key snapshot save <backup-file-name>
恢复备份:
etcdctl snapshot restore <backup-file-name> --data-dir /var/lib/etcd-from-backup
请注意,备份 etcd 数据是一个敏感的操作,建议在执行备份和恢复之前详细了解 etcd 的配置和集群状态。此外,确保备份是定期进行的,以便在需要时能够迅速恢复数据。
pod网段变更,导致无法访问pod
Pod 网段是 10.244.0.0/16,但是最近发现网段变成了172.16.0.0/16 网段,导致无法访问 pod,该怎样调整呢?k8s 集群是好的。
如果 Kubernetes 集群中的 Pod 网段已经改变,可能是因为 CNI 插件(如 Flannel、Calico 等)
在安装或升级过程中发生了错误,导致 Pod 网络的配置被更改。
- 确认当前的 Pod 网络 通过 kubectl 命令查看当前的 Pod 网络配置,可以执行以下命令:
kubectl get cm kube-flannel-cfg -n kube-system -o yaml
如果你使用的是 Flannel CNI 插件,则名称可能是 kube-flannel-cfg,如果您使用的是其他
CNI 插件,则名称可能不同。
- 更新 Pod 网络 如果你发现当前的 Pod 网络与原始设计不符,你需要更新 Pod 网络配置。为了避免影响集群的稳定性和可用性,建议在非生产环境中进行测试和验证。
- 你可以编辑 CNI 插件的配置文件,或者重新安装或升级 CNI 插件,以便更改 Pod 网络配置。
如果你使用的是 Flannel CNI 插件,可以通过以下命令进行更新:
kubectl edit cm kube-flannel-cfg -n kube-system
将 Pod 网络配置更改为所需的 CIDR 段,例如:
apiVersion: v1
data:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
kind: ConfigMap
metadata:
name: kube-flannel-cfg
namespace: kube-system
重新启动 CNI 插件 一旦您更新了 Pod 网络配置,你需要重新启动 CNI 插件,以便更改
生效。您可以通过删除 CNI 插件的 Pod 来实现这一点,例如:
kubectl delete pod -n kube-system -l app=flannel
或者你也可以通过重启 Kubernetes 节点来重启 CNI 插件
重启 CNI 插件后,你应该可以重新访问 Pod 并恢复集群的正常运行。
docker 导出镜像
docker save -o inbound-agent.tar.gz jenkins/inbound-agent:latest #镜像保存为离线文件
更多推荐
所有评论(0)