K8S一 k8s基础知识及实战

一 K8S 概览

在这里插入图片描述

1.1 K8S 是什么?

K8S官网文档:https://kubernetes.io/zh/docs/home/
K8S 是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白话就是:“K8S 是负责自动化运维管理多个跨机器 Docker 程序的集群”。

1.2 K8S核心特性

  • 服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。
  • 存储编排:自动挂载所选存储系统,包括本地存储。
  • Secret和配置管理:部署更新Secrets和应用程序的配置时不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。
  • 批量执行:除了服务之外,Kubernetes还可以管理你的批处理和CI工作负载,在期望时替换掉失效的容器。
  • 水平扩缩:使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行扩缩。
  • 自动化上线和回滚:Kubernetes会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。
  • 自动装箱:根据资源需求和其他约束自动放置容器,同时避免影响可用性。
  • 自我修复:重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器。

pod里装的是docker容器,pod是k8s里部署应用的最小单位(容器是docker里部署应用的最小单位);一个node下可以部署很多pod容器

1.3 K8S集群安装

参考后边这篇文章里的第二章 k8s集群部署

二 用K8S部署Nginx

在k8s-master机器上执行

# 创建一次deployment部署,最后nginx可以加版本号,如nginx:2.0,不写版本的话就是使用最新版nginx,最终部署到了node节点了,而不是master
kubectl create deployment nginx --image=nginx
kubectl get all

可以看到,已经部署了一个nginx容器
在这里插入图片描述
此时外网还不能访问这个nginx,需要做对外的端口映射

#端口映射,即创建一个nginx可以对外访问的端口,生成的端口是随机的(也可以指定端口) --port是service的虚拟ip对应的端口
kubectl expose deployment nginx --port=80 --type=NodePort  

再次执行kubectl get all命令
在这里插入图片描述

# 查看Nginx的pod和service信息
kubectl get pod,svc -o wide

在这里插入图片描述

访问Nginx地址:
http://任意节点的ip:图中Nginx的对外映射端口,http://192.168.65.203:30563

在这里插入图片描述
主节点ip:端口也能访问,但是需要做配置,后边会讲;

补充:
如果node节点添加进集群失败,可以删除节点重新添加
要删除 k8s­node1 这个节点,首先在 master 节点上依次执行以下两个命令

kubectl drain k8s‐node1 ‐‐delete‐local‐data ‐‐force ‐‐ignore‐daemonsets 

kubectl delete node k8s‐node1

执行后通过 kubectl get node 命令可以看到 k8s­node1 已被成功删除;
接着在 k8s­node1 这个 Node 节点上执行如下命令,这样该节点即完全从 k8s 集群中脱离开来,之后就可以重新执行命令添加到集群

kubeadm reset

三 K8S 核心架构原理

我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图:

在这里插入图片描述
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave 节点则执行用户的程序。但是在 K8S 中,主节点一般被称为Master Node 或者 Head Node,而从节点则被称为Worker Node 或者 Node。

注意:Master Node 和 Worker Node 是分别安装了 K8S 的 Master 和 Woker 组件的实体服务器,每个 Node 都对应了一台实体服务器(虽然 Master Node 可以和其中一个 Worker Node 安装在同一台服务器,但是建议 Master Node 单独部署),所有 Master Node 和 Worker Node 组成了 K8S 集群,同一个集群可能存在多个 Master Node 和 Worker Node。

首先来看Master Node都有哪些组件:

  • API Server。K8S 的请求入口服务。API Server 负责接收 K8S 所有请求(来自 UI 界面或者 CLI 命令行工具),然后,API Server 根据用户的具体请求,去通知其他组件干活。
  • Scheduler。K8S 所有 Worker Node 的调度器。当用户要部署服务时,Scheduler 会选择最合适的 Worker Node(服务器)来部署。
  • Controller Manager。K8S 所有 Worker Node 的监控器,解析API Server传过来的命令,解析后存储到下边的etcd库里。Controller Manager 有很多具体的 Controller, Node Controller、Service Controller、Volume Controller 等。Controller 负责监控和调整在 Worker Node 上部署的服务的状态,比如用户要求 A 服务部署 2 个副本,那么当其中一个服务挂了的时候,Controller 会马上调整,让 Scheduler 再选择一个 Worker Node 重新部署服务。
  • etcd。K8S 的存储服务。etcd 存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。

接着来看Worker Node的组件:

  • Kubelet。Worker Node 的监视器,以及与 Master Node 的通讯器。Kubelet 是 Master Node 安插在 Worker Node 上的“眼线”(相当于node的小管家),它会定期向 Master Node 汇报自己 Node 上运行的服务的状态,并接受来自 Master Node 的指示采取调整措施。负责控制所有容器的启动停止,保证节点工作正常。Kubelet上报给msater自己资源的使用情况后,master的调度器Scheduler就能根据每台node机器的实际情况来给各个node分配任务了;
  • Kube-Proxy。K8S 的网络代理。Kube-Proxy 负责 Node 在 K8S 的网络通讯、以及对外部网络流量的负载均衡。
  • Container Runtime。Worker Node 的运行环境。即安装了容器化所需的软件环境确保容器化程序能够跑起来,比如 Docker Engine运行环境。

在大概理解了上面几个组件的意思后,我们来看下上面用K8S部署Nginx的过程中,K8S内部各组件是如何协同工作的:

我们在master节点执行一条命令,如master部署一个nginx应用(kubectl create deployment nginx --image=nginx:2.0.1),都经历了哪些流程

  • 这条命令首先发到master节点的网关api server,这是matser的唯一入口
  • api server将命令请求交给controller mannager进行控制(controller mannager解析命令)
  • controller mannager 进行应用部署解析
  • controller mannager 会生成一次部署信息,并通过api server将信息存入etcd存储中
  • scheduler调度器通过api server从etcd存储中,拿到要部署的应用与node节点的信息,开始调度看哪个节点有资源适合部署
  • scheduler把计算出来的调度信息通过api server再放到etcd中
  • 每一个node节点的监控组件kubelet,随时和master保持联系(给api-server发送请求不断获取最新数据),拿到master节点存储在etcd中的部署信息
  • 假设node2的kubelet拿到部署信息,显示他自己节点要部署某某应用
  • kubelet就自己run一个应用在当前机器上,并随时给master汇报当前应用的状态信息
  • node和master也是通过master的api-server组件联系的
  • 每一个机器上的kube-proxy能知道集群的所有网络,只要node访问别人或者别人访问node,node上的kube-proxy网络代理自动计算进行流量转发

在这里插入图片描述

四 K8S 快速实战

4.1 kubectl命令使用

kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver实现各种增删改查等操作
kubectl官方使用文档:https://kubernetes.io/zh/docs/reference/kubectl/overview/
在这里插入图片描述
K8S的各种命令帮助文档做得非常不错,遇到问题可以多查help帮助

4.2 创建一个Tomcat应用程序

使用 kubectl create deployment 命令可以创建一个应用部署deployment与Pod

#my-tomcat表示pod的名称 --image表示镜像的地址 
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine

在这里插入图片描述
查看一下deployment的信息

kubectl get deployment
# 或者查看所有资源
kubectl get all
# 或者查看pod资源
kubectl get pod

在这里插入图片描述
获取pod的信息,-o wide 表示更详细的显示信息

kubectl get pod -o wide

在这里插入图片描述
查看Pod打印的日志

kubectl logs my-tomcat-685b8fd9c9-rw42d(pod名称)

使用 exec 可以在Pod的容器中执行命令,这里使用 env 命令查看环境变量

kubectl exec my-tomcat-685b8fd9c9-rw42d -- env
kubectl exec my-tomcat-685b8fd9c9-rw42d -- ls /   # 查看容器的根目录下面内容

在这里插入图片描述
在这里插入图片描述
进入Pod容器内部并执行bash命令,如果想退出容器可以使用exit命令

kubectl exec -it my-tomcat-685b8fd9c9-rw42d -- sh

在这里插入图片描述
在这里插入图片描述
这个ip与docker容器里的ip一样,重启服务器后是会变的,但是对我们没影响,因为这个ip是容器内部用的,我们用不到;

访问一下这个tomcat pod

集群内访问(在集群里任一node节点都可以访问)

curl 10.244.36.69:8080

在这里插入图片描述
集群外部访问
在这里插入图片描述
当我们在集群之外访问是发现无法访问,那么集群之外的客户端如何才能访问呢?这就需要我们的service服务了,下面我们就创建一个service,使外部客户端可以访问我们的pod;

4.3 创建一个service

# 最后边的--type=NodePort代表映射的外网(宿主机)端口随机,容器内部的端口是8080
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort

在这里插入图片描述

#查看service信息,port信息里冒号后面的端口号就是对集群外暴露的访问接口
kubectl get svc -o wide

在这里插入图片描述
上边结果里的32224就是对外暴露的端口,即容器内部的8080与宿主机的32224端口对应;

集群外部访问
使用集群worker节点的ip加上暴露的端口就可以访问
在这里插入图片描述
service服务有个特点,如果端口暴露类型为NodePort,那么可以通过集群内所有worker主机加暴露的端口进行访问

现在我们来删除刚刚添加的pod,看看会发生什么

#查看pod信息,-w意思是一直等待观察pod信息的变动
kubectl get pod -w

在这里插入图片描述
开另外一个命令窗口执行如下命令,同时观察之前命令窗口的变化情况

kubectl delete pod my-tomcat-685b8fd9c9-rw42d

在这里插入图片描述
pending:等待中;

我们可以看到之前那个tomcat的pod被销毁,但是又重新启动了一个新的tomcat pod,这是k8s的服务自愈功能,不需要运维人员干预

查看下deployment和service的状态
在这里插入图片描述
再一次访问service地址,依然可以访问成功
在这里插入图片描述
一个service端口对应多个tomcat,这个service会自动去做负载均衡;

4.4 对my-tomcat这个deployment进行扩缩容

# 扩容到5个pod
kubectl scale --replicas=5 deployment my-tomcat

查看pod信息,发现已经有5个tomcat的pod

kubectl get pod

在这里插入图片描述
缩容

# 扩容到3个pod
kubectl scale --replicas=3 deployment my-tomcat

4.5 滚动升级与回滚

对my-tomcat这个deployment进行滚动升级(一台一台升级)和回滚,将tomcat版本由tomcat:7.0.75-alpine升级到tomcat:8.0.41-jre8-alpine,再回滚到tomcat:7.0.75-alpine

滚动升级:

kubectl set image deployment my-tomcat tomcat=tomcat:8.0.41-jre8-alpine

可以执行 kubectl get pod -w 观察pod的变动情况,可以看到有的pod在销毁,有的pod在创建
在这里插入图片描述
查看pod信息

kubectl get pod

在这里插入图片描述
查看某个pod的详细信息,发现pod里的镜像版本已经升级了

kubectl describe pod my-tomcat-547db86547-4btmd

在这里插入图片描述
访问下tomcat,看到版本也已经升级
在这里插入图片描述
版本回滚:

查看历史版本

kubectl rollout history deploy my-tomcat

在这里插入图片描述
再次访问tomcat,发现版本已经回退
在这里插入图片描述

4.6 标签的使用

通过给资源添加Label,可以方便地管理资源(如Deployment、Pod、Service等)。

查看Deployment中所包含的Label

kubectl describe deployment my-tomcat

在这里插入图片描述
通过Label查询Pod

kubectl get pods -l app=my-tomcat

在这里插入图片描述
通过Label查询Service

kubectl get services -l app=my-tomcat

在这里插入图片描述
给Pod添加Label

kubectl label pod  version=v1

查看Pod的详细信息,可以查看Label信息:

kubectl describe pods my-tomcat-685b8fd9c9-lrwst

在这里插入图片描述
通过Label查询Pod

kubectl get pods -l version=v1

在这里插入图片描述
通过Label删除服务

kubectl delete service -l app=test-service

比如新启动了一些pod,想要与之前的pod是一批,那么就可以把这些pod的标签改为一样的就行;

小总结

kubectl create deployment       #创建一个deployment来管理创建的容器
kubectl get       #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose    #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
kubectl describe  #显示特定资源或资源组的详细信息
kubectl scale     #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set       #更改现有的应用程序资源
kubectl rollout   #资源回滚管理

以上就是kubectl命令行下一些简单的操作,主要是让我们对kubernetes有一个快速的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/554610.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode in Python 509. Fibonacci Number (斐波那契数)

斐波那契数实现方式有多种方法,最容易理解的为递归法,也可使用动态规划降低时间复杂度,本文给出递归法和动态规划两种方法的代码实现。 示例: 图1 斐波那契数输入输出示例 方法一:递归法 代码: class …

如何在本地创建一个贪吃蛇小游戏node.js服务并实现无公网IP远程游玩

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

CoFSM基于共现尺度空间的多模态遥感图像匹配方法--论文阅读记录

目录 论文 Multi-Modal Remote Sensing Image Matching Considering Co-Occurrence Filter 参考论文:SIFT系列论文, SIFT Distinctive Image Features from Scale-Invariant Keypoints,作者:David G. Lowe 快速样本共识算法…

Leetcode 53. 最大子数组和

心路历程: 子数组的和是可以通过前面的和加上当前值递推获得,所以可以用动态规划解决这道题 注意的点: 1、这道题再获取最大值时res不能用0而需要用负无穷初始化 解法:动态规划 class Solution:def maxSubArray(self, nums: …

(十三)C++自制植物大战僵尸游戏多用户存档实现(二)

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs UserData.h 在头文件中定义了枚举类型openUserDataReturnType,用于表示打开用户数据文件的返回状态。FileExistError表示文件存在但是打开错误,FileExistCorrect表示文件在且正确&#xff0…

Python | Leetcode Python题解之第29题两数相除

题目: 题解: class Solution:def divide(self, dividend: int, divisor: int) -> int:INT_MIN, INT_MAX -2**31, 2**31 - 1# 考虑被除数为最小值的情况if dividend INT_MIN:if divisor 1:return INT_MINif divisor -1:return INT_MAX# 考虑除数为…

Pandas数据分析学习笔记

前言 开刷Pandas数据分析,看起来很好理解,不过没做笔记没敲代码心里总是不安稳,所以复现下课程代码并演示其中遇到的问题,顺便水一水笔记好了 参考资料: 课程视频链接:Pandas数据分析从入门到实战 数据…

Halo自定义页面

在使用Halo后台维护项目,有的页面是固定的,但内容需要一些自定义样式,内容动态编辑生成,这个时候就需要自定义页面; Halo版本 版本:2.121.首先在theme.yaml中添加自定义页面并指定文件名 spec:customTemplates:page:…

面试题集中营—GC日志简析及频繁GC的调优

如何查看GC日志 有两种方式查看GC日志&#xff0c;一种是动态命令行查看 jstat -gc <pid> 300 5 第二种就是在JVM参数中增加打印的参数&#xff0c;如下&#xff1a; -XX:PrintGCDetails -XX:PrintGCTimeStamps 表示打印每次GC的日志以及GC发生的时间 -Xloggc:gc.log …

如何解决PPT中获取加载项是灰色的,无法链接到Power BI的问题?

问题描述&#xff1a; 最近有朋友留言询问:“在尝试之前我发布的如何在PPT中展示Power BI报告的操作步骤的时候&#xff0c;想要在PPT中展示Power BI报告&#xff1f;只需这样做&#xff01; (qq.com) 碰到在PowerPoint中【获取加载项选项】是灰色&#xff0c;无法链加载Powe…

WordPress网站上添加看板娘

续接上篇——基于LNMP部署wordpress-CSDN博客 目录 一.下载并解压 二.设置头文件 修改header.php 修改配置文件footer.php 三.将你设置的主题包上传到/usr/share/nginx/html/wp-content这个目录里 四.扩展——将看板娘修改到左侧 一.下载并解压 [rootaliyun ~]# wget htt…

技术分享 | app测试中常用的Android模拟器

Emulator Emualor 是 Android Studio 自带的模拟器&#xff0c;是官方提供的工具&#xff0c;Android 开发最常使用的就是这一款。 它功能非常齐全&#xff0c;电话本、通话等功能都可正常使用。用户可以使用键盘输入&#xff0c;鼠标点击模拟器按键输入&#xff0c;甚至还可…

安卓投屏延时数据如何测试,测试工具如何写?

背景&#xff1a; 投屏其实在android等使用场景非常非常多&#xff0c;比如现在火爆小米汽车的车机&#xff0c;上面涉及到手机和车机互联画面相关都是属于投屏范围。这种跨设备的投屏场景&#xff0c;流畅的体验是最重要的&#xff0c;这里就会要求投屏中最重要的一个性能指标…

Nerf技术原理

Neural Radiance Fields (NeRF) 是一种3D场景重建技术,用于从一组稀疏的2D图像创建高质量的3D模型。这一技术基于深度学习,通过训练一个神经网络来模拟场景的体积密度和颜色分布,实现在新的视角下渲染出高质量的3D图像。 NeRF的核心原理 NeRF的核心在于使用一个全连接的神经…

开源事件通知库libevent及网络连接管理模块bufferevent详解

目录 1、libevent介绍 1.1、什么是libevent&#xff1f; 1.2、libevent特点 1.3、网络连接管理模块bufferevent 2、bufferevent有什么用&#xff1f; 3、bufferevent的整体设计与实现细节 3.1、整体概况 3.2、evbuffer与bufferevent 3.3、defer callback 4、bufferev…

听说英伟达和诺和诺德要共建医药研发超算,超算安腾默默笑了

继黄仁勋公开发表“生命科学才是未来”的观点后&#xff0c;英伟达押注生物计算赛道又有新动作。日前&#xff0c;诺和诺德基金会宣布将出资和英伟达合作&#xff0c;在丹麦建造一台专注于生成式AI应用的超级计算机&#xff0c;以推动医疗保健、生命科学和绿色转型领域的研究与…

【JavaSE进阶】08-反射机制 09-注解

1 反射机制 a) 反射的基本概念 b) Java中的类反射 c) 安全性和反射 d) 反射的两个缺点 1.1 反射的基本概念 反射的概念是由 Smith 在 1982 年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状 态或行为的一种能力, 并能根据自身行为的状态和结果&#…

六、项目发布 -- 2. 数据库环境准备

之前我们是采用mock方式获取这些接口&#xff0c;也就是这些接口的数据其实是固定的&#xff0c;现在我们将从数据库中来获取这些数据并且在界面上进行展示。 1、数据库环境准备 到MYSQL官网上&#xff0c;主要下载服务端&#xff0c;社区版是免费的&#xff0c;安装好MYSQL …

结构体(C语言)

“点赞&#xff0c;留言&#xff0c;收藏&#xff0c;关注” 就是对阿林最大的支持 1.自定义类型 什么是自定义类型&#xff1f;C语言中有一些自带的数据类型&#xff0c;比如说char&#xff0c;int&#xff0c;float&#xff0c;double&#xff0c;long等数据类型就是C语言的…

目标检测——标注鱼类数据集

一、重要性及意义 鱼类的检测在多个领域都表现出其重要性和意义。以下是几个主要方面的阐述&#xff1a; 首先&#xff0c;从食品安全和营养价值的角度来看&#xff0c;鱼类作为人们日常生活中的重要蛋白质来源&#xff0c;其质量和安全性备受关注。鱼类营养成分检测能够评估…