K8s学习总结

文章目录

      • 介绍
      • [Kubernetes 核心组件](#Kubernetes 核心组件)
      • k8s安装
      • 常用命令
      • 测试
          • [1. 创建一个测试应用程序](#1. 创建一个测试应用程序)
            • [2. 检查 Pod 是否运行](#2. 检查 Pod 是否运行)
          • [3. 暴露应用让外部访问](#3. 暴露应用让外部访问)
          • [4. 查看服务的暴露端口](#4. 查看服务的暴露端口)
          • [5. 访问 nginx 服务](#5. 访问 nginx 服务)
          • [6. 验证节点调度](#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驱动命令

cpp 复制代码
sudo docker info|grep Driver

更改docker驱动,编辑 /etc/docker/daemon.json (没有就新建一个),添加如下启动项参数即可:

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

重启docker

cpp 复制代码
sudo systemctl restart docker.service 

2,更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包

安装软件包以允许apt通过HTTPS使用存储库,已安装软件的可以忽略:

cpp 复制代码
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

执行第一条命令时候报错:

执行以下:

cpp 复制代码
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 集群。

cpp 复制代码
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

常用命令

cpp 复制代码
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 --force

kubectl logs d10001 查看pod日志
kubectl describe pod <pod-name>  查看 Kubernetes Pod 的详细信息  

kubectl create deployment nginx --image=nginx    创建一个新的 Deployment,让 Kubernetes 部署一个基于 nginx 镜像的应用程序,这个应用会被分配到集群中的工作节点运行
kubectl get services  查看 Kubernetes 集群中所有 Service 的命令  
cpp 复制代码
kubectl apply -f your-pod-definition.yaml  应用 YAML 配置:  
kubectl exec -it d10001 -- /bin/sh 进入k8s管理的docker

测试

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

部署一个简单的 nginx 应用程序,Kubernetes 会把它调度到工作节点上运行

执行以下命令创建 nginx 部署:

cpp 复制代码
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 仍然会根据默认参数来配置和管理资源。类似下 :

cpp 复制代码
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 管理正确的 Pods
  template:
    metadata:
      labels:
        app: nginx             # Pod 的标签,用于标识 Pods,使其与 Deployment 匹配
    spec:
      containers:
      - name: nginx            # 容器的名称,这里是 nginx
        image: nginx:latest    # 使用的容器镜像,这里是 nginx:latest
        ports:
        - containerPort: 80    # 容器监听的端口号,这里是 80
2. 检查 Pod 是否运行

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

cpp 复制代码
kubectl get pods

如果一切正常,你应该看到类似下面的输出,显示 Pod 处于 Running 状态:

这说明 nginx 应用()已经成功运行在集群的某个节点上。

3. 暴露应用让外部访问

创建一个 Kubernetes Service 来暴露这个 nginx 应用,让你能够从外部访问它。

执行以下命令创建一个 NodePort 类型的服务:

cpp 复制代码
kubectl expose deployment nginx --type=NodePort --port=80

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

4. 查看服务的暴露端口

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

cpp 复制代码
kubectl get services

会看到类似下面的输出:

cpp 复制代码
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,可以通过如下命令访问:

cpp 复制代码
curl http://192.168.74.129:32481

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

6. 验证节点调度

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

cpp 复制代码
kubectl get pods -o wide

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

相关推荐
鸡鸭扣29 分钟前
Docker:3、在VSCode上安装并运行python程序或JavaScript程序
运维·vscode·python·docker·容器·js
A ?Charis1 小时前
k8s-对接NFS存储
linux·服务器·kubernetes
饮长安千年月1 小时前
Linksys WRT54G路由器溢出漏洞分析–运行环境修复
网络·物联网·学习·安全·机器学习
红花与香菇2____2 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
KTKong3 小时前
kubeadm拉起的k8s集群证书过期的做法集群已奔溃也可以解决
云原生·容器·kubernetes
人工干智能4 小时前
科普:“Docker Desktop”和“Docker”以及“WSL”
运维·docker·容器
落笔画忧愁e4 小时前
FastGPT及大模型API(Docker)私有化部署指南
运维·docker·容器
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker
拥有一颗学徒的心4 小时前
鸿蒙第三方库MMKV源码学习笔记
笔记·学习·性能优化·harmonyos