当前位置: 首页 > news >正文

K8s学习总结

文章目录

      • 介绍
      • Kubernetes 核心组件
      • k8s安装
          • 环境
          • 安装组件
      • 常用命令
      • 测试
          • 1. 创建一个测试应用程序
            • 2. 检查 Pod 是否运行
          • 3. 暴露应用让外部访问
          • 4. 查看服务的暴露端口
          • 5. 访问 nginx 服务
          • 6. 验证节点调度
      • 如有错误,敬请指针,谢谢!

介绍

Kubernetes,是一个由Google开源的容器集群管理系统,旨在自动化部署、扩展和管理容器化应用程序。

Kubernetes 核心组件

Pod:Kubernetes 中最小的可部署单位, 表示一个或多个紧密相关的容器的集合。Pod 中的容器共享网络和存储资源,并且总是一起部署、调度和管理
Node:Kubernetes 集群中的一台物理或虚拟机器,用于运行 Pod。一个集群由多个节点组成。
容器: 实际运行应用程序的单位
Service:为一组 Pod 提供稳定的网络服务。通过 Service,Pod 可以动态扩展,而不影响客户端的访问。
Namespace:用于对资源进行逻辑隔离,可以用于区分不同的环境或团队。
Deployment:管理 Pod 的声明性更新,负责管理应用的版本、扩展和滚动更新。确保指定数量的 Pod 副本始终在运行。这意味着如果某个 Pod 出现故障或被删除,Deployment 会自动创建新的 Pod 来替代它。 持滚动更新功能,允许你逐步升级应用程序的版本 。 ,
YAML 文件是用来定义和创建 Deployment 的配置文件,而 Deployment 本身是 Kubernetes 中负责实际管理应用程序的控制器。 包括要部署的应用镜像、Pod 副本数量、资源限制、调度策略等。
● 通过 YAML 文件创建 Deployment:你使用 kubectl apply -f .yaml 命令将 YAML 文件提交给 Kubernetes,Kubernetes 会根据 YAML 文件的定义创建并管理相应的 Deployment 对象。
Deployment 管理 Pod:Kubernetes 中的 Deployment 负责管理 Pod 的生命周期,包括创建、删除和更新 Pod。

节点与 Pod 的关系类似于服务器与应用程序的关系:一个服务器(节点)可以运行多个应用程序(Pod),而每个应用程序(Pod)可以包含多个进程(容器)。

k8s安装

环境

我们需要准备一台 Ubuntu 20.04 服务器作为主节点(控制平面),并准备多台 Ubuntu 20.04 服务器作为工作节点(Worker Nodes)。确保服务器已经安装了 Ubuntu 20.04 操作系统,并更新到了最新版本。
1.1更新系统

首先,确保系统是最新的。
sudo apt update
sudo apt upgrade -y

1.2 关闭 Swap

Kubernetes 需要关闭 Swap 以正常工作。
sudo swapoff -a
#修改/etc/fstab,注释掉swap那行,持久化生效
sudo vi /etc/fstab

1.3确保每个节点有唯一的主机名,并且可以通过主机名解析彼此。

在宿主机分别设置主机名:k8s-master,k8s-node01

sudo vim /etc/hostname

hosts设置

sudovim /etc/hosts
#添加内容
192.168.47.138 k8s-master
192.168.47.137 k8s-node01

1.4确保时区和时间正确
时区设置

sudo timedatectl set-timezone Asia/Shanghai
#同时使系统日志时间戳也立即生效
sudo systemctl restart rsyslog

安装组件

1,更改docker默认驱动为systemd
为防止初始化出现一系列的错误,请检查docker和kubectl驱动是否一致,否则kubectl没法启动造成报错。版本不一样,docker有些为cgroupfs,而kubectl默认驱动为systemd,所以需要更改docker驱动。
可查看自己docker驱动命令

sudo docker info|grep Driver

在这里插入图片描述
更改docker驱动,编辑 /etc/docker/daemon.json (没有就新建一个),添加如下启动项参数即可:

#编辑创建文件
sudo vim  /etc/docker/daemon.json
#添加内容
{"exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker

sudo systemctl restart docker.service 

2,更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
安装软件包以允许apt通过HTTPS使用存储库,已安装软件的可以忽略:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

执行第一条命令时候报错:在这里插入图片描述
执行以下:

sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc# Add the repository to Apt sources:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

发现docker报错解决了,还有这报错:

错误:6 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
无法发起与 packages.cloud.google.com:443 (2404:6800:4012:4::200e) 的连接 - connect (101: 网络不可达) 无法连接上 packages.cloud.google.com:443 (142.250.217.110)。 - connect (111: 拒绝连接)
正在读取软件包列表… 完成
W: 无法下载 https://apt.kubernetes.io/dists/kubernetes-xenial/InRelease 无法发起与 packages.cloud.google.com:443 (2404:6800:4012:4::200e) 的连接 - connect (101: 网络不可达) 无法连接上 packages.cloud.google.com:443 (142.250.217.110)。 - connect (111: 拒绝连接)

从阿里云的 Kubernetes 镜像源安装 Kubernetes 组件。这包括设置必要的软件源、添加签名密钥、更新索引,并最终安装 kubelet、kubeadm 和 kubectl,以便你可以设置和管理 Kubernetes 集群。

apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" |tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl

常用命令

kubectl get node 是用来查看 Kubernetes 集群中所有节点的状态信息  
kubectl get pods 验证 Pod 状态:  
kubectl get deployments 查看所有的deployments
kubectl get deployments --all-namespaces
kubectl delete pod <pod-name>   删除指定pod
kubectl delete pods --all  删除所有pod
kubectl delete pods --all -n <namespace> 删除命名空间的所有pod
kubectl delete po pod名称 --force --grace-period=0 -n 名称空间     强制删除pod,速度比较快
kubectl delete pods --all --grace-period=0 --forcekubectl logs d10001 查看pod日志
kubectl describe pod <pod-name>  查看 Kubernetes Pod 的详细信息  kubectl create deployment nginx --image=nginx    创建一个新的 Deployment,让 Kubernetes 部署一个基于 nginx 镜像的应用程序,这个应用会被分配到集群中的工作节点运行
kubectl get services  查看 Kubernetes 集群中所有 Service 的命令  

在这里插入图片描述

kubectl apply -f your-pod-definition.yaml  应用 YAML 配置:  
kubectl exec -it d10001 -- /bin/sh 进入k8s管理的docker

测试

1. 创建一个测试应用程序

部署一个简单的 nginx 应用程序,Kubernetes 会把它调度到工作节点上运行
执行以下命令创建 nginx 部署:

kubectl create deployment nginx --image=nginx

创建一个新的 Deployment,让 Kubernetes 部署一个基于 nginx 镜像的应用程序,这个应用会被分配到集群中的工作节点运行。 nginx 是 Deployment 的名称 ,–image=nginx 是 Docker Hub 上的 nginx 官方镜像 .
该行命令执行后 Deployment 会根据指定的镜像(nginx)创建一个或多个 Pod。这些 Pod 将运行 nginx 容器,并绑定到集群中的节点上。
使用 kubectl create deployment 命令创建 Deployment 时, 即使你没有手动编写 YAML 文件,Kubernetes 仍然会根据默认参数来配置和管理资源。类似下 :

apiVersion: apps/v1             # API 版本,指定使用 apps/v1 API 版本来创建 Deployment 对象
kind: Deployment               # 资源类型,Deployment 控制器用于管理应用程序的副本
metadata:name: nginx                  # Deployment 的名称,这里是 nginx
spec:replicas: 1                  # 希望运行的 Pod 副本数量,这里指定 1 个副本,一个pod类似于一个应用程序selector:matchLabels:app: nginx               # 标签选择器,用于匹配 Pod 的标签,确保 Deployment 管理正确的 Podstemplate:metadata:labels:app: nginx             # Pod 的标签,用于标识 Pods,使其与 Deployment 匹配spec:containers:- name: nginx            # 容器的名称,这里是 nginximage: nginx:latest    # 使用的容器镜像,这里是 nginx:latestports:- containerPort: 80    # 容器监听的端口号,这里是 80
2. 检查 Pod 是否运行

部署完 nginx 之后,你需要确认 Pod(运行中的应用实例)是否正常启动。

kubectl get pods

如果一切正常,你应该看到类似下面的输出,显示 Pod 处于 Running 状态:
在这里插入图片描述
这说明 nginx 应用()已经成功运行在集群的某个节点上。

3. 暴露应用让外部访问

创建一个 Kubernetes Service 来暴露这个 nginx 应用,让你能够从外部访问它。
执行以下命令创建一个 NodePort 类型的服务:

kubectl expose deployment nginx --type=NodePort --port=80

这条命令会创建一个 NodePort 服务,使得集群外部的用户可以通过 Kubernetes 节点(worker节点)的 IP 和一个随机分配的端口来访问 nginx。

4. 查看服务的暴露端口

执行以下命令查看服务的详细信息:

kubectl get services

会看到类似下面的输出:

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
nginx        NodePort    10.104.142.159   <none>        80:32481/TCP     2m
5. 访问 nginx 服务

现在,可以从命令行通过 curl 访问 nginx。假设节点的 IP 地址是 192.168.74.129,可以通过如下命令访问:

curl http://192.168.74.129:32481

如果一切正常,你会看到 nginx 默认的欢迎页面的 HTML 内容。

6. 验证节点调度

通过以下命令,查看 Pod 被调度到哪个节点上

kubectl get pods -o wide

如有错误,敬请指针,谢谢!

相关文章:

K8s学习总结

文章目录 介绍Kubernetes 核心组件k8s安装环境安装组件 常用命令测试1. 创建一个测试应用程序2. 检查 Pod 是否运行 3. 暴露应用让外部访问4. 查看服务的暴露端口5. 访问 nginx 服务6. 验证节点调度 如有错误&#xff0c;敬请指针&#xff0c;谢谢! 介绍 Kubernetes&#xff0…...

正则表达式(Regular expresssion)

正则表达式 匹配单次 . &#xff1a;匹配任意一个字符 [ ] &#xff1a;匹配[ ]里举例的任意一个字符 /d &#xff1a;匹配数字0-9 /D &#xff1a;匹配非数字 /s &#xff1a;匹配空白或tab建 /S &#xff1a;匹配非空白 /w &#xff1a;…...

Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask

基于 Flask 框架的 Python Web 开发研究 摘要 在 Web 开发的江湖里,Python 是一位武林高手,而 Flask 则是它手中那把小巧却锋利的匕首。本文以 Flask 框架为核心,深入探讨了它在 Python Web 开发中的应用。通过幽默风趣的笔触,结合实例和表格,分析了 Flask 的特性、优势以…...

MySQL的聚簇索引与非聚簇索引

前言 首先我们要了解到&#xff0c;聚簇索引只能有一个&#xff0c;而非聚簇可以有多个。在本文中可以了解到&#xff0c;范围查询时聚簇索引的优势&#xff0c;以及非聚簇索引在频繁更新时的劣势。   在MySQL中&#xff0c;主键索引通常就是聚簇索引&#xff0c;如果没有显式…...

vscode的一些实用操作

1. 焦点切换(比如主要用到使用快捷键在编辑区和终端区进行切换操作) 2. 跳转行号 使用ctrl g,然后输入指定的文件内容&#xff0c;即可跳转到相应位置。 使用ctrl p,然后输入指定的行号&#xff0c;回车即可跳转到相应行号位置。...

C++11 thread

文章目录 C11 线程库线程对象的构造方式无参的构造函数调用带参的构造函数调用移动构造函数thread常用成员函数 this_thread命名空间join && detachmutex C11 线程库 线程对象的构造方式 无参的构造函数 1、调用无参的构造函数,调用无参的构造函数创建出来的线程对象…...

rabbitmq五种模式的总结——附java-se实现(详细)

rabbitmq五种模式的总结 完整项目地址&#xff1a;https://github.com/9lucifer/rabbitmq4j-learning 一、简单模式 &#xff08;一&#xff09;简单模式概述 RabbitMQ 的简单模式是最基础的消息队列模式&#xff0c;包含以下两个角色&#xff1a; 生产者&#xff1a;负责发…...

Qt中基于开源库QRencode生成二维码(附工程源码链接)

目录 1.QRencode简介 2.编译qrencode 3.在Qt中直接使用QRencode源码 3.1.添加源码 3.2.用字符串生成二维码 3.3.用二进制数据生成二维码 3.4.界面设计 3.5.效果展示 4.注意事项 5.源码下载 1.QRencode简介 QRencode是一个开源的库&#xff0c;专门用于生成二维码&…...

Java数据结构---链表

目录 一、链表的概念和结构 1、概念 2、结构 二、链表的分类 三、链表的实现 1、创建节点类 2、定义表头 3、创建链表 4、打印链表 5、链表长度 6、看链表中是否包含key 7、在index位置插入val&#xff08;0下标为第一个位置&#xff09; 8、删除第一个关键字key …...

mongodb是怎么分库分表的

在构建高性能的数据库架构时&#xff0c;MongoDB的分库分表策略扮演着至关重要的角色&#xff0c;它通过一系列精细的步骤确保了数据的高效分布与访问。以下是对这一过程的详尽阐述&#xff0c;旨在提供一个清晰且优化过的理解框架。 确定分片键&#xff08;Shard Key&#xf…...

C++自研游戏引擎-碰撞检测组件-八叉树AABB检测算法实现

八叉树碰撞检测是一种在三维空间中高效处理物体碰撞检测的算法&#xff0c;其原理可以类比为一个管理三维空间物体的智能系统。这个示例包含两个部分&#xff1a;八叉树部分用于宏观检测&#xff0c;AABB用于微观检测。AABB可以更换为均值或节点检测来提高检测精度。 八叉树的…...

spring boot对接clerk 实现用户信息获取

在现代Web应用中&#xff0c;用户身份验证和管理是一个关键的功能。Clerk是一个提供身份验证和用户管理的服务&#xff0c;可以帮助开发者快速集成这些功能。在本文中&#xff0c;我们将介绍如何使用Spring Boot对接Clerk&#xff0c;以实现用户信息的获取。 1.介绍 Clerk提供…...

一种动态地址的查询

背景 当我们注入一个进程&#xff0c;通过函数地址进行call时经常会遇到这样的一个问题。对方程序每周四会自动更新。更新后之前的函数地址就变化了&#xff0c;然后需要重新找地址。所以&#xff0c;我就使用了一个动态查询的方式。 第一步&#xff1a;先为需要call的函数生…...

周雨彤:用角色与生活,诠释审美的艺术

提到内娱审美优秀且持续在线的女演员&#xff0c;周雨彤绝对是其中最有代表性的一个。 独树一帜的表演美学 作为新生代演员中的实力派代表&#xff0c;周雨彤凭借细腻的表演和对角色的深度共情&#xff0c;在荧幕上留下了多个令人难忘的“出圈”形象。在《我在他乡挺好的》中…...

使用jks给空apk包签名

1、在平台官方下载空的apk包&#xff08;上传应用时有提醒下载&#xff09; 2、找到jdk目录&#xff0c;比如C:\Program Files\Java\jdk1.8\bin&#xff0c;并把下载的空包apk和jks文件放到bin下 3、以管理员身份运行cmd&#xff0c;如果不是管理员会签名失败 4、用cd定位到…...

500. 键盘行 771. 宝石与石头 简单 find接口的使用

500. 键盘行1 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 请注意&#xff0c;字符串 不区分大小写&#xff0c;相同字母的大小写形式都被视为在同一行。 美式键盘 中&#xff1a; 第一行由字符 "qwer…...

仙剑世界手游新手攻略 仙剑世界能用云手机玩吗

欢迎来到《仙剑世界》手游的仙侠世界&#xff01;作为新手玩家&#xff0c;以下是一些详细的攻略和建议&#xff0c;帮助你快速上手并享受游戏的乐趣。 一、新手职业推荐 1.轩辕&#xff1a;这是一个偏辅助的职业&#xff0c;可以给队友提供输出加成等增益效果&#xff0c;不过…...

[题解]2024CCPC重庆站-小 C 的神秘图形

Sources&#xff1a;K - 小 C 的神秘图形Abstract&#xff1a;给定正整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105)&#xff0c;三进制字符串 n 1 , n 2 ( ∣ n 1 ∣ ∣ n 2 ∣ n ) n_1,n_2(|n_1||n_2|n) n1​,n2​(∣n1​∣∣n2​∣n)&#xff0c;按如下方法…...

NPS内网穿透SSH使用手册

1、说明 nps-一款轻量级、高性能、功能强大的内网穿透代理服务器 github地址&#xff1a;https://github.com/ehang-io/nps 官网文档地址&#xff1a;https://ehang-io.github.io/nps/#/?idnps 2、服务端 下载地址&#xff1a;https://github.com/ehang-io/nps/releases 下…...

大幂计算和大阶乘计算【C语言】

大幂计算&#xff1a; #include<stdio.h> long long int c[1000000]{0}; int main() {long long a,b,x1;c[0]1;printf("请输入底数&#xff1a;");scanf("%lld",&a);printf("请输入指数&#xff1a;");scanf("%lld",&b…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...