ToB企服应用市场:ToB评测及商务社交产业平台

标题: kubernetes快速入门之K3S [打印本页]

作者: 乌市泽哥    时间: 2024-5-13 16:15
标题: kubernetes快速入门之K3S
kubernetes简介

Kubernetes 是一个开源的容器编排引擎和容器集群管理工具,用来对容器化应用进行主动化摆设、 扩缩和管理。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有8个字符。 Google 在 2014 年开源了 Kubernetes 项目。
上风

Kubernetes 创建在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。它之所以能够迅速流行起来,是因为它的许多功能高度契合互联网大厂的摆设和运维需求。
Kubernetes 可以提供:
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来曝露容器。 如果进入容器的流量很大Kubernetes 可以负载均衡并分配网络流量,从而使摆设稳定。
你可以使用 Kubernetes 描述已摆设容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以主动化 Kubernetes 来为你的摆设创建新容器, 删除现有容器并将它们的所有资源用于新容器。也可以是方便的实现金丝雀摆设(canary deployment )。
你为 Kubernetes 提供许多节点构成的集群,在这个集群上运行容器化的使命。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际环境调度到你的节点上,以最佳方式利用你的资源。
Kubernetes 将重新启动失败的容器、更换容器、杀死不相应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
Kubernetes 答应你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重修容器镜像的环境下摆设和更新密钥和应用程序设置,也无需在堆栈设置中暴露密钥。
云原生

2015 年由 Google、Redhat 等大型云计算厂商以及一些开源公司共同牵头成立了Cloud Native Computing Foundation(云原生计算基金会)。
云原生计算基金会(CNCF)致力于培养和维护一个厂商中立的开源生态体系,来推广云原生技术。
云原生的概念从此广泛传播。
云原生定义

Kubernetes 是 CNCF 托管的第一个开源项目。因此现在提到云原生,往往我们都把它与kubernetes接洽起来。


在Kubernetes之前,Pivotal(开源 Java 开发框架Spring的母公司,后被 VMware 收购)是云原生应用的提出者,并推出了Pivotal Cloud Foundry 云原生应用平台和Spring Cloud开发框架,成为云原生应用架构中先驱者和探路者。Spring Cloud通过微服务架构,使程序具备可拓展性和在分布式环境运行的本领。Spring Cloud和Kubernetes有许多功能是重合的,例如:
但是Spring Cloud只能用于Java应用开发,而kubernetes是语言无关的,可以用于各种语言开发的应用。
kubernetes架构

kubernetes架构

一个Kubernetes集群至少包含一个控制平面(control plane),以及一个或多个工作节点(worker node)。
**控制平面(Control Plane) : **控制平面负责管理工作节点和维护集群状态。所有使命分配都来自于控制平面。
**工作节点(Worker Node) : **工作节点负责执行由控制平面分配的请求使命,运行实际的应用和工作负载。
控制平面

控制平面组件会为集群做出全局决策,比如资源的调度、检测和相应集群变乱。

kube-apiserver

如果需要与Kubernetes 集群进行交互,就要通过 API。
apiserver是 Kubernetes 控制平面的前端,用于处理内部和外部请求。
kube-scheduler

集群状况是否良好?如果需要创建新的容器,要将它们放在哪里?这些是调度程序需要关注的问题。
scheduler调度程序会考虑容器集的资源需求(例如 CPU 或内存)以及集群的运行状况。随后,它会将容器集安排到适当的计算节点。
etcd

etcd是一个键值对数据库,用于存储设置数据和集群状态信息。
kube-controller-manager

控制器负责实际运行集群,controller-manager控制器管理器则是将多个控制器功能合而为一,降低了程序的复杂性。
controller-manager包含了这些控制器:
Node 组件

节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。

kubelet

kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。
当控制平面需要在节点中执行某个操作时,kubelet 就会执行该操作。
kube-proxy

kube-proxy 是集群中每个节点(node)上运行的网络代理,是实现 Kubernetes 服务(Service) 概念的一部门。
kube-proxy 维护节点网络规则和转发流量,实现从集群内部或外部的网络与 Pod 进行网络通信。
容器运行时(Container Runtime)

容器运行环境是负责运行容器的软件。
Kubernetes 支持许多容器运行环境,例如 containerd、docker大概其他实现了 Kubernetes CRI (容器运行环境接口)的容器。
组件关系


cloud-controller-manager

控制平面还包含一个可选组件cloud-controller-manager。
云控制器管理器(Cloud Controller Manager)答应你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分脱离来。
如果在自己的环境中运行 Kubernetes,大概在当地计算机中运行学习环境, 所摆设的集群不需要有云控制器管理器。
使用K3s快速搭建集群

提示:
1.基于kubernetes V1.25版本。
2.从V1.24开始,kubernetes默认容器运行时使用containerd,不再使用docker。
为什么使用K3s


K3s 是一个轻量级的、完全兼容的 Kubernetes 发行版本。非常适合初学者。
K3s将所有 Kubernetes 控制平面组件都封装在单个二进制文件和进程中,文件大小 alpine.tar#kubernetes使用的镜像都在k8s.io定名空间中ctr -n k8s.io images import alpine.tar[/code]
  1. systemctl disable firewalld --now
复制代码
Deployment(摆设)与ReplicaSet(副本集)

Deployment是对ReplicaSet和Pod更高级的抽象。
它使Pod拥有多副本,自愈,扩缩容、滚动升级等本领。
ReplicaSet(副本集)是一个Pod的集合。
它可以设置运行Pod的数量,确保任何时间都有指定数量的 Pod 副本在运行。
通常我们不直接使用ReplicaSet,而是在Deployment中声明。
  1. yum install -y container-selinux selinux-policy-base
  2. yum install -y https://rpm.rancher.io/k3s/latest/common/centos/7/noarch/k3s-selinux-0.2-1.el7_8.noarch.rpm
复制代码
缩放

  1. mv k3s /usr/local/bin
  2. chmod +x /usr/local/bin/k3s
复制代码
主动缩放通过增加和淘汰副本的数量,以保持所有 Pod 的匀称 CPU 利用率不超过 75%。
主动伸缩需要声明Pod的资源限制,同时使用 Metrics Server 服务(K3s默认已安装)。
本例仅用来说明kubectl autoscale下令的使用,完整示例参考:HPA演示
  1. mkdir -p /var/lib/rancher/k3s/agent/images/
  2. cp ./k3s-airgap-images-amd64.tar.gz /var/lib/rancher/k3s/agent/images/
复制代码
滚动更新
  1. #修改权限
  2. chmod +x install.sh
  3. #离线安装
  4. INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
  5. #安装完成后,查看节点状态
  6. kubectl get node
  7. #查看token
  8. cat /var/lib/rancher/k3s/server/node-token
  9. #K10c4b79481685b50e4bca2513078f4e83b62d1d0b5f133a8a668b65c8f9249c53e::server:bf7b63be7f3471838cbafa12c1a1964d
复制代码
版本回滚
  1. INSTALL_K3S_SKIP_DOWNLOAD=true \
  2. K3S_URL=https://192.168.56.109:6443 \
  3. K3S_TOKEN=K1012bdc3ffe7a5d89ecb125e56c38f9fe84a9f9aed6db605f7698fa744f2f2f12f::server:fdf33f4921dd607cadf2ae3c8eaf6ad9 \
  4. ./install.sh
复制代码
Service(服务)

Service将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
Service为一组 Pod 提供相同的 DNS 名,并且在它们之间进行负载均衡。
Kubernetes 为 Pod 提供分配了IP 地址,但IP地址可能会发生变化。
集群内的容器可以通过service名称访问服务,而不需要担心Pod的IP发生变化。
Kubernetes Service 定义了这样一种抽象:
逻辑上的一组可以互相更换的 Pod,通常称为微服务。
Service 对应的 Pod 集合通常是通过选择算符来确定的。
举个例子,在一个Service中运行了3个nginx的副本。这些副本是可互换的,我们不需要关心它们调用了哪个nginx,也不需要关注 Pod的运行状态,只需要调用这个服务就可以了。
创建Service对象

ServiceType 取值

  1. kubectl run mynginx --image=nginx
  2. # 查看Pod
  3. kubectl get pod
  4. # 描述
  5. kubectl describe pod mynginx
  6. # 查看Pod的运行日志
  7. kubectl logs mynginx
  8. # 显示pod的IP和运行节点信息
  9. kubectl get pod -owide
  10. # 使用Pod的ip+pod里面运行容器的端口
  11. curl 10.42.1.3
  12. #在容器中执行
  13. kubectl exec mynginx -it -- /bin/bash
  14. kubectl get po --watch
  15. # -it 交互模式
  16. # --rm 退出后删除容器,多用于执行一次性任务或使用客户端
  17. kubectl run mynginx --image=nginx -it --rm -- /bin/bash
  18. # 删除
  19. kubectl delete pod mynginx
  20. # 强制删除
  21. kubectl delete pod mynginx --force
复制代码
  1. mirrors:
  2.   docker.io:
  3.     endpoint:
  4.       - "https://fsp2sfpr.mirror.aliyuncs.com/"
复制代码

访问Service

外部主机访问:192.168.56.109:32296。
1.NodePort端口是随机的,范围为:30000-32767。
2.集群中每一个主机节点的NodePort端口都可以访问。
3.如果需要指定端口,不想随机产生,需要使用设置文件来声明。
  1. # master节点执行
  2. systemctl restart k3s
  3. # node节点执行
  4. systemctl restart k3s-agent
复制代码
Namespace(定名空间)

定名空间(Namespace)是一种资源隔离机制,将同一集群中的资源分别为相互隔离的组。
定名空间可以在多个用户之间分别集群资源(通过资源配额)。
同一定名空间内的资源名称要唯一,但跨定名空间时没有这个要求。
定名空间作用域仅针对带有名字空间的对象,例如 Deployment、Service 等。
这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等。
Kubernetes 会创建四个初始定名空间:
使用kubectl get lease -A查看lease对象
使用多个定名空间

管理定名空间
  1. cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
复制代码
切换当前定名空间
  1. crictl pull mysql:5.7-debian
  2. crictl images
复制代码
声明式对象设置

管理对象

例如,使用kubectl下令来创建和管理 Kubernetes 对象。
下令行就好比口头转达,简单、快速、高效。
但它功能有限,不适合复杂场景,操作不容易追溯,多用于开发和调试。
kubernetes使用yaml文件来描述 Kubernetes 对象。
声明式设置就好比申请表,学习难度大且设置麻烦。
利益是操作留痕,适合操作复杂的对象,多用于生产。
常用下令缩写

名称缩写KindnamespacesnsNamespacenodesnoNodepodspoPodservicessvcServicedeploymentsdeployDeploymentreplicasetsrsReplicaSetstatefulsetsstsStatefulSet
  1. docker pull alpine:3.16
  2. docker save alpine:3.16 > alpine.tar
  3. #kubernetes使用的镜像都在k8s.io命名空间中
  4. ctr -n k8s.io images import alpine.tar
复制代码
YAML规范

  1. #导出镜像
  2. ctr -n k8s.io images export mysql.tar docker.io/library/mysql:5.7-debian --platform linux/amd64
  3. #导入镜像
  4. ctr -n k8s.io images import mysql.tar
复制代码
设置对象

在创建的 Kubernetes 对象所对应的 yaml文件中,需要设置的字段如下:
使用yaml定义一个Pod
Pod设置模版
  1. #创建deployment,部署3个运行nginx的Pod
  2. kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3
  3. #查看deployment
  4. kubectl get deploy
  5. #查看replicaSet
  6. kubectl get rs
  7. #删除deployment
  8. kubectl delete deploy nginx-deployment
复制代码
使用yaml文件管理对象
  1. #将副本数量调整为5
  2. kubectl scale deployment/nginx-deployment --replicas=5
  3. kubectl get deploy
复制代码
标签

标签(Labels) 是附加到对象(比如 Pod)上的键值对,用于补充对象的描述信息。
标签使用户能够以松散的方式管理对象映射,而无需客户端存储这些映射。
由于一个集群中可能管理成千上万个容器,我们可以使用标签高效的进行选择和操作容器集合。
label设置模版
  1. #自动缩放
  2. kubectl autoscale deployment/nginx-auto --min=3 --max=10 --cpu-percent=75
  3. #查看自动缩放
  4. kubectl get hpa
  5. #删除自动缩放
  6. kubectl delete hpa nginx-deployment
复制代码
  1. #查看版本和Pod
  2. kubectl get deployment/nginx-deployment -owide
  3. kubectl get pods
  4. #更新容器镜像
  5. kubectl set image deployment/nginx-deployment nginx=nginx:1.23
  6. #滚动更新
  7. kubectl rollout status deployment/nginx-deployment
  8. #查看过程
  9. kubectl get rs --watch
复制代码
选择器

标签选择器 可以辨认一组对象。标签不支持唯一性。
标签选择器最常见的用法是为Service选择一组Pod作为后端。
Service设置模版
  1. #查看历史版本
  2. kubectl rollout history deployment/nginx-deployment
  3. #查看指定版本的信息
  4. kubectl rollout history deployment/nginx-deployment --revision=2
  5. #回滚到历史版本
  6. kubectl rollout undo deployment/nginx-deployment --to-revision=2
复制代码
现在支持两种范例的选择运算:基于等值的基于集合的
多个选择条件使用逗号分隔,相当于And(&&)运算。
  1. # port是service访问端口,target-port是Pod端口
  2. # 二者通常是一样的
  3. kubectl expose deployment/nginx-deployment \
  4. --name=nginx-service --type=ClusterIP --port=80 --target-port=80
复制代码
  1. # 随机产生主机端口
  2. kubectl expose deployment/nginx-deployment \
  3. --name=nginx-service2 --type=NodePort --port=8080 --target-port=80
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4