Kubernetes学习笔记01

发布于:2024-04-29 ⋅ 阅读:(29) ⋅ 点赞:(0)

第一章、kubernetes 概述

1、kubernetes 基本介绍

kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。

传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。

容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在 build 或 release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。

Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

K8S概述:

k8s是谷歌在2014年开业的容器化集群管理系统

使用k8s进行容器化应用部署

使用k8s利于应用扩展

k8s目标实施让部署容器化应用更加简洁和高效

2、kubernetes 功能和架构

2.1 概述

Kubernetes 是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes 积累了作为 Google 生产环境运行工作负载 15 年的经验,并吸收了来自于社区的最佳想法和实践。

2.2 K8s 功能:

(1)自动装箱

基于容器对应用运行环境的资源配置要求自动部署应用容器

(2)自我修复(自愈能力)

当容器失败时,会对容器进行重启

当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度

当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服

(3)水平扩展

通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁

(4)服务发现

用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡

(5)滚动更新

可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新

(6)版本回退

可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退

(7)密钥和配置管理

在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署

(8)存储编排

自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务

(9)批处理

提供一次性任务,定时任务;满足批量数据处理和分析的场景

2.3 应用部署架构分类

(1) 无中心节点架构

GlusterFS

(2) 有中心节点架构

HDFS

K8S

2.4 k8s 集群架构

master(主控节点)和node(工作节点)

(1)master组件

APIServer(API服务器)

  • 统一集群入口点,通过 RESTful API 提供对集群资源的访问和操作。
  • 负责认证、授权和准入控制,确保集群安全性和稳定性。
  • 将数据持久化存储到 etcd 中。

Scheduler(调度器)

  • 负责将未分配到节点的 Pod 分配到合适的节点上运行。
  • 根据 Pod 的调度需求和节点资源情况选择最佳节点,并考虑资源约束、亲和性和反亲和性等因素。

Controller Manager(控制器管理器)

  • 运行一组控制器,监控集群状态,并根据状态变化采取相应措施。
  • 包括 Replication Controller、Deployment Controller、StatefulSet Controller 等,管理集群中的资源状态。

etcd

  • 分布式键值存储系统,保存集群的所有状态信息,包括配置数据、元数据、状态和事件等。
  • 提供高可用性和一致性保证,作为 Kubernetes 控制平面的主要数据存储后端。

(2)node组件

Kubelet(kubelet)

  • 在每个节点上运行的 Kubernetes 组件,负责管理本地节点上的容器和 Pod。
  • 与 Master 节点通信,接收 Pod 配置信息并确保它们按照预期状态运行。
  • 监视节点上的资源使用情况,并与 Master 节点协调 Pod 的创建、启动、停止和删除等操作。

kube-proxy(Kubernetes 代理)

  • 在每个节点上运行的网络代理,负责实现 Kubernetes 服务的网络转发、负载均衡和服务发现等功能。
  • 通过维护节点上的网络规则和 IP 路由表,为集群内部的服务提供透明的网络访问。
  • 监听 Kubernetes API Server 上的服务和端点的变化,实时更新代理规则,确保服务的可用性和负载均衡。

2.5 k8s 集群架构节点角色功能

Master Node

k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和Controller MangerServer 所组成

Worker Node

集群工作节点,运行用户业务应用容器;

Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;

2.6 k8s核心概念

1. Pod(Pod)

定义:Pod 是 Kubernetes 中最小的部署单元,它是一个或多个紧密关联的容器

集合,它们共享相同的网络命名空间和生命周期。

特点:

  • 最小部署单元:Pod 是 Kubernetes 中最小的可部署单元,用于包含、调度和管理一个或多个容器。
  • 共享网络:Pod 内的容器共享相同的网络命名空间,可以通过 localhost 直接通信。
  • 生命周期短暂:Pod 的生命周期通常是短暂的,随着其所包含的容器的运行状态而变化。

2. Controller(控制器)

定义:Controller 是 Kubernetes 中的一种资源对象,用于确保系统中的其他资源(如 Pod)处于预期的状态。

功能:

  • Pod 副本管理:确保指定数量的 Pod 副本正在运行,如 ReplicaSet、Deployment 等。
  • 应用部署:支持无状态和有状态应用的部署,如 Deployment、StatefulSet 等。
  • 节点调度:确保所有节点运行同一组 Pod,如 DaemonSet。
  • 任务管理:支持一次性任务和定时任务的管理,如 Job、CronJob 等。

3. Service(服务)

定义:Service 是 Kubernetes 中的一种资源对象,定义了一组 Pod 的访问规则,提供统一的入口点以访问这些 Pod。

功能:

  • 负载均衡:通过 Service 提供的虚拟 IP 实现对后端 Pod 的负载均衡。
  • 服务发现:通过 DNS 或环境变量提供服务名称解析,实现对后端 Pod 的动态发现。
  • 会话保持:支持会话保持功能,确保来自同一客户端的请求始终路由到同一个后端 Pod。

第二章、kubernetes 集群搭建(kubeadm 方式)

1、前置知识点

目前生产部署 Kubernetes 集群主要有两种方式:

(1)kubeadm

Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

(2)二进制包

从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。

Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

2、kubeadm 部署方式介绍

kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:

第一、创建一个 Master 节点 kubeadm init

第二, 将 Node 节点加入到当前集群中 $ kubeadm join

3、安装要求

在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止 swap 分区

4、最终目标

(1) 在所有节点上安装 Docker 和 kubeadm

(2)部署 Kubernetes Master

(3)部署容器网络插件

(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中

(5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源

5、准备环境

角色 IP

k8s-master 192.168.31.61

k8s-node1 192.168.31.62

k8s-node2 192.168.31.63

6、系统初始化

6.1 关闭防火墙:

$ systemctl stop firewalld

$ systemctl disable firewalld

6.2 关闭 selinux:

$ sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久

$ setenforce 0 # 临时

6.3 关闭 swap:

$ swapoff -a # 临时

$ vim /etc/fstab # 永久

6.4 主机名:

$ hostnamectl set-hostname

6.5 在 master 添加 hosts:

$ cat >> /etc/hosts

192.168.31.61 k8s-master

192.168.31.62 k8s-node1

192.168.31.63 k8s-node2

EOF

6.6 将桥接的 IPv4 流量传递到 iptables 的链:

$ cat > /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

$ sysctl --system # 生效

6.7 时间同步:

$ yum install ntpdate -y

$ ntpdate time.windows.com

7、所有节点安装 Docker/kubeadm/kubelet

Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。

(1)安装 Docker

$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo

$ yum -y install docker-ce-18.06.1.ce-3.el7

$ systemctl enable docker && systemctl start docker

$ docker --version

(2)添加阿里云 YUM 软件源

设置仓库地址

# cat > /etc/docker/daemon.json

{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]

}

EOF

systemctl restart docker

添加 yum 源

$ cat > /etc/yum.repos.d/kubernetes.repo

[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.gpghttps://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

(3)安装 kubeadm,kubelet 和 kubectl

$ yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

$ systemctl enable kubelet

8、部署 Kubernetes Master

(1)在 192.168.31.61(Master)执行

$ kubeadm init \

--apiserver-advertise-address=192.168.48.133 \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version v1.18.0 \

--service-cidr=10.96.0.0/12 \

--pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址

如果报错:将以下内容添加到文件中:/etc/docker/daemon.json

{

    "exec-opts": ["native.cgroupdriver=systemd"]

}

确保将这个文件保存后,重新启动 Docker 服务,以便让 Docker 使用新的 Cgroup 驱动程序。

(2)使用 kubectl 工具:

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

9、安装 Pod 网络插件(CNI)

$ kubectl apply –f

https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

确保能够访问到 quay.io 这个 registery。

10、加入 Kubernetes Node

在 192.168.31.62/63(Node)执行

向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:

$ kubeadm join 192.168.31.61:6443 --token esce21.q6hetwm8si29qxwn \

--discovery-token-ca-cert-hashsha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5

11、测试 kubernetes 集群

在 Kubernetes 集群中创建一个 pod,验证是否正常运行:

$ kubectl create deployment nginx --image=nginx

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

$ kubectl get pod,svc

访问地址:http://NodeIP:Port

总结

使用kubeamd方式搭建k8s集群

  • 安装三台虚拟机,安装操作系统centos7.x
  • 对三个安装之后操作系统进行初始化操作
  • 在三个节点安装docker kubelet kubeadm kubectl
  • 在master节点执行kubeadminit命令进行初始化
  • 在node节点上执行kubeadmjoin命令把node节点添加到当前集群里面
  • 配置网络插件

第三章、kubernetes 集群命令行工具

1、kubectl 概述

kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。

2、kubectl 命令的语法

kubectl [command] [TYPE] [NAME] [flags]

(1)comand:指定要对资源执行的操作,例如 create、get、describe 和 delete

(2)TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式。例如:

kubectl get pod pod1

kubectl get pods pod1

kubectl get po pod1

(3)NAME:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源,例如:

kubectl get pods

(4)flags:指定可选的参数。例如,可用-s 或者–server 参数指定 Kubernetes APIserver 的地址和端口。

3、kubectl help 获取更多信息

获取kubectl帮助方法

kubectl --help

4、kubectl 子命令使用分类

(1)基础命令

create     通过文件名或标准输入创建资源

expose   将一个资源公开为一个新的Service

run         在集群中运行个特定的镜像

set          在对象上设置特定的功能

get         显示个或多个资源

explain   文档参考资料

edit        使用默认的编辑器编辑一个资源。

delete    通过文件名、标准输入、资源名称或标签选择器来删除资源。

(2)部署和集群管理命令

部署命令:

rollout 管理资源的发布

rolling-update 对给定的复制控制器滚动更新

scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job

autoscale 创建一个自动选择扩容或缩容并设置Pod数量

集群管理命令:

certificate 修改证书资源

cluster-info 显示集群信息

top 显示资源(CPU/Memory/Storage)使用。需要Heapster运行

cordon 标记节点不可调度

uncordon 标记节点可调度

drain 驱逐节点上的应用,准备下线维护

taint 修改节点taint标记

(3)故障和调试命令

describe     显示特定资源或资源组的详细信息

logs              在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的

attach           附加到一个运行的容器命令

exec              执行命令到容器

port-forward  转发一个或多个本地端口到一个pod

proxy            运行一个proxy到KubernetesAPIserver

cp                 拷贝文件或目录到容器中

auth             检查授权

(4)其他命令

高级命令:

apply     通过文件名或标准输入对资源应用配置

patch     使用补丁修改、更新资源的字段

replace  通过文件名或标准输入替换一个资源

convert  不同的API版本之间转换配置文件

设置命令:

label           更新资源上的标签

annotate     更新资源上的注释

completion 用于实现kubect1工具自动补全

其他命令:

api-versions   打印受支持的API版本

config             修改kubeconfig文件(用于访问API,比如配置认证信息)

help                所有命令帮助

plugin             运行个命令行插件

version           打印客户端和服务版本信息

第四章、kubernetes 集群 YAML 文件详解

1、YAML 文件概述

k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。

2、YAML 文件书写格式

(1)YAML 介绍

YAML :仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。

YAML 是一个可读性高,用来表达数据序列的格式。

(2)YAML 基本语法

  • 使用空格做为缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 低版本缩进时不允许使用 Tab 键,只允许使用空格
  • 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略

(3)YAML 支持的数据结构

对象

键值对的集合,又称为映射(mapping) / 哈希(hashes) / 字典(dictionary)

对象类型:对象的一组键值对,使用冒号结构表示

name:Tom

age:18

Yaml也允许另一种写法,将所有键值对写成一个行内对象

hash:{name:Tom,age:18}

数组:

一组按次序排列的值,又称为序列(sequence) / 列表 (list)

数组类型:一组连词线开头的行,构成一个数组

People

- Tom

- Jack

数组也可以采用行内表示法

People:[Tom,Jack]

纯量(scalars):

单个的、不可再分的值

纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量

数值直接以字面量的形式表示

number:12.30

布尔值用true和false表示

isSet:true

null用~表示

parent:~

时间采用ISO8601格式

iso8601:2001-12-14t21:59:43.10-05:00

日期采用复合iso8601格式的年、月、日表示

date:1976-07-31

YAML允许使用两个感叹号,强制转换数据类型

e:!!str123

f:!!strtrue

字符串默认不使用引号表示

str:这是一行字符串

如果字符串之中包含空格或特殊字符,需要放在引号之中

str:'内容:字符串!'

单引号和双引号都可以使用,双引号不会对特殊字符转义

s1:'内容\n字符串'

s2:"内容\n字符串"

单引号之中如果还有单引号,必须连续使用两个单引号转义

str:'labor''sday'

字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为 空格

str:这是一段

    多行

        字符串

多行字符串可以使用|保留换行符,也可以使用>折叠换行

this:|

Foo

Bar

that

Foo

Bar

3、资源清单描述方法

(1)在 k8s 中,一般使用 YAML 格式的文件来创建符合我们预期期望的 pod,这样的 YAML文件称为资源清单。

(2)常用字段(必须存在的属性)

参数名                          字段类型   说明

version                           String       K8SAPI的版本,目前基本是v1,可以用kubectlapi-version命令查询

kind                                 String      这里指的是yaml文件定义的资源类型和角色,比如:Pod

metadata                         Object     元数据对象,固定值写metadata

metadata.name               String      元数据对象的名字,这里由我们编写,比如命名Pod的名字

metadata.namespace     String      元数据对象的命名空间,由我们自身定义

Spec.                              Object     详细定义对象,固定值写Spec

spec.container[ ]             list           这里是Spec对象的容器列表定义,是个列表

spec.container[ ].name   String      这里定义容器的名字

spec.container[ ].image  String      这里定义要用到的镜像名称


网站公告

今日签到

点亮在社区的每一天
去签到