系统学习K8s——基础操作

艺帆风顺 发布于 2025-04-02 13 次阅读


1.K8s集群架构结构介绍

2.K8s创建一次部署

3.K8s的自愈

4.Pod介绍

5.K8s将多个pod封装成一个统一服务

6.K8s的滚动升级

7.K8s的对象描述符文件简单介绍

8.K8s安装lens

1.K8s集群架构结构介绍

在系统学习K8s——简介与安装中,我们学习了K8s的集群架构为主从结构。

master节点的关键组件:

  • kubelet(监工):所有节点必备,控制这个节点所有的pod生命周期以及与api-server的交互工作。

  • api-server:负责接收所有请求,集群内对集群的任何修改都是通过命令行,UI界面把请求发给api-server才能执行。api-server是整个集群对内,堆外的唯一入口。

  • kube-proxy:整个节点的网络流量负责

  • 都有容器运行时环境

worker节点:

  • kubelet(监工):所有节点必备的。控制这个节点所有pod的生命周期以及与api-server交互等工作

  • kube-proxy:整个节点的网络流量负责

  • cri:都有容器运行时环境

2.K8s创建一次部署

基本命令:

kubectl create deployment 这次部署的名字 --image=应用的镜像#创建nginx,并部署3份kubectl create deployment my-nginx --image=nginx --replicas=3#Create a deployment named my-nginx that runs the nginx image and expose port 80.kubectl create deployment my-nginx --image=nginx --port=80

Deployment(部署):在k8s中,通过kubectl create deployment命令,可以创建应用程序(docker image)的实例(docker container),这个实例会被包含在pod中,pod是K8s中的最小单元。

在K8s集群中发布deployment后,deployment将指示K8s如何创建和更新应用程序的实例,master节点将应用程序实例调度到集群中等具体节点上。

3.K8s的自愈

我们先创建3个节点的nginx,然后再删除一个pod,此时deployment有自愈机制,会自行恢复。

kubectl create deployment my-nginx --image=nginx --replicas=3

然后我们删除一个:

kubectl delete pod my-nginx-6b74b79f57-5bwp2

自愈原理:创建应用程序实例后,Kubernetes Deployment Controller会持续监控这些实例,如果运行实例的worker节点关机或者删除,则Kubernetes Deployment Controller将在集群资源中寻找最优的一个worker节点上创建一个新的实例。这提供了一种自我修复机制来解决机器故障或者维护问题。

在容器编排之前的年代,各种安装脚本通常用于开机启动应用程序,但是不能够使用应用程序从机器故障中恢复。通过创建应用程序实例并确保它们在集群中的运行实例个数,Kubernetes Deployment 提供了一种完全不同的方式来管理应用程序。

4.Pod介绍

前面简单实操了一下K8s,经常提到pod,现在我们来讲解一下pod是什么。Pod(容器组)是K8s中的一个抽象的概念,用于存放一组container(可包含一个或者多个container),以及这些container的一些共享资源,这些资源有:

  • 共享存储,称为卷(Volumes)

  • 网络,每个pod在集群中都有一个唯一IP,pod中的container共享该ip地址。

  • container的基本信息,例如镜像版本,暴露端口之类。

Pod(容器组)是K8s集群上的基本单元。当我们在K8s上创建Deployment时,会在集群上创建包含容器的pod(而不是直接创建容器)。每个pod都要与运行他的worker节点绑定,并保持在那里直到终止或删除。如果node发生故障,则会在集群中的其它node上运行相同的pod。

pod的故障排除常用命令:

# kubectl get 资源类型#获取类型为Deployment的资源列表    kubectl get deployments#获取类型为Pod的资源列表    kubectl get pods#获取类型为Node的资源列表    kubectl get nodes# kubectl describe 资源类型 资源名称#查看名称为nginx-XXXXXX的Pod的信息    kubectl describe pod nginx-XXXXXX    #查看名称为nginx的Deployment的信息    kubectl describe deployment my-nginx    # kubectl logs Pod名称#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的    kubectl logs -f nginx-pod-XXXXXXX# kubectl exec Pod名称 操作命令# 在名称为nginx-pod-xxxxxx的Pod中运行bash    kubectl exec -it nginx-pod-xxxxxx /bin/bash

5.K8s将多个pod封装成一个统一服务

我们通过service可以将多个pod封装成一组服务:

先来介绍一下什么是service:K8s的service是一个抽象层,他将一组pod聚合成一个service提供给外部调用,支持暴露,负载均衡,服务发现等。

  • 尽管每一个pod都有IP地址,但是如果没有service,这些IP不会暴露在集群外部,Service允许我们的应用程序接受流量,service有以下几种type方式暴露。

    • ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。

    • NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用: 从集群外部访问 Service。是 ClusterIP 的超集。

    • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。

    • ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本。

我们刚刚在发布nginx的时候,启动了3个副本,然后我们将这3个nginx组装成一个service。

kubectl expose deployment my-nginx --port=80 --target-port=80 --type=NodePort## --port:集群内访问service的端口 8912## --target-port:pod容器的端口 8080## --nodePort:每个机器开发的端口 30403

创建好后,我们进行验证

## 进行验证 kubectl get svc  curl ip:port

然后我们进入每一个pod内部修改nginx的主页标识,看看是否会负载均衡。

kubectl exec -it pod名  /bin/bash  #进pod并执行命令cd /usr/share/nginx/html/echo 11111111 > index.html

6.K8s的滚动升级介绍

滚动升级就是允许通过使用新的pod逐步更新老的pod从而实现Deployments更新,停机时间为0.

与应用程序的扩展类似,如果暴露了Deployment,服务(Service)将在更新期间仅对可用的pod进行负载均衡,可用pod是应用程序用户可用的实例。

滚动更新过程如图所示:

初始状态:

下线一个pod,然后上线一个pod:逐步更新:全部更新完成:

kubectl set image deployment/my-nginx  nginx=nginx:1.9.1

7.K8s的对象描述符文件简单介绍

我们之前使用K8s的命令行做了一些基本的操作,实际上这些命令非常多,记住及其困难,所以我们一般通过声明式API,通过对象描述符的文件YML来用文件固化操作。

我们要将我们要部署的服务写成yml文件。Pod --》 yaml , Deploy--》yaml , Service --》 yaml然后apply这个文件就可以了。kubectl apply -f xxx.yaml

部署一个应用的yml:

apiVersion:apps/v1#与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本kind:Deployment#该配置的类型,我们使用的是 Deploymentmetadata:#译名为元数据,即 Deployment 的一些基本属性和信息name:nginx-deployment#Deployment 的名称labels:#标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解app:nginx#为该Deployment设置key为app,value为nginx的标签spec:#这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用replicas:1#使用该Deployment创建一个应用程序实例selector:#标签选择器,与上面的标签共同作用,目前不需要理解matchLabels:#选择包含标签app:nginx的资源app:nginxtemplate:#这是选择或创建的Pod的模板metadata:#Pod的元数据labels:#Pod的标签,上面的selector即选择包含标签app:nginx的Podapp:nginxspec:#期望Pod实现的功能(即在pod中部署)containers:#生成container,与docker中的container是同一种-name:nginx#container的名称image:nginx:1.7.9#使用镜像nginx:1.7.9创建container,该container默认80端口可访问

暴露应用

apiVersion:v1kind:Servicemetadata:name:nginx-service#Service 的名称labels:#Service 自己的标签app:nginx#为该 Service 设置 key 为 app,value 为 nginx 的标签spec:#这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问selector:#标签选择器app:nginx#选择包含标签 app:nginx 的 Podports:-name:nginx-port#端口的名字protocol:TCP#协议类型 TCP/UDPport:80#集群内的其他容器组可通过 80 端口访问 ServicenodePort:32600#通过任意节点的 32600 端口访问 ServicetargetPort:80#将请求转发到匹配 Pod 的 80 端口type:NodePort#Serive的类型,ClusterIP/NodePort/LoaderBalancer

8.K8s安装lens

我们可以在windows上安装一个lens客户端(https://k8slens.dev/), 这样就可以使用图形界面的方式来操作K8s,非常便捷。

安装完毕后使用进行操作,把/etc/kubernetes/admin.conf 的文件全部复制进去,就可以链接并进行操作了!

    版权声明:本文内容来自个人博客segmentfault:苏凌峰,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://segmentfault.com/a/1190000044978492如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。