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

image.png
解决:

[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptablesFrom: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:v1kubectl 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-k8sspec:# 定义容器,可以多个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: 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
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问

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: 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访问

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: NodePortports:- 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-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

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 -- bashmongo --host mongodb-0.mongodb

image.png

6. 参考

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

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

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

相关文章

二叉树:从基础结构到高级遍历技术

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言结构定义接口需求构建二叉树销毁二叉树计算节点和叶子的数量二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数 二叉树查找值为x的节点二叉树的…

立白科技集团:研发安全推动数字化蜕变,日化业务再上新高度

立白科技集团成立于1994年,是我国日化行业的领军企业,致力于成为一家“品牌引领、数字经营、富有创新、富有活力”的智慧服务型企业。从2018年开始,立白科技集团加速数字化转型,打造数据和业务中台,并建立toB和toC平台…

修改和调试 onnx 模型

1. onnx 底层实现原理 1.1 onnx 的存储格式 ONNX 在底层是用 Protobuf 定义的。Protobuf,全称 Protocol Buffer,是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时,用户需要先写一份数据定义文件,再根据这份定义文…

【Android Studio】使用简单的adb命令远程连接设备进行调试以及文件推送

在使用Android Studio开发时候遇到设调试的时候,由于需要调试的设备不是这种移动设备,需要连接线路到电脑上很不方便操作,后面发现可以通过远程连接的方式,减少不必要的操作复杂度。 一、找到项目中adb配置的工具位置 一般情况下…

使用 rinetd 搭建简单端口重定向服务

rinetd是什么 rinetd(Redirector for TCP connections)是一个用于重定向TCP连接的工具。它允许你将传入的TCP连接从一个指定的IP地址和端口号重定向到另一个地址和端口号。rinetd通常用于端口重定向,使得可以将流量从一个端口转发到另一个端…

【C语言】指针知识点笔记(2)

目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

Vue响应式系统(二)

Vue响应式系统(一) 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢?听我娓娓道来。 就用Vue.js来说吧,Vue.js的渲染函数就是在effect中执行的: /*Foo组件*/ const Foo {render() {return /*.....*/} }// effect中执行Foo组件中…

kubectl与 jq的另外一些用法

背景: 在日常运维工作中,我们需要管理和操作大量的配置文件,这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象,它用于存储应用的配置信息。有时,我们需要查找哪些 Confi…

2、python函数和获取帮助

调用函数、定义自己的函数以及使用Python的内置文档 你已经见过并使用了print和abs等函数。但是Python还有许多其他函数,而定义自己的函数是Python编程的一个重要部分。 在这个课程中,你将学习更多关于使用和定义函数的知识。 文章目录 1.获取帮助1.1定义函数1.1.1注释1.2无…

基于SSM的驾校信息管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue、HTML 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中,人和机器之间的时间和空间的交织和共同作用。 在时间维度上,人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

机器人制作开源方案 | 智能循迹避障小车

作者:刘元青、邹海峰、付志伟、秦怀远、牛文进 单位:哈尔滨信息工程学院 指导老师:姚清元 智能小车是移动式机器人的重要组成部分,而移动机器人不仅能够在经济、国防、教育、文化和生活中起到越来越大的作用,也是研究…

【Redis】windows上安装的Redis,并在springboot中配置并且连接详细(排坑)

比如在开发测试阶段,为了方便就直接使用自己windows装好redis进行简单测试了,在项目中不去单独配置yam的redis属性可以正常操作,但是在springboot的yam中配置redis连接属性时候却连不上,特意记录一下方便后续再遇到能快速解决 一、Redis配置文件位置(windows) 一般情况下…

Codeforces Round 114 (Div. 1) C. Wizards and Numbers(思维题 辗转相除+博弈 巴什博弈)

题目 t(t<1e4)组询问&#xff0c;每次询问(a,b)&#xff08;0<a,b<1e18&#xff09;&#xff0c; 不妨a<b&#xff08;a>b时需要交换两个数考虑&#xff09; ①令b减去a的k次方&#xff08;k>1&#xff09;&#xff0c;要求减完之后b非负 ②令bb%a 当a和…

java处理16进制字符串的一些方法和基础知识

前言&#xff1a;本篇文章是对于基础数据的处理的一些简单经验总结里边包含了一些基础的数据储存和数据转化的一些知识&#xff0c;同样也包含有部分快捷的数据处理方法。主要用于个人知识的一个记录和方便进行对应的数据转换和处理。 1、bit,字节和字的关系 1.1 bit和字节的…

2024全新开发API接口调用管理系统网站源码 附教程

2024全新开发API接口调用管理系统网站源码 附教程 用layui框架写的 个人感觉很简洁 方便使用和二次开发

腾讯云MPS为出海媒体企业助力

在如今互联网发达的时代&#xff0c;一个视频通过网络发布即可供给全球用户进行观看。其中视频媒体企业便其中的领头先锋&#xff0c;为了让创作者们以及全球各大用户的视频进行快速推广&#xff0c;出海则是不二之选。但是因为各地区域的不同&#xff0c;带宽的不同与网络的限…

深信服技术认证“SCSA-S”划重点:逻辑漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

桌面显示器type-c接口方案

在当今时代&#xff0c;TYPE-C接口桌面显示器已经成为了我们生活和工作中不可或缺的重要设备之一。与传统显示器相比&#xff0c;新型的TYPE-C接口桌面显示器具有更多的功能和优势&#xff0c;其中最显著的特点就是支持视频传输和充电功能。 首先&#xff0c;TYPE-C接口桌面显示…

Python Socketio 介绍

socketio是一个Python库&#xff0c;用于处理实时网络通信&#xff0c;它实现了Socket.IO协议。Socket.IO是一个JavaScript库&#xff0c;用于实时、双向和基于事件的通信。它在浏览器和服务器之间建立一个持久的连接&#xff0c;允许它们进行实时通信。 socketio.Client()是so…