程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

佚名运维 k8s 训练营 - 第1天(k8s运维是什么)

balukai 2025-07-09 10:58:43 文章精选 3 ℃

1. K8s 是为了解决什么问题出现?的和 Docker 有什么关系

k8s目的在于简化容器化应用程序的部署和管理,它提供了多种功能,例如自动上线和回滚、容器自我修复、水平扩展、存储编排、配置管理等,以满足程序化管理多方面的需求。

Docker 是一个容器化平台,而 k8s 是 Docker 等容器平台的协调器。

2. K8s中有哪些核心组件,它们分别负责什么

master节点

(1)kube-apiserver: 提供kubernetes API服务,负责处理外部和内部组件的请求,并将这些操作存储到etcd中

(2)etcd:一个分布式键值存储系统,用于存储kubernetes集群的数据。etcd 是CoreOS开源的,并不属于kubernetes集群本身,因此etcd可以独立于集群进行部署

(3)kube-controller-manager:负责管理多个控制器的程序,包括Node Controller、Replication Controller、Service Controller等

(4)kube-scheduler:根据判定的算法,将未指定节点的Pod分配到合适的节点上

node节点

(1)kubelet:运行在每个节点上,负责管理pod和容器的生命周期。如启动容器、挂载数据卷、获取容器状态以及向管理节点汇报等。

(2)kube-proxy:也是运行在每个节点上,负责实现集群内部的网络代理和负载均衡器功能。

(3)container-runtime(容器运行时):实际运行和管理容器的服务。kubernetes支持多种容器运行时,如Docker、containerd、CRI-O等,以及支持kubernetes CRI的实现

3.K8s中的最小单元是什么

Pod是K8s中最小的可部署和管理单元。

4. 什么是容器运行时,有哪些常用的

容器运行时(Container Runtime)是容器技术的核心组件,负责创建、管理和运行容器。它是容器化应用程序的底层引擎,提供了容器的基础执行环境和应用隔离机制

常见的容器进行时:

(1)Docker Engine

Docker 是最流行的容器运行时,提供了完整的容器生命周期管理功能。它通过集成 containerd 和 runc 来实现容器的创建和管理。

(2)containerd

containerd 是由 Docker 团队开发的下一代容器运行时,专注于高性能和可扩展性。

(3)CRI-O

CRI-O 是专门为 Kubernetes 设计的轻量级容器运行时。

(4)runc

runc 是一个低级容器运行时,实现了 OCI 标准。

(5)cri-dockerd

cri-dockerd 是一个适配器,允许 Kubernetes 使用 Docker 作为容器运行时。它将 Kubernetes 的 CRI 请求转换为 Docker 的原生 API 调用。

5. 什么是CNI,有哪些常用的

CNI(Container Network Interface) 是 Kubernetes 网络模型的实现标准,负责实现 pod 之间的直接通信:包括容器与主机的通信、同节点pod通信、跨节点pod通信

常用的有

(1)Flannel:最初识时常用网络插件,它使用了虚拟网络技术来实现容器之间的通信,支持多种网络后端

(2)Calico:基于 BGP的网络插件,它使用路由表来路由容器之间的流量,支持多种网络拓扑结构,并提供了安全性和网络策略功能

(3)Cilium:基于eBPF (Extended Berkeley Packet Filter)技术的网络插件,它使用 Linux 内核的动态插件来提供网络功能,如路由、负载均衡、安全性和网络策略等

6. Pod与容器有什么区别


Pod

容器

抽象层次

K8s最小调度单元

应用运行实例

网络

共享网络命名空间

独立网络命名空间

存储

可共享存储卷

独立文件系统

生命周期

统一管理多个容器

单个进程生命周期

调度

作为整体被调度

不能直接被K8s调度

IP地址

一个Pod一个IP

容器共享Pod IP

7. 使用kubeadm安装一个Kubernetes集群



8. 使用Nginx镜像运行一个pod

(1)使用命令行创建

 kubectl run nginx-pod --image=nginx:latest --port=80

(2)使用yaml

 apiVersion: v1
 kind: Pod
 metadata:
   labels:
     app: nginx-pod
   name: nginx-pod
 spec:
   containers:
   - name: web
     image: nginx:1.23
     ports:
     - containerPort: 80
 kubectl apply -f nginx-pod.yaml 

9.如何查看此pod的事件

 # 查看Pod事件
 kubectl describe pod nginx-pod
 
 # 只查看事件部分
 kubectl get events --field-selector involvedObject.name=nginx-pod
 
 # 查看所有事件并按时间排序
 kubectl get events --sort-by=.metadata.creationTimestamp
 
 # 实时监控事件
 kubectl get events --watch

10.如何查看pod的日志

 # 查看Pod日志
 kubectl logs nginx-pod
 
 # 实时查看日志
 kubectl logs -f nginx-pod
 
 # 查看最近100行日志
 kubectl logs --tail=100 nginx-pod
 
 # 查看最近1小时的日志
 kubectl logs --since=1h nginx-pod
 
 # 多容器Pod指定容器
 kubectl logs nginx-pod -c nginx
 
 # 查看之前容器的日志
 kubectl logs nginx-pod --previous

11.如何查看Pod启动在哪个机器上

 # 查看Pod所在节点
 kubectl get pod nginx-pod -o wide
 
 # 详细信息包含节点
 kubectl describe pod nginx-pod | grep Node
 
 # 使用JSONPath查询
 kubectl get pod nginx-pod -o jsonpath='{.spec.nodeName}'
 
 # 查看节点上的所有Pod
 kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node-name>

12. 如何进入Pod中的容器

 # 进入Pod中的容器
 kubectl exec -it nginx-pod -- /bin/bash
 
 # 如果没有bash,使用sh
 kubectl exec -it nginx-pod -- /bin/sh
 
 # 多容器Pod指定容器
 kubectl exec -it nginx-pod -c nginx -- /bin/bash

13.K8s中什么是抽象资源,什么是实例资源

抽象资源:代表期望状态的资源对象。你通过创建或修改抽象资源来声明你希望系统达到什么状态(例如,“运行 3 个 Nginx 副本”),而不是直接命令系统如何操作。

实例资源:代表实际状态(Actual State)的资源对象。它们是系统中真实存在并运行的实体,是抽象资源所声明的期望状态被控制器具体化后的结果。

14. Pod是抽象对象还是实例

在 Kubernetes 中,Pod 既可以是抽象定义(蓝图),也可以是具体实例(运行时对象)

当你编写一个 Pod 的 YAML清单文件时,你定义的是 Pod 的期望状态。这个文件描述了你希望的Kubernetes 创建什么样的 Pod:它应该运行什么容器、需要多少 CPU/内存、挂载哪些卷、使用哪些标签等。此时,这个 YAML 文件中的Pod是一个抽象的定义或模板。它本身还不是一个运行中的实体。它只是一个声明式的描述。

而当我们创建"nginx-pod"时,它是Pod类型的一个具体实例。

15. 有哪些方法可以访问到上面部署的Nginx

方法一:端口转发

 # 将本地8080端口转发到Pod的80端口
 kubectl port-forward nginx-pod 8080:80
 
 # 访问
 curl http://localhost:8080
 

方法二:创建Service(推荐)

 # nginx-service.yaml
 apiVersion: v1
 kind: Service
 metadata:
   name: nginx-service
 spec:
   selector:
     app: nginx
   ports:
   - port: 80
     targetPort: 80
   type: ClusterIP  # 集群内访问
 
 kubectl apply -f nginx-service.yaml
 # 集群内访问
 curl http://nginx-service
 

方法三:NodePort Service(外部访问)

 apiVersion: v1
 kind: Service
 metadata:
   name: nginx-nodeport
 spec:
   selector:
     app: nginx
   ports:
   - port: 80
     targetPort: 80
     nodePort: 30080
   type: NodePort
 
 # 通过任意节点IP访问
 curl http://<node-ip>:30080
 

方法四:LoadBalancer(云环境)

 apiVersion: v1
 kind: Service
 metadata:
   name: nginx-lb
 spec:
   selector:
     app: nginx
   ports:
   - port: 80
     targetPort: 80
   type: LoadBalancer
 

方法五:Ingress(HTTP/HTTPS路由)

 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
   name: nginx-ingress
 spec:
   rules:
   - host: nginx.example.com
     http:
       paths:
       - path: /
         pathType: Prefix
         backend:
           service:
             name: nginx-service
             port:
               number: 80

16. Pod如何重启

Pod重启的几种方式:

(1)删除Pod(让控制器重建):

 # 如果Pod由Deployment管理
 kubectl delete pod nginx-pod
 # Deployment会自动创建新的Pod
 

(2)重启Deployment:

 kubectl rollout restart deployment nginx-deployment
 

(3)更新Pod配置触发重启:

 # 添加或修改环境变量
 kubectl patch pod nginx-pod -p '{"spec":{"containers":[{"name":"nginx","env":[{"name":"RESTART","value":"'$(date)'"}]}]}}'
 

(4)容器内重启服务:

 kubectl exec nginx-pod -- nginx -s reload

17. 如何删除上面创建的Pod

 # 直接删除Pod
 kubectl delete pod nginx-pod
 
 # 使用YAML文件删除
 kubectl delete -f nginx-pod.yaml
 
 # 强制删除)
 kubectl delete pod nginx-pod --force --grace-period=0

18. 这样单独创建Pod有什么缺点

(1)如果 Pod 运行的节点宕机、内核崩溃或 Pod 本身内部容器崩溃,Kubernetes 不会自动重新创建这个 Pod。

(2)当需要更新 Pod 的镜像版本或配置时,无法实现零停机更新。

(3)需要增加或减少服务实例数量时,必须手动创建或删除每个Pod 的YAML定义并应用。

(4)单独创建的 Pod 是单点,没有副本概念,一旦故障服务即中断。

最近发表
标签列表