暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

系统学习K8s——基础操作

巴韭特锁螺丝 2024-12-12
66

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 。使用<NodeIP>:<NodePort>
       从集群外部访问 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#该配置的类型,我们使用的是 Deployment
metadata:#译名为元数据,即 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:nginx
template:#这是选择或创建的Pod的模板
metadata:#Pod的元数据
labels:#Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app:nginx
spec:#期望Pod实现的功能(即在pod中部署)
containers:#生成container,与docker中的container是同一种
-name:nginx#container的名称
image:nginx:1.7.9#使用镜像nginx:1.7.9创建container,该container默认80端口可访问

暴露应用

apiVersion:v1
kind:Service
metadata:
name:nginx-service#Service 的名称
labels:#Service 自己的标签
app:nginx#为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:#这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector:#标签选择器
app:nginx#选择包含标签 app:nginx 的 Pod
ports:
-name:nginx-port#端口的名字
protocol:TCP#协议类型 TCP/UDP
port:80#集群内的其他容器组可通过 80 端口访问 Service
nodePort:32600#通过任意节点的 32600 端口访问 Service
targetPort: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
    如有涉及到侵权,请联系,将立即予以删除处理。
    在此特别鸣谢原作者的创作。
    此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。


    文章转载自巴韭特锁螺丝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论