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 #镜像保存为离线文件
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐