k8s实践总结

一、pod常用操作:

1、如何重启pod?

1.1 删除并重新创建Pod

这是最直接的方法。你可以通过kubectl命令行工具删除Pod,然后Kubernetes将基于其对应的Deployment、ReplicaSet或其他控制器自动重新创建它。

不建议并行删除全部pod,建议一个一个串行删除,至少保留一个pod可用,常用于删除一个pod(多pod情况下)。

kubectl delete pod <pod-name>

确保你知道Pod所属的Deployment或其他控制器,因为这将触发控制器重新创建Pod。如果你只删除了Pod而没有对应的控制器来重新创建它,那么Pod将不会自动恢复。

1.2 缩放Deployment然后恢复

将Deployment的副本数(replicas)缩放到0,然后再恢复到原始值,也可以达到重启Pod的效果。

此方法存在风险,不建议使用。其流程是先将副本调成 0,然后再改回目的副本数,会中断服务。

kubectl scale deployment/<deployment-name> --replicas=0  

kubectl scale deployment/<deployment-name> --replicas=<original-replica-count>

1.3 kubectl rollout restart

对于由Deployment管理的Pod,你可以使用kubectl rollout restart命令来重启所有的Pod实例。

这个命令是比较推荐的,通过

kubectl rollout restart deployment  -n 

kubectl rollout restart deployment <deployment_name> -n <namespace>

便可以重建这个deployment下的 pod,和滚动升级类似,并不会一次性杀死Pod,比较平滑。

这个命令会触发Deployment的滚动更新,即使Deployment的配置没有改变也会如此。 

1.4 kubectl replace

通过更新Pod ,从触发k8s pod 的更新。

kubectl get pod <pod_name> -n <namespace> -o yaml | kubectl replace --force -f -

1.5 kubectl set env

通过 设置环境变量,其实也是更新pod spec 从而触发滚动升级。

kubectl set env deployment <deployment name> -n <namespace> DEPLOY_DATE="$(date)"

 只不过这里通过kubectl 命令行,当我们通过API 更新pod spec 后一样会触发滚动升级

注意事项

  • 在执行上述操作之前,请确保你已经备份了任何重要的数据或配置,以防止数据丢失。
  • 了解你的Pod是如何被管理的(比如通过Deployment、StatefulSet、DaemonSet等),以便选择最合适的方法。
  • 在生产环境中,避免直接删除Pod,因为这可能会导致服务中断。通常,使用滚动更新或修改配置来触发更新是更安全的做法。
  • 考虑到Kubernetes的调度和容错机制,Pod可能会在任何时候因为各种原因(如节点故障、资源不足等)被重新调度或替换。因此,设计应用程序时应该考虑到这一点,确保它们是状态无关的或能够处理状态的持久化。

2、k8s的配置文件在哪?

在Kubernetes(K8s)中,使用kubeadm部署后,各组件的配置文件位于不同的位置。

对于kube-apiserver、kube-controller-manager、kube-scheduler和kubelet等组件,它们的配置文件目录通常是/etc/kubernetes。在这个目录下,你可以找到如/etc/kubernetes/manifests/kube-apiserver.yaml、/etc/kubernetes/manifests/kube-controller-manager.yaml、/etc/kubernetes/manifests/kube-scheduler.yaml等具体的配置文件。此外,kubelet的配置文件也位于/etc/kubernetes目录下。

请注意,这些路径可能会因不同的安装方式和操作系统而有所变化。因此,如果你在查找特定配置文件时遇到困难,建议查阅你的Kubernetes安装文档或相关资源,以获取最准确的信息。

此外,Kubernetes的配置还涉及到其他方面,如网络配置、存储配置、权限和认证配置等,这些配置可能分散在不同的文件中,也可能在集群的各个节点上都有相应的配置。因此,如果你需要对Kubernetes进行全面的配置管理,建议熟悉Kubernetes的架构和各个组件的功能,以便更好地理解和管理这些配置文件。

3、什么是etcd写满

etcd写满指的是etcd存储的数据量达到了其存储容量的上限。etcd是一个分布式键值存储系统,它用于存储和管理分布式系统的元数据。在Kubernetes等分布式系统中,etcd是集群状态存储的关键组件,负责存储集群的配置信息、状态以及元数据。

当etcd的存储空间被写满时,它将无法再接受新的写操作,这可能导致集群中的服务中断或数据不一致。因此,需要密切关注etcd的存储空间使用情况,并在必要时采取适当的措施来管理存储空间,例如清理不再需要的数据或扩展etcd的存储容量。

为了避免etcd写满的情况发生,管理员应该:

定期监控etcd的使用情况,包括存储空间、请求延迟和错误率等关键指标。

设置合理的数据保留策略,定期清理不再需要的数据。

如果预计数据增长很快,可以考虑在部署时预留足够的存储空间或配置etcd集群以支持更大的数据容量。

管理etcd存储空间是确保分布式系统稳定运行的重要一环,需要管理员仔细规划和实施相应的策略。

4、如何查看kubelet系统日志?

k8s排错指南-CSDN博客

5、如何查看集群基本信息?

kubectl cluster-info

6、kubectl get ep

kubectl get ep 命令用于获取 Kubernetes 集群中的端点(Endpoints)资源。端点资源表示服务的实际后端,通常是 Pod 的 IP 地址和端口。当你创建一个服务(Service)时,Kubernetes 会自动为你创建一个相应的端点对象,并将与该服务关联的 Pod 的 IP 地址和端口填充到端点对象中。这样,服务就可以通过端点来路由流量到实际的 Pod 上。

7、k8s中更新Deployment镜像

在Kubernetes (k8s) 中,如果你想要修改一个已存在的Deployment的镜像,你可以通过更新其YAML定义文件或者使用kubectl命令行工具来实现。以下是两种常见的方法:

方法一:通过更新YAML定义文件

获取现有的Deployment定义

使用kubectl get命令获取现有的Deployment定义,并保存到一个YAML文件中:

kubectl get deployment <deployment-name> -o yaml > deployment.yaml
编辑YAML文件

使用你喜欢的文本编辑器打开deployment.yaml文件,并找到spec.template.spec.containers部分。在这个部分中,你可以看到当前容器的镜像定义。修改image字段为你想要的新镜像:

spec:  
  template:  
    spec:  
      containers:  
      - name: <container-name>  
        image: <new-image-name>:<tag>  # 修改这里
应用更新

使用kubectl apply命令应用更新:

kubectl apply -f deployment.yaml

方法二:使用kubectl set image命令

你也可以直接使用kubectl set image命令来更新Deployment的镜像:

kubectl set image deployment/<deployment-name> <container-name>=<new-image-name>:<tag>

这里,<deployment-name>是你的Deployment的名字,<container-name>是容器的名字,<new-image-name>:<tag>是新的镜像名和标签。

示例 1: 更新单个 Pod 中的容器镜像

假设你有一个名为 my-pod 的 Pod,其中包含一个名为 my-container 的容器,你想将该容器的镜像更新为 new-image:v2:

kubectl set image pod/my-pod my-container=new-image:v2

示例 2: 更新多个 Pod 中的容器镜像(使用标签选择器)

如果你想更新所有带有标签 app=my-app 的 Pod 中的 my-container 容器镜像,可以使用标签选择器:

kubectl set image pods -l app=my-app my-container=new-image:v2

示例 3: 使用 YAML 文件更新 Pod 中的容器镜像

如果你有一个名为 pod.yaml 的 YAML 文件,其中包含 Pod 的定义,并且你想更新其中一个容器的镜像,可以使用 -f 参数:

kubectl set image -f pod.yaml my-container=new-image:v2

注意事项

在更新镜像之前,确保新的镜像已经存在于你的镜像仓库中,并且Kubernetes集群可以访问它。

更新镜像可能会导致Pod重启,这取决于你的Deployment配置和更新策略。

如果你的Deployment使用了滚动更新策略,那么新的Pod将会逐步替换旧的Pod。你可以通过查看Deployment的状态来跟踪这个过程。

在生产环境中更新镜像时,建议先在测试环境中验证新的镜像,以确保它按预期工作。

8、如何查看容器日志?

在Kubernetes(k8s)中,你可以使用kubectl命令行工具来查看容器的日志。以下是查看容器日志的几种方法:

查看单个容器的日志:

使用以下命令可以查看指定Pod中特定容器的日志:

kubectl logs <pod-name> -c <container-name>

其中<pod-name>是你要查看日志的Pod的名称,<container-name>是你要查看日志的容器的名称。如果Pod中只有一个容器,则无需指定-c参数。

实时跟踪日志输出:

如果你希望实时查看容器的日志输出,可以使用-f选项:

kubectl logs <pod-name> -c <container-name> -f

这将持续输出新的日志条目,直到你手动停止命令。

查看Pod中所有容器的日志:

如果一个Pod包含多个容器,并且你想查看所有容器的日志,可以使用--all-containers选项:

kubectl logs <pod-name> --all-containers

此命令将为Pod中的每个容器输出相应的日志。

使用标签选择器过滤日志:

如果你的集群中有多个Pod,并且你只想查看具有特定标签的Pod的日志,可以使用标签选择器:

kubectl logs -l <label-selector>

将<label-selector>替换为你的标签选择器表达式。

查看之前的日志:

默认情况下,kubectl logs命令可能只显示最近的日志条目。如果你想查看过去某个时间段内的日志,可能需要结合其他工具或方法来获取更老的日志数据,比如使用日志收集系统(如ELK Stack)或直接在节点上查看容器的日志文件。

请注意,执行这些命令需要你有足够的权限来访问Kubernetes集群和相关的Pod。如果你没有足够的权限,你可能需要联系你的集群管理员来获取相应的访问权限。同时,确保你的kubectl命令行工具已经配置正确,并且已经连接到正确的Kubernetes集群。

9、如何查看pod中有哪些容器?

在Kubernetes(k8s)中,你可以使用kubectl命令行工具来查看Pod中包含的容器。以下是查看Pod中容器列表的步骤:

首先,确保你已经配置好了kubectl来连接你的Kubernetes集群。

使用kubectl get pods命令列出集群中的所有Pod。你可以通过指定命名空间(如果需要的话)来过滤Pod列表,例如kubectl get pods -n <namespace>。

找到你感兴趣的Pod,并记下它的名称。

使用kubectl describe pod <pod-name>命令来获取Pod的详细信息。在输出的描述信息中,你会看到一个名为Containers或Init Containers(如果有初始化容器的话)的部分。

kubectl describe pod <pod-name>

在这个部分,你将看到Pod中每个容器的名称、镜像、使用的资源限制等信息。

如果你只想快速查看Pod中的容器名称,你可以使用jsonpath查询来提取这些信息:

kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].name}'

这个命令会输出Pod中所有容器的名称。

请注意,你需要有足够的权限来执行这些命令。如果你没有足够的权限,你可能需要联系你的集群管理员来获取相应的访问权限。

此外,如果你的Pod使用了初始化容器(Init Containers),它们会在主容器启动之前运行。这些初始化容器也会在Pod的描述信息中列出,但通常位于Init Containers部分。

10、kubectl get po -A | grep 0/1

在Kubernetes中,kubectl get po -A | grep 0/1 命令的作用是列出集群中所有命名空间(namespaces)下状态为 0/1 的Pod。这里的 -A 参数告诉 kubectl 在所有命名空间中查询Pod。

这个命令的执行流程如下:

  1. kubectl get po -A:列出集群中所有命名空间的Pod。
  2.  |:管道符,将前一个命令的输出作为下一个命令的输入。
  3. grep 0/1:从输入中筛选出包含 0/1 的行。

因此,这个命令将输出所有当前有一个容器但容器尚未就绪的Pod列表。这些Pod可能正在启动中,或者遇到了某些问题导致容器无法就绪。

如果你看到这个状态,你可以进一步使用 kubectl describe pod <pod-name> -n <namespace> 命令来查看特定Pod的详细信息。将 <pod-name> 替换为实际的Pod名称,<namespace> 替换为Pod所在的命名空间。这个命令将提供Pod的事件、容器状态、资源使用情况等详细信息,帮助你进一步诊断问题。

11、检查证书是否过期

kubeadm certs check-expiration

12、获取pod的ip

kubectl describe pod <pod-name> -o wide
kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'
kubectl describe pod <pod-name> | grep IP
kubectl get pod -n dev -o wide | grep pod-nodename | awk '{print $6}'

13、进入容器

kubectl exec -it <pod-name> -c <container-name> -- <command>

其中:

  • <pod-name> 是你要执行命令的Pod的名称。
  • -c <container-name> 是一个可选参数,用于指定Pod中的容器名称(如果Pod中有多个容器的话)。如果不指定,则默认使用Pod中的第一个容器。
  • -- 用于分隔kubectl exec的参数和你希望在容器内部执行的命令。
  • <command> 是你希望在容器内部执行的命令。

例如,如果你有一个名为my-pod的Pod,并且你想在这个Pod的my-container容器中执行ls命令来查看当前目录的内容,你可以这样做:

kubectl exec -it my-pod -c my-container -- ls

执行上述命令后,你将进入my-pod中my-container容器的交互式终端,并在其中执行ls命令。

如果你想要执行的是一个复杂的命令或者一个脚本,你可以直接在--后面跟上你的命令或脚本。例如,你可以执行bash -c 'your-complex-command'来运行一个复杂的bash命令。

需要注意的是,kubectl exec命令是在Pod内部执行的,因此它受到Pod和容器的限制和约束。确保Pod和容器正在运行,并且你有足够的权限来执行该命令。

此外,如果你想要在一个交互式shell中执行多个命令,可以将ls替换为/bin/bash或其他你希望的shell:

kubectl exec -it my-pod -- /bin/bash

这将会启动一个交互式shell,允许你在Pod中执行任意数量的命令。当你完成操作并退出shell时,kubectl exec命令也会结束。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker+k8s的微服务实战课程 课程目录 一、初识微服务 1 微服务-导学 2 软件架构的进化 3 什么是微服务 4 画出微服务架构图 5 微服务架构的优势和不足 二、微服务带来的问题及解决方案分析 1 微服务架构带来的问题 2 微服务间如何通讯 3 服务发现、部署更新和扩容 4 springboot&springcloud(上) 5 springboot&springcloud(下) 三、微服务开发 1 微服务业务分析 2 Thirft安装和验证 3 Python开发信息服务 4 开发用户服务(上) 5 开发用户服务(下) 6 开发用户EdgeService_A 7 开发用户EdgeService_B 8 开发用户EdgeService_C 9 开发用户EdgeService_D 10 dubbo入门操练(上) 11 dubbo入门操练(下) 12 开发课程服务 13 开发课程EdgeService 14 APIGatewayZuul 四、服务编排前奏 1 服务docker化(上) 2 服务docker化(下) 3 docker下的服务通讯(上) 4 docker下的服务通讯(下) 5 镜像仓库 6 三大平台扬帆起航 五、服务编排-Mesos 1 了解Mesos 2 画出Mesos集群架构图 3 集群环境搭建_A 4 集群环境搭建_B 5 集群环境搭建_C 6 调整微服务适应Mesos 7 微服务部署_A 8 微服务部署_B 9 微服务部署_C 六、服务编排-DockerSwarm 1 了解Swarm 2 集群环境搭建(上) 3 集群环境搭建(下) 4 调整微服务及服务配置 5 微服务部署 七、服务编排-Kubernetes 1 了解kubernetes(上) 2 了解kubernetes(下) 3 环境搭建前奏 4 预先准备环境 5 基础集群部署(上) 6 基础集群部署(下) 7 小试牛刀 8 kube-proxy和kube-dns 9 理解认证、授权 10 为集群添加认证授权(上) 11 为集群添加认证授权(下) 12 再试牛刀 13 部署我们的微服务 八、CICD和DevOps 1 了解CICD和DevOps 2 准备GitLab和Jenkins 3 CICD实践(上) 4 CICD实践(下) 九、课程总结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值