Kubernetes (K8S) 3 小时快速上手 + 实践

news2025/2/23 4:14:59

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 ~]# 

image.png
解决:

[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

From:https://blog.csdn.net/qq_30019911/article/details/111415970

image.png

问题2:把工作节点加入集群(只在工作节点跑)

image.png

关闭 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

image.png
安装好kubectl后,可以正常访问minikube。
image.png

3. 部署应用到集群

3.1 部署应用 YAML 文件

3.1.1 直接命令运行创建pod

kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1

kubectl get pods

image.png

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

image.png

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-k8s
    spec:
      # 定义容器,可以多个
      containers:
      - name: test-k8s # 容器名字
        image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像

image.png
查看部署:

kubectl get deployment

image.png
查看节点详细信息:

kubectl get pod -o wide

image.png

Deployment 通过 label 关联起来 Pods,这些pod可以属于不同节点。
image.png

★3.2 常用命令

  • 查看pod状态、详细数据:
kubectl describe pod podname

image.png
Events(事件),这个比较重要,如图,创建pod,拉取镜像,创建镜像。
image.png

  • 查看pod运行日志:
kubectl logs podname
kubectl logs podname -f  //持续查看某个pod日志。

image.png

  • 进入pod容器交互式:
kubectl exec -it podname -- bash //进入Pod的第1 个容器
kubectl exec -it podname -c containername -- bash  //如果一个pod有多个容器,使用-c指定要进入的容器名。

image.png

  • 查看指定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

image.png

  • 增加副本pod数量:
方式一:
直接在yaml配置文件中修改replicas字段。
spec:
  replicas: 2
    
方式二(命令创建):
kubectl scale deployment test-k8s --replicas=5

注意:
如果之前有2个,修改为5个后,会新增3个pod,不是5个。

image.png

  • 减少副本pod数量:
kubectl scale deployment test-k8s --replicas=2

image.png

  • 把集群内端口映射到节点:
kubectl port-forward pod-name 8090:8080   //外部端口:内部端口

image.png
image.png
看运行日志(每访问一次web会产生一条日志):
image.png

  • 删除部署:
kubectl delete deployment test-k8s(部署名字)

image.png

  • 在同时创建多个副本的情况下,多个pod会随机跑到多个节点,master节点不跑pod。

image.png

  • 历史回退

更换错误镜像版本,重新部署镜像,会先创建新的镜像,再删除老镜像
image.png
重新部署。
image.png
查看历史。

kubectl rollout history deployment test-k8s

image.png
模拟场景这里新版本出错了,需要回退上一个版本。

kubectl rollout undo deployment test-k8s(部署名字)

image.png
回退到指定版本:
这里可以先查看有哪些版本[ kubectl rollout history deployment test-k8s ],再回退。

kubectl rollout undo deployment test-k8s --to-revision=2
  • 查看全部

列出所有信息。

kubectl get all

image.png

  • 重新部署

删掉老的,创建新的。

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)。

image.png

  • 删除全部pod、deployment。
kubectl delete all --all

image.png

  • 将pod指定到某个节点运行

将 Pod 指定到某个节点运行:nodeselector
限定 CPU、内存总量:文档

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    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
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问

image.png

4.2 创建Service(ClusterIP 集群内)

创建一个 Service,通过标签test-k8s跟对应的 Pod 关联上。
service.yaml
应用配置 kubectl apply -f service.yaml
查看服务 kubectl get svc
image.png

  • 默认ClusterIP 集群内(进入一个pod访问)可以访问:
apiVersion: v1
kind: Service
metadata:
  name: test-k8s  ## 服务名字!
spec:
  selector:
    app: test-k8s ## 标签关联pod
  # 默认ClusterIP 集群内可以访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
  type: ClusterIP
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口
      #nodePort: 31000  # 节点端口,范围固定 30000 ~ 32767 ,在集群内访问需要注释掉此条目。

服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:

kubectl exec -it pod-name -- bash
    
curl http://test-k8s:8080  //服务名称访问
curl http://10.109.106.61:8080  //服务IP访问

image.png
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):

kubectl port-forward service/test-k8s 8888:8080

image.png

4.3 对外暴露服务,NodePort 节点可访问

apiVersion: v1
kind: Service
metadata:
  name: test-k8s  ## 服务名字!
spec:
  selector:
    app: test-k8s ## 标签关联pod
  # 默认ClusterIP 集群内可以访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口
      nodePort: 31000  # 节点端口,范围固定 30000 ~ 32767 ,在集群内访问需要注释掉此条目。

对外暴露到端口31000。
image.png
这个对外暴露的端口是暴露在docker里,minikube所在的容器,还存在负载均衡转发。
image.png
其他:
Loadbalancer 也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding,这个很少用了,后面我们会讲更高端的 Ingress 来代替它。

4.4 多端口

多端口时必须配置 name, 文档。

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      name: test-k8s    # 必须配置
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 节点端口,范围固定 30000 ~ 32767
    - port: 8090
      name: test-other
      targetPort: 8090
      nodePort: 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: mongodb
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  selector:
    app: mongodb
  type: ClusterIP
  # HeadLess
  clusterIP: None ###不设置ip,仅通过服务名访问。
  ports:
    - port: 27017
      targetPort: 27017

image.png

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 -- bash

mongo --host mongodb-0.mongodb

image.png

6. 参考

视频地址:https://www.bilibili.com/video/BV1Tg411P7EB/
课件来源:https://k8s.easydoc.net

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

DQL:数据查询语言;用来对表内的数据进行查找。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。 1、基本查询 1.1、查询多个字段 SELECT 字段1,字段2,...FROM 表名; SELEC…

力扣hot100 杨辉三角 递归 DP

Problem: 118. 杨辉三角 文章目录 思路复杂度💖 DP💖 从下往上递归 思路 👨‍🏫 参考地址 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例: O ( n ) …

Flutter首页框架搭建

1.下载flutter 2. 安装android 3.配置环境变量 关于环境搭建部分,哪天写一下,日志杂乱无章。 打开android studio 新建项目,选择flutter 新建文件夹创建 navigator和pages 文件夹下分别创建文件,tab_navigator.dart&#xff…

GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总

文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎:从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…

Python密码本连接wifi

有时候我们会忘记自己的Wi-Fi密码,或者需要连接某个Wi-Fi网络以满足合法需求。本文将介绍如何使用Python编程语言编写一个简单的连接Wi-Fi的程序。 一、密码本准备 在进行wifi猜测时,其实就是列出各种可能的密码,用来尝试去访问目标wifi&…

8个Python必备的PyCharm插件

大家好,在PyCharm中浏览插件列表并尝试很多人推荐的插件后,总结了几个瑰宝插件,它们各自以独特的方式帮助开发者快速、简便、愉悦地开发,接下来将逐个介绍它们。 1. Key Promoter X 【下载链接】:https://plugins.je…

day2:TCP、UDP网络通信模型

思维导图 机械臂实现 #include <head.h> #define SER_POTR 8899 #define SER_IP "192.168.125.223" int main(int argc, const char *argv[]) {//创建套接字int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("");return -1;}//链接struct so…

jmeter--8.加密传输

目录 1. Base64加密 2. MD5加密 3. SHA加密&#xff08;sha1\sha\sha224\sha256\sha384\sha512&#xff09; 4. RSA加密-公钥加密&#xff0c;私钥解密 1. Base64加密 1.1 在需要加密传输的接口下新增BeanShell 预处理程序&#xff0c;${username}可替换成value值&#xff…

【Git】任何位置查看git日志

需求 现需要查看指定项目中的某个文件的 Git 日志。如有 项目代码 jflowable &#xff0c;需要查看其下文件 D:\z_workspace\jflowable\src\main\java\com\xzbd\jflowable\controller\TestController.java 的日志。 分析 一般的思路是&#xff0c;进入 jflowable 项目&#…

微软.NET、.NET Framework和.NET Core联系和区别

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;我小时候喜欢看小人书&#xff08;连环画&#xff09;&#xff0c;在那个没有电视、没有手机的年代&#xff0c;这是…

2024华数杯国际赛A题16页完整思路+五小问py代码数据集+后续高质量参考论文

这回带大家体验一下2024“华数杯”国际大学生数学建模竞赛呀&#xff01; 完整内容获取在文末 此题涉及到放射性废水从日本排放到海洋中的扩散问题&#xff0c;以及对环境和人类健康的潜在影响。 ## 问题重述 1. **预测污染范围和程度&#xff1a;** - 使用数学模型描述放射性…

maven导入无法拉取所需依赖

maven导入无法拉取所需依赖 1.原因2.解决搞定收工&#xff01; 1.原因 公司使用的是gradle&#xff0c;配置的私有云&#xff0c;maven里面配置私有云完全使用不了&#xff0c;无论配置国内还是国外的&#xff0c;导入的项目报错拉不到jar包。 <mirror><id>mirro…

晶振线路匹配需要进哪一些测试

晶振线路匹配的测试对于确保晶振性能的稳定性和可靠性至关重要&#xff0c;那么晶振线路匹配需要进哪一些测试呢? 晶振线路匹配测试是确保晶振性能稳定性和可靠性的关键环节。为了全面评估晶振的性能&#xff0c;需要进行一系列的测试&#xff0c;包括负载电容测试、驱动电平…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

Angular系列教程之观察者模式和RxJS

文章目录 引言RxJS简介RxJS中的设计模式观察者模式迭代器模式 示例代码RxJS 在 Angular 中的应用总结 引言 在Angular开发中&#xff0c;我们经常需要处理异步操作&#xff0c;例如从后端获取数据或与用户的交互。为了更好地管理这些异步操作&#xff0c;Angular中引入了RxJS&…

聊聊算法改进的事情

聊聊最近算法改进的事情&#xff0c;我最近在改进一些算法&#xff0c;当然不是无意义的去改进&#xff0c;不是去砸场子。 我觉得我自己改进原创算法&#xff0c;拿出来出售&#xff0c;我也不可能靠着情怀去支持科研。 我就是这样的人&#xff0c;靠自己的技术&#xff0c;…

transbigdata 笔记: 轨迹密集化/稀疏化 轨迹平滑

1 密集化 transbigdata.traj_densify(data, col[Vehicleid, Time, Lng, Lat], timegap15) 轨迹致密化&#xff0c;保证至多每隔timegap秒都有一个轨迹点 这边插补使用的是pandas的interpolate&#xff0c;method设置的是index 1.1 举例 transbigdata 笔记&#xff1a; 官方…

【软件测试】学习笔记-统一测试数据平台

这篇文章主要探讨全球大型电商企业中关于准备测试数据的最佳实践&#xff0c;从全球大型电商企业早期的测试数据准备实践谈起&#xff0c;分析这些测试数据准备方法在落地时遇到的问题&#xff0c;以及如何在实践中解决这些问题。其实&#xff0c;这种分析问题、解决问题的思路…

单片机常用的电子元器件基础

参考自B站该视频 1&#xff1a;电阻 贴片电阻的读取方式 四环电阻 2&#xff1a;电容 其他的电子元器件

106、Text-Image Conditioned Diffusion for Consistent Text-to-3D Generation

简介 很多工作在扩散先验中注入跨视图一致性&#xff0c;但仍然缺乏细粒度的视图一致性。论文提出的文本到3d的方法有效地减轻了漂浮物(由于密度过大)和完全空白空间(由于密度不足)的产生。 实现过程 简单而言&#xff0c;论文工作是 DreamfusionZero123。 使用两种不同的分数…