Kubernetes (K8S) 3 小时快速上手 + 实践
1. Kubernetes 简介
k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通过k8s来简化我们的管理"
2. 安装 Kubernetes 集群
2.1 裸机搭建
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY#nav_3
2.1.1 凭证问题
用 kubeadm 初始化集群(仅在主节点跑),# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers# 记得把 kubeadm join xxx 保存起来
# 忘记了重新获取:kubeadm token create --print-join-command# 复制授权文件,以便 kubectl 可以有权限访问集群
# 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config# 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群
2.1.2 踩坑
问题1:初始化集群控制台 Control plane
[root@master ~]# kubeadm init --image-repository=registry.aliyuncs.com/google_containers
I1102 21:38:18.266955 2675 version.go:255] remote version is much newer: v1.25.3; falling back to: stable-1.22
[init] Using Kubernetes version: v1.22.15
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1[ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
[root@master ~]#
解决:
[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptablesFrom:https://blog.csdn.net/qq_30019911/article/details/111415970
问题2:把工作节点加入集群(只在工作节点跑)
关闭 swap#临时关闭
swapoff -a
# 永久关闭
vi /etc/fstab
注释以下代码/dev/mapper/centos-swap swap ...
2.2 把工作节点接入集群命令
kubeadm join 192.168.3.128:6443 --token i3k3bg.7zveiqaweidk9ene \--discovery-token-ca-cert-hash sha256:e7f23aa05741073a57e4bcd2e0a43d717fc3d25778348b930c786f67c66de4eb
2.3 minikube 模拟环境搭建
只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。
2.3.1 安装(在hk vps安装成功)
下载地址:https://minikube.sigs.k8s.io/docs/start/
Linux安装kubernetes(minikube):https://blog.csdn.net/weixin_44379605/article/details/123240857
minikube和kubectl安装:https://blog.csdn.net/weixin_44379605/article/details/123124172?spm=1001.2014.3001.5502
启动minikube。
minikube start --force
安装好kubectl后,可以正常访问minikube。
3. 部署应用到集群
3.1 部署应用 YAML 文件
3.1.1 直接命令运行创建pod
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1kubectl get pods
3.1.2 yaml创建pod
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:# 定义容器,可以多个containers:- name: test-k8s # 容器名字image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像---
kubectl apply -f podcreate.yaml
kubectl get pod
3.1.3 Deployment(批量创建pod)
批量创建2个pod。
apiVersion: apps/v1
kind: Deployment
metadata:# 部署名字name: test-k8s
spec:replicas: 2# 用来查找关联的 Pod,所有标签都匹配才行selector:matchLabels:app: test-k8s ### 标签# 定义 Pod 相关数据template:metadata:labels:app: test-k8sspec:# 定义容器,可以多个containers:- name: test-k8s # 容器名字image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像
查看部署:
kubectl get deployment
查看节点详细信息:
kubectl get pod -o wide
Deployment 通过 label 关联起来 Pods,这些pod可以属于不同节点。
★3.2 常用命令
- 查看pod状态、详细数据:
kubectl describe pod podname
Events(事件),这个比较重要,如图,创建pod,拉取镜像,创建镜像。
- 查看pod运行日志:
kubectl logs podname
kubectl logs podname -f //持续查看某个pod日志。
- 进入pod容器交互式:
kubectl exec -it podname -- bash //进入Pod的第1 个容器
kubectl exec -it podname -c containername -- bash //如果一个pod有多个容器,使用-c指定要进入的容器名。
- 查看指定pod中有哪些容器:
kubectl get pods podname -o jsonpath={.spec.containers[*].name} -n namespace
kubectl get pods kube-scheduler-superboy-virtual-machine -o jsonpath={.spec.containers[*].name} -n kube-system
- 增加副本pod数量:
方式一:
直接在yaml配置文件中修改replicas字段。
spec:replicas: 2方式二(命令创建):
kubectl scale deployment test-k8s --replicas=5注意:
如果之前有2个,修改为5个后,会新增3个pod,不是5个。
- 减少副本pod数量:
kubectl scale deployment test-k8s --replicas=2
- 把集群内端口映射到节点:
kubectl port-forward pod-name 8090:8080 //外部端口:内部端口
看运行日志(每访问一次web会产生一条日志):
- 删除部署:
kubectl delete deployment test-k8s(部署名字)
- 在同时创建多个副本的情况下,多个pod会随机跑到多个节点,master节点不跑pod。
- 历史回退
更换错误镜像版本,重新部署镜像,会先创建新的镜像,再删除老镜像
重新部署。
查看历史。
kubectl rollout history deployment test-k8s
模拟场景这里新版本出错了,需要回退上一个版本。
kubectl rollout undo deployment test-k8s(部署名字)
回退到指定版本:
这里可以先查看有哪些版本[ kubectl rollout history deployment test-k8s ],再回退。
kubectl rollout undo deployment test-k8s --to-revision=2
- 查看全部
列出所有信息。
kubectl get all
- 重新部署
删掉老的,创建新的。
kubectl rollout restart deployment test-k8s
- 命令修改镜像,–record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
- 把deployment输出到一个文件信息
kubectl get deployment test-k8s -o yaml >> app2.yaml
也可以用json格式显示(-o json)。
- 删除全部pod、deployment。
kubectl delete all --all
- 将pod指定到某个节点运行
将 Pod 指定到某个节点运行:nodeselector
限定 CPU、内存总量:文档
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector:disktype: ssd ###这里指定节点名字。
- 其他命令
# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
kubectl rollout pause deployment test-k8s
# 恢复
kubectl rollout resume deployment test-k8s
3.3 工作负载分类
- Deployment
适合无状态应用,所有pod等价,可替代。 - StatefulSet
有状态的应用,适合数据库这种类型。 - DaemonSet
在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等。 - Job & CronJob
Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。
3.4 现存问题
- 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod
- 访问还需要端口转发
- Pod 重创后 IP 变了,名字也变了
4. Service
4.1 特性
- Service 通过 label 关联对应的 Pod
- Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
- 提供了负载均衡功能,自动转发流量到不同 Pod
- 可对集群外部提供访问端口
- 集群内部可通过服务名字访问
4.2 创建Service(ClusterIP 集群内)
创建一个 Service,通过标签test-k8s跟对应的 Pod 关联上。
service.yaml
应用配置 kubectl apply -f service.yaml
查看服务 kubectl get svc
- 默认ClusterIP 集群内(进入一个pod访问)可以访问:
apiVersion: v1
kind: Service
metadata:name: test-k8s ## 服务名字!
spec:selector:app: test-k8s ## 标签关联pod# 默认ClusterIP 集群内可以访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)type: ClusterIPports:- port: 8080 # 本 Service 的端口targetPort: 8080 # 容器端口#nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767 ,在集群内访问需要注释掉此条目。
服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:
kubectl exec -it pod-name -- bashcurl http://test-k8s:8080 //服务名称访问
curl http://10.109.106.61:8080 //服务IP访问
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080
4.3 对外暴露服务,NodePort 节点可访问
apiVersion: v1
kind: Service
metadata:name: test-k8s ## 服务名字!
spec:selector:app: test-k8s ## 标签关联pod# 默认ClusterIP 集群内可以访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)type: NodePortports:- port: 8080 # 本 Service 的端口targetPort: 8080 # 容器端口nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767 ,在集群内访问需要注释掉此条目。
对外暴露到端口31000。
这个对外暴露的端口是暴露在docker里,minikube所在的容器,还存在负载均衡转发。
其他:
Loadbalancer 也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding,这个很少用了,后面我们会讲更高端的 Ingress 来代替它。
4.4 多端口
多端口时必须配置 name, 文档。
apiVersion: v1
kind: Service
metadata:name: test-k8s
spec:selector:app: test-k8stype: NodePortports:- port: 8080 # 本 Service 的端口name: test-k8s # 必须配置targetPort: 8080 # 容器端口nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767- port: 8090name: test-othertargetPort: 8090nodePort: 32000
4.5 总结
ClusterIP
默认的,仅在集群内可用
NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767
LoadBalancer
需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)
会额外生成一个 IP 对外服务
K8S 支持的负载均衡器:负载均衡器。
Headless
适合数据库
clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP,后面会再讲到具体用法:官网文档。
5. Statefulset
5.1 什么是Statefulset
StatefulSet 是用来管理有状态的应用,例如数据库。前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。而像数据库、Redis 这类有状态的,则不能随意扩充副本。StatefulSet 会固定每个 Pod 的名字
5.2 部署Statefulset类型的Mongodb
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mongodb
spec:serviceName: mongodbreplicas: 3selector:matchLabels:app: mongodbtemplate:metadata:labels:app: mongodbspec:containers:- name: mongoimage: mongo:4.4# IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:name: mongodb
spec:selector:app: mongodbtype: ClusterIP# HeadLessclusterIP: None ###不设置ip,仅通过服务名访问。ports:- port: 27017targetPort: 27017
5.3 StatefulSet 特性
- Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。
- Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
- Pod 重建不会改变名字,IP会改变,所以不要用IP直连。
访问时,如果直接使用 Service 名字连接,会随机转发请求
要连接指定 Pod,可以这样pod-name.service-name
运行一个临时 Pod 连接数据测试下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bashmongo --host mongodb-0.mongodb
6. 参考
视频地址:https://www.bilibili.com/video/BV1Tg411P7EB/
课件来源:https://k8s.easydoc.net
相关文章:

Kubernetes (K8S) 3 小时快速上手 + 实践
1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通…...

如何画出优秀的系统架构图-架构师系列-学习总结
--- 后之视今,亦犹今之视昔! 目录 早期系统架构图 早期系统架构视图 41视图解读 41架构视图缺点 现代系统架构图的指导实践 业务架构 例子 使用场景 画图技巧 客户端架构、前端架构 例子 使用场景 画图技巧 系统架构 例子 定义 使用场…...
VR转接器:打破界限,畅享虚拟现实
你是否曾梦想过踏入另一个世界,体验那种仿佛置身其中的感觉?随着科技的飞速发展,虚拟现实(VR)已经成为了现实。而VR转接器,正是让你畅享虚拟现实的关键所在。 添加图片注释,不超过 140 字&…...

C++学习笔记——用C++实现树(区别于C)
树是一种非常重要的数据结构,它在计算机科学中的应用非常广泛。在本篇博客中,我们将介绍树的基本概念和C中如何实现树。 目录 一、树的基本概念 2.C中实现树 2.1创建一个树的实例,并向其添加节点 2.2三种遍历方式的实现代码 3.与C语言相…...

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案
工业平板主板采用联发科MT6762平台方案,搭载Android 11.0操作系统, 主频最高2.0GHz,效能有大幅提升;采用12nm先进工艺,具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器,最高主频为680MHz, 支持108…...
JPA查询PostgreSQL行排序问题
文章目录 问题处理PostgreSQL排序相关JPA相关介绍 问题 我们项目使用Spring Boot构建,使用JHipster生成业务代码,包含基础的增删改查代码使用PostgreSQL作为业务数据库,使用自动生成的JPA构建数据更新语查询在查询某个实体类的列表时&#x…...

【css】渐变效果
css渐变效果 使用 CSS 渐变可以在两种颜色间制造出平滑的渐变效果。 用它代替图片,可以加快页面的载入时间、减小带宽占用。同时,因为渐变是由浏览器直接生成的,它在页面缩放时的效果比图片更好,因此你可以更加灵活、便捷的调整页…...

Maven 依赖传递和冲突、继承和聚合
一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C,其中项目 A 依赖 B,项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说,依赖的关系为:A—>B—>C, 那么我们执行项目 …...

Linux Centos7静默安装(非图形安装)Oracle RAC 11gR2(Oracle RAC 11.2.0.4)
Oracle RAC (全称Oracle Real Application Clusters )静默安装(非图形安装)教程。 由于这篇文章花费了我太多时间,设置了仅粉丝可见,见谅。 环境说明: 虚拟机软件:VMware Workstation 16 Pro…...
集成开发环境(IDE)介绍
集成开发环境(IDE)介绍 集成开发环境(Integrated Development Environment,IDE)是一种软件应用程序,用于开发和编写软件。常见的IDE包括Eclipse、Visual Studio、IntelliJ IDEA、Qt Creator等。 集成开发环…...

基于物联网设计的智能储物柜(4G+华为云IOT+微信小程序)
一、项目介绍 在游乐场、商场、景区等人流量较大的地方,往往存在用户需要临时存放物品的情况,例如行李箱、外套、购物袋等。为了满足用户的储物需求,并提供更加便捷的服务体验,当前设计了一款物联网智能储物柜。 该智能储物柜通…...
12种常见的网络钓鱼
网络钓鱼是一种网络攻击,是指具有恶意动机的攻击者伪装欺骗人们并收集用户名或密码等敏感信息的一系列行为。由于网络钓鱼涉及心理操纵并依赖于人为失误(而不是硬件或软件漏洞),因此被认定为是一种社会工程攻击。 1. 普通网络钓鱼(群攻&…...

电商物流查询:未来的发展方向
在电商日益繁荣的时代,物流信息查询不仅关乎消费者体验,更影响着电商运营的效率。快速、准确地追踪物流信息至关重要。本文将简述物流信息快速追踪的价值,并重点介绍固乔快递查询助手这一高效查询工具及其批量查询功能。 一、物流信息快速追踪…...
【数据库原理】(25)数据完整性
一.完整性概述 数据库的完整性是保证数据正确性和一致性的关键。它防止数据库中存在不符合业务逻辑或语义规则的数据,避免错误信息的输入和输出。数据库的完整性和安全性不同,安全性关注的是防止非法用户的访问和恶意操作,而完整性则关注数据…...

逻辑运算符
逻辑运算符 什么是逻辑运算符? 在数学中,一个数据x大于5,小于15,我们可以这样来进行表示:5<x<15.在Java中,需要把上面的式子先进行拆解,再进行合并表达。 拆解为:x>5和 x…...
SpringBoot @RequestBody和@ResponseBody注解
1. RequestBody注解 用于将HTTP请求体的内容绑定到方法的参数上。通常情况下,我们使用这个注解来处理POST请求,特别是传递JSON格式的数据。 例: PostMapping("/user") public ResponseEntity<String> createUser(RequestB…...
实验四:静态路由配置
实验四:静态路由配置 1. 静态路由 ( 一般配置 ) 【实验名称】静态路由配置 【实验目的】掌握静态路由的配置方法,理解路由表的作用和原理 【实验设备】路由器( 2 台)、计算机( 2 台)、交叉线…...

UML-类图和类图转化为代码
提示:文章详细的讲解了类图的四种关系,以及每种关系如何转化为对应的代码。 UML-类图和类图转化为代码 一、类于类之间的关系1.依赖关系2.关联关系(1) 单向关联(2) 双向关联(3) 自关联(4) 聚合关联(has-a)(5) 组合关联(contains-a)…...

数据科学与大数据导论期末复习笔记(大数据)
来自于深圳技术大学,此笔记涵盖了期末老师画的重点知识,分享给大家。 等深分箱和等宽分箱的区别:等宽分箱基于数据的范围来划分箱子,每个箱子的宽度相等。等深分箱基于数据的观测值数量来划分箱子,每个箱子包含相同数量…...

【保姆级教程|YOLOv8添加注意力机制】【2】在C2f结构中添加ShuffleAttention注意力机制并训练
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...