『K8S 入门』一:基础概念与初步搭建

news2024/9/23 19:22:30

『K8S 入门』一:基础概念与初步搭建

一、kubernetes 组件

  1. 官方示图
    在这里插入图片描述
  2. 抽象示图
    在这里插入图片描述

Master 控制面板

  1. Api-Server:接口服务,基于 REST 风格开放 k8s 接口的服务
  2. ControllerManager
  • cloud-controller-manager:云控制管理器。第三方平台提供的控制器 API 对接功能
  • kube-controller-manager:控制器管理器。管理各个类型的控制器,针对 K8S 中的各种资源进行管理
  1. kube-scheduler:调度器。负责将 Pod 基于一定算法,将其调度到更合适的节点(服务器)上
  2. etcd:理解为 K8S 的数据库,键值类型存储的分布式数据库,提供基于 Raft 算法实现自主的集群高可用

节点 Node

  1. Kubelet:负责 Pod 的生命周期、存储、网络
  2. kube-proxy:网络代理,负责 Service 的服务发现,负载均衡(4 层负载)
  3. container-runtime:容器运行时环境。例如 docker、containerd、CRI-O

二、资源对象

服务分类

  1. 无状态:支持可扩容,不存储数据
  2. 有状态:可以独立存储数据,实现数据管理,水平扩容复杂

对象规约与状态

  1. 规约(spec):必须的,描述了对象的期望状态,可以理解为是个 Java 的类
  2. 状态(Status):对象的实际状态,由 k8s 自己维护,让对象尽量与期望状态重合,相当于 Java 的对象

资源分类

在这里插入图片描述

  1. 集群级:集群级别的资源,作用于集群之上,集群下的所有资源都可以共享使用,就是整个物理集群
  2. 命名空间:命名空间的资源,作用在命名空间之上,通常只能在该命名空间范围内使用,相当于逻辑空间
  • 工作负载型
    • Pod:k8s 最小可部署单元,一个 Pod(容器组)包含了一个应用程序器(某些情况下多个)、存储资源、一个唯一的网络地址。最好 Pod 只运行一个容器,如果要运行多个写作的容器,一定要是紧密耦合的
      • 副本(replicas):一个 Pod 可以被复制成多份,除了 Pod 的名字、uid 等不一样外,其他都一样
      • 控制器
        • 适用无状态服务
          • Replication Controller(已废弃):RC 可以管理 Pod 的服务数量,不过和 Pod 是绑定的
          • ReplicaSet:RC 的升级版,通过 selector 控制打了标签的哪些 Pod 进行扩缩容
          • Deployment:RS 的升级版,能够支持更多功能(例如,创建 RS、滚动回滚升级、平滑扩缩容、暂停与恢复 Deployment)
        • 适用有状态服务
          • StatefulSet:StatefulSet 中每个 Pod 的 DNS 格式为 statefulSetName-{0…N-1}.serviceName.namespace.svc.cluster.local(其中,serviceName 为 Headless Service 的名字;{0…N-1} 为 Pod 所在的序号,从 0 开始到 N-1;statefulSetName 为 StatefulSet 的名字;namespace 为服务所在的 namespace;Headless Servic 和 StatefulSet 必须在相同的 namespace;.cluster.local 为 Cluster Domain)
            • Headless Service:用于定义网络标志,将域名与 ip 绑定映射关系,有序
            • volumeClaimTemplate:用于创建 PersistentVolumes
        • 守护进程
          • DaemonSet:保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型应用比如日志收集、系统监控、系统程序等
        • 任务/定时任务
          • Job:一次性任务,运行完成后Pod销毁,不再重新启动新容器
          • CronJob:是在 Job 基础上加上了定时功能
  • 服务发现
    • Service:把 Pod 暴露出来提供服务,对外表现为一个访问入口,访问该入口的请求将经过负载均衡,转发到后端 Pod 中的容器(只能横向访问)
    • Ingress:提供外网访问 Service 的能力,可以把某个请求地址映射、路由到特定的 Service(负责纵向流量)
  • 存储
    • Volume:数据卷,共享 Pod 中容器使用的数据。用来放持久化的数据,比如数据库数据
    • CSI:Container Storage Interface,一个标准接口规范,旨在将任意存储系统暴露给容器化应用程序
  • 特殊类型配置
    • ConfigMap:用来放明文配置
    • Secret:解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中
    • downwardAPI:让 Pod 里的容器能够直接获取到这个 Pod 对象本身的一些信息,一般有 2 种方式将 Pod 信息注入到容器内部例如环境变量、volume 挂载
  • 其他
    • Role:一组权限的集合,例如 Role 可以包含列出 Pod 权限及列出 Deployment 权限,Role 用于给某个 NameSpace 中的资源进行鉴权
    • RoleBinding:将 Subject 绑定到 Role,RoleBinding 使规则在命名空间内生效

Pod 基本原理图

  • 其实就是相当于把紧凑合的应用,通过 pause 提供一个统一访问的环境,例如进行网络共享、应用之间的文件共享
    在这里插入图片描述
    pause 基本原理图
  • 通过 pause 就可以使 pod 里面的应用通过 localhost 访问
    在这里插入图片描述

Replication Controller 基本原理图

  • 能够帮助更新 Pod 的副本数量,只不过是和 Pod 相关绑定
    在这里插入图片描述

ReplicaSet、Deployment 基本原理图

  • 通过 selector 可以选择对哪些标签的 Pod 进行扩缩容生效
    在这里插入图片描述
    StatefulSet 基本原理图
  • 为网络定义访问的 DNS
    在这里插入图片描述
    DaemonSet 基本原理图
  • 同样通过 selector 选择自动部署一些日志收集器之类的程序
    在这里插入图片描述
    Service/Ingress 基本原理图
  • Service 负责横向服务访问,Ingress 负责纵向服务访问
    在这里插入图片描述
  1. 元数据级:元数据级别的资源,对于资源的元数据描述,每一个资源都可以使用元空间的数据
  • Horizontal Pod Autoscaler(HPA):根据自定义的 metrics 对 Pod 进行扩/缩容
  • Pod Template:关于 Pod 的定义
  • LimitRange:对 Pod 的资源使用限制

三、基础部署

  1. 准备三台虚拟机
角色ip
k8s-master192.168.199.152
k8s-node1192.168.199.228
k8s-node2192.168.199.189
  1. 初始化操作(三台机子都要操作,除非特别标注)
  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 关闭 selinux
# 永久
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时
setenforce 0
  • 关闭 swap(一定要重启一下虚拟机)
# 临时
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 根据规划设置主机名
# 自己设置相应主机名
hostnamectl set-hostname <hostname>
  • 添加 hosts
cat >> /etc/hosts << EOF
192.168.199.152 k8s-master
192.168.199.228 k8s-node1
192.168.199.189 k8s-node2
EOF
  • 将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
  • 时间同步
yum install ntpdate -y
ntpdate time.windows.com
  1. 安装基础软件
  • 安装 docker(centenOS)
    • 安装必要的一些系统工具
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
    • 添加软件源信息
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    • 更新并安装 Docker-CE
    sudo yum makecache fast
    sudo yum -y install docker-ce
    
    • 开启 Docker 服务
    sudo service docker start
    
  • 添加阿里云源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • 安装 kubeadm、kubelet、kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6

systemctl enable kubelet

# 配置关闭 Docker 的 cgroups,修改 /etc/docker/daemon.json,加入以下内容
{ 
 "exec-opts": ["native.cgroupdriver=systemd"]
}
# 重启 docker
systemctl daemon-reload
systemctl restart docker
  1. 部署 Kubernetes Master
kubeadm init \
      --apiserver-advertise-address=192.168.199.152 \
      --image-repository registry.aliyuncs.com/google_containers \
      --kubernetes-version v1.23.6 \
      --service-cidr=10.96.0.0/12 \
      --pod-network-cidr=10.244.0.0/16

# 安装成功后,复制如下配置并执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

在这里插入图片描述
5. 加入 Kubernetes Node

# 分别在 k8s-node1 和 k8s-node2 执行

# 下方命令可以在 k8s master 控制台初始化成功后复制 join 命令
kubeadm join 192.168.199.152:6443 --token <执行 init 后最后一行 token> --discovery-token-ca-cert-hash sha256:<master 控制台的 hash>


# 如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请
# 如果 token 已经过期,就重新申请
kubeadm token create

# token 没有过期可以通过如下命令获取
kubeadm token list

# (需要在 master 节点执行)获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

kubeadm join 192.168.199.152:6443 --token wne21b.5cngr5ukdlknad0e --discovery-token-ca-cert-hash sha256:eea845d4d840f95f75b0a024c17f5dd26941b355f6a11d39fa867cd02dab9c6d
6. 部署 CNI 网络插件(在 master 节点执行)

  • 先执行查看命令,发现三个节点都还没 ready
kubectl get nodes
  • 查看组件状态时否正常
kubectl get componentstatus
  • k8s 创建的 Pod 默认会放在 kube-system 命名空间下,通过下面命令查看一下现在的 Pod 状态,会发现两个 coredns 还在 pending 中
kubectl get pods -n kube-system
  • 把下面的文件下载到 /opt/k8s 目录下
curl https://docs.projectcalico.org/manifests/calico.yaml -O
  • 修改 calico.yaml 的内容
1.修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr(即 pod-network-cidr=10.244.0.0/16) 相同
2.删除镜像 docker.io/ 前缀,避免下载过慢导致失败
sed -i 's#docker.io/##g' calico.yaml
  • 通过下面命令执行聚合文件构建应用
kubectl apply -f calico.yaml
  • 再通过下面命令,查看 pod 的状态
kubectl get po -n kube-system
  • 这时候,我们可以看到一些 Init 的节点,可以通过下面命令,看看现在的执行状态。如果 Events 属性里面,镜像没下载下来,可以自己手动通过 docker pull 下载
kubectl describe po calico-kube-controllers-74dbdc644f-kk7bl -n kube-system

在这里插入图片描述
7. 测试 kubernetes 集群

  • 执行下面命令
# 创建部署
kubectl create deployment nginx --image=nginx

# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看 pod 以及服务信息
kubectl get pod,svc
  • 访问暴露的 ip 和端口,就可以看到是否显示 nginx 的页面了:http://192.168.199.152:32667

四、命令行工具 kubectl

  1. 在任意节点使用 kubectl
  • 执行下面命令
# 1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中
scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes

# 2. 在对应的服务器上配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

# 3. 然后在其他节点测试
kubectl get nodes
  1. 资源类型与别名
资源类型别名
podspo
deploymentsdeploy
servicessvc
namespacens
nodesno
  1. API 概述
  • 类型
    • Alpha:包含 alpha 名称的版本,该软件可能包含错误。启用一个功能可能会导致 bug
    • beta:包含 beta 名称的版本,该软件经过很好的测试
    • Stable:该版本名称命名方式:vX 这里 X 是一个整数
  • 访问控制:认证、授权

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

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

相关文章

Android图片加载框架库源码解析 - Coil

文章目录 一、什么是Coil二、引入Coil1、ImageView加载图片1.1、普通加载1.2、crossfade(淡入淡出)加载1.3、crossfade的动画时间1.4、placeholder1.5、error1.6、高斯模糊1.7、灰度变换1.8、圆形1.9、圆角 2、Gif加载3、SVG加载(不存在)4、视频帧加载5、监听下载过程6、取消下…

想翻译pdf文档,试了几个工具对比:有阿里(完全免费,快,好用,质量高,不用注册登录)道最好(有限免费) 百度(有限免费)和谷歌完全免费(网不好)

文档翻释作为基础设施&#xff0c;工作必备。 阿里 &#xff08;完全免费&#xff0c;快&#xff0c;好用&#xff0c;质量高&#xff0c;不用注册登录&#xff0c;无广告&#xff09;我给满分 https://translate.alibaba.com/#core-translation 先选好语言。 Google(完全免…

PDManer生成Postgis对应Schema数据库设计文档

项目开发数据库选择postGis&#xff0c;由于需要编写数据库设计说明书&#xff0c;因此选择工具PDManer生成数据库设计文档&#xff0c;但是postGis一个数据库&#xff0c;可能对应多个Schema。如下图所示&#xff1a; 1.编写数据库设计文档时&#xff0c;仅需编写hly这个Sche…

美妆造型教培服务预约小程序的作用是什么

美业市场规模很高&#xff0c;细分类目更是比较广&#xff0c;而美妆造型就是其中的一类&#xff0c;从业者也比较多&#xff0c;除了学校科目外&#xff0c;美妆造型教培机构也有生意。 对机构来说主要目的是拓客引流-转化及赋能&#xff0c;而想要完善路径却是不太容易&…

Ubuntu16.04 python matplotlib 坐标轴标签出现中文乱码

问题&#xff1a;坐标轴打印中文时&#xff0c;显示会乱码 import matplotlib.pyplot as plt plt.ylabel(时间刻度)原因&#xff1a;matplotlib里面没有中文字体解决方法&#xff1a;下载SimHei字体&#xff0c;快捷方法是使用everything直接在windows搜索simhei.ttf&#xff…

计算机基础知识41

前端 # 前端是所有跟用户直接打交道 比如&#xff1a;PC页面、手机页面、汽车显示屏&#xff0c;肉眼可以看见的 # 后端&#xff1a;一堆代码&#xff0c;用户不能够直接看到&#xff0c;不直接与用户打交道 常见的后端&#xff1a;Python、Java、Go等 # 学了前端就可以做全栈…

0004net程序设计-抗疫物资

文章目录 **摘** **要**目 录系统设计开发环境 摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;抗疫物资管理系统利用计算机网络实现信息化管理&#xff0c;使整个抗疫物资管理…

Kafka - 3.x 分区分配策略及再平衡不完全指北

文章目录 生产经验——分区分配策略及再平衡生产者分区分配之Range及再平衡Range分区策略原理Range分区分配策略及再平衡案例 生产者分区分配之RoundRobin策略及再平衡RoundRobin分区策略原理RoundRobin分区分配策略及再平衡案例 生产者分区分配之Sticky及再平衡Sticky分区策略…

网络协议--TCP的超时与重传

21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认&#xff0c;它就重传该数据。对任何实现而言&#xff0c;关键之处就在于超时和重…

Android NDK开发详解之Android.mk探秘

Android NDK开发详解之Android.mk探秘 概览基础知识变量和宏NDK 定义的 include 变量CLEAR_VARSBUILD_EXECUTABLEBUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARYPREBUILT_SHARED_LIBRARYPREBUILT_STATIC_LIBRARY 目标信息变量TARGET_ARCHTARGET_PLATFORMTARGET_ABI 模块描述变量LOC…

ubuntu下英伟达显卡驱动及cuda安装

一、查看显卡需要安装的cuda版本及需要的驱动版本 进入官网查看&#xff1a; CUDA 12.3 Release Notes 比如需要装cuda12.2GA需要驱动版本至少为535.54.03 二、下载显卡驱动 2.1 进入官网下载界面&#xff1a; Official Drivers | NVIDIA&#xff0c;点击Beta and older dr…

系列三十三、代理(三)动态代理

一、概述 在实际开发过程中&#xff0c;往往我们自己不会去创建代理类&#xff0c;而是通过JDK提供的Proxy类在程序运行时&#xff0c;运用反射机制动态创建而成&#xff0c;这就是所谓的动态代理。 1.1、动态代理 vs 静态代理 静态代理需要程序员自己写代理类&#xff0c;动态…

软件测试面试百问:如何测试App性能?

APP性能测试几乎是客户端面试必问。 为什么要做App性能测试 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&#xff0c;用户可能会抛弃该App&#xff0c;换同类型的其他应用。如果APP的性能较好&#xff0c;用户体验高&#xff0c;使用起来丝滑顺畅&…

干货:传统软文和新媒体软文的区别在哪儿

其实早在古代就有软文的影子&#xff0c;不管是“借问酒家何处有&#xff0c;牧童遥指杏花村”&#xff0c;还是“日啖荔枝三百颗,不辞长作岭南人。”都有软文的影子。今天媒介盒子就来和大家聊聊&#xff0c;传统软文和新媒体软文的区别在哪儿&#xff1f; 一、 渠道不同 在…

UWB智能制造

&#xff08;一&#xff09;无人值守的人、车、物出入监控 &#xff08;二&#xff09;人、车、物授权区域进出监控 &#xff08;三&#xff09;固定资产区域盘点及移动盘点 &#xff08;四&#xff09;人、车、物作业现场网格化管理 &#xff08;五&#xff09;作业现场人车、…

万兆光模块是否能够应对未来网络的需求?

万兆光模块目前已经是数据中心等高性能计算场景中的标配之一&#xff0c;其传输速率可以满足大量的数据传输需求。随着网络的发展&#xff0c;光模块的传输速率也在不断提升。目前一些厂商已经推出了400G和800G光模块&#xff0c;同时更高速率光模块也在加速研发中。可以预见&a…

原型和原型链的理解

记住一句话&#xff1a;万物皆对象 对于原型和原型链&#xff0c;我们要知道一下几个&#xff1a;函数对象&#xff0c;实例对象、原型对象 1&#xff09;函数对象——就是平时称的对象&#xff1b; 2&#xff09;实例对象——new出的对象或者{ }&#xff1b; 3&#xff09;原型…

医疗安全不良事件管理系统源码(PHP+ vue+laravel)

医疗安全不良事件管理系统全套源码 不良事件上报系统源码 不良事件管理系统帮助医院梳理建立不良事件上报与管理的一体化解决方案&#xff0c;包含上报内容、归口科室、上报流程及管理办法。提供面向医院的不良事件全过程管理平台&#xff0c;包含事件上报、事件处理、事件追踪…

线性代数 第一章 行列式

一、概念 不同行不同列元素乘积的代数和&#xff08;共n!项&#xff09; 二、性质 经转置行列式的值不变&#xff0c;即&#xff1b; 某行有公因数k&#xff0c;可把k提到行列式外。特别地&#xff0c;某行元素全为0&#xff0c;则行列式的值为0&#xff1b; 两行互换行列式…

goland setup go env

go env -w设置的变量&#xff0c;在goland中不生效&#xff0c;需要额外配置。 点击goland->preference&#xff0c;在go module里&#xff0c;设置go环境变量即可。