1.概述
1.1含义
Kubernetes是一个开源的容器编排和管理平台,用于自动化应用程序的部署、扩展和管理、管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 是一个可移植、可扩展的开源平台,用于Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。Kubernetes集群是由多个物理或虚拟计算机节点组成的集合,这些节点共同协作以运行和管理容器化应用程序。
1.2特点
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
-
自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
1.3Master节点
Kubernetes集群的控制节点,负责整个集群的管理和控制。Master节点包括多个组件,如API服务器、调度器(Scheduler)、控制器管理器(Controller Manager)和etcd(用于存储集群的配置信息)。
1.4Worker节点
也称为Minion节点,是Kubernetes集群中的工作节点,负责运行容器化应用程序。每个Worker节点都有一个称为kubelet的代理程序,它负责与Master节点通信,并管理在该节点上运行的容器。
1.5Pod
Pod是Kubernetes中的最小调度单位,它是一个或多个相关容器的组合。Pod是在Worker节点上运行的,共享相同的网络命名空间和存储卷。Pod提供了容器之间共享网络和资源的机制。
1.6ReplicaSet和Deployment
ReplicaSet是Kubernetes中的一种资源对象,用于定义一组Pod的副本数量。Deployment是对ReplicaSet的高级抽象,提供了应用程序的声明性定义和管理,允许在部署过程中进行滚动更新。
1.7Service
Service是一种Kubernetes资源,定义了一组Pod的稳定访问地址和网络策略。Service提供了在Pod之间进行负载均衡和服务发现的机制,使应用程序能够通过固定的网络终结点进行访问。
1.8kubectl
kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。它允许用户执行各种操作,如创建、管理和监视容器化应用程序、Pod、服务、部署等。kubectl 是与 Kubernetes API 进行通信的主要方式,它提供了丰富的命令和2.2X86架构安装k8s
2.详细步骤
说明:
现在是2023年6月19日,此小节因为kubeket服务启动不起来,暂停修改学习。往各路大佬指明
步骤一:基础环境配置
1.查看系统架构
uname -a
说明:
- 可以看到系统环境为
x86_64
:处理器架构,表示当前系统是基于 64 位的 x86 架构。
2.关闭防火墙或开放必要端口
systemctl stop firewalld # 停止防火墙服务
systemctl disable firewalld # 禁用防火墙服务
说明:结果
查看防火墙状态
systemctl status firewalld
当看到防火墙服务处于未激活状态表示关闭成功
3.关闭Selinux安全模块
sudo sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭,重启后生效
sudo setenforce 0 # 临时关闭,即可生效
说明:结果
查看Selinux状态
getenforce
补充:
SeLinux(Security-Enhanced Linux)是一个安全增强型的 Linux 安全模块,安装k8s时关闭可避免组件访问以及权限问题
4.关闭swap分区
swapoff -a # 临时关闭swap分区
说明:结果
查看Swap分区状态
free -m
- 可看到Swap交换区内存容量已释放
补充:
Swap 分区是用于虚拟内存的一种机制,通过将内存中的数据交换到硬盘上的交换空间来扩展系统的可用内存。安装k8s时关闭,确保节点上的内存是可靠和可预测的,确保集群的稳定性和性能。
5.禁用交换分区(swap partition)的自动挂载
sed -i 's$/dev/mapper/centos-swap$#/dev/mapper/centos-swap$g' /etc/fstab
说明:
替换
/dev/mapper/centos-swap
字符串替换为#/dev/mapper/centos-swap
补充:
sed
: 是一个流编辑器,用于对文本进行处理和转换。-i
: 表示直接在原文件上进行修改,而不是输出到标准输出。's$/dev/mapper/centos-swap$#/dev/mapper/centos-swap$g'
: 这是一个sed
的替换命令。其中,s
表示替换操作的开始,$
是分隔符,用于分隔替换的模式和替换的内容。/dev/mapper/centos-swap
是要被替换的模式,/dev/mapper/centos-swap
是替换后的内容,g
表示替换所有匹配到的内容,而不仅仅是第一个匹配。
6.设置网络桥接的转发规则
sudo bash -c 'cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF'
说明:
- 查看转发规则
补充:
cat > /etc/sysctl.d/k8s.conf
: 使用cat
命令创建一个文件,将输出重定向到/etc/sysctl.d/k8s.conf
文件中。>
符号表示重定向输出。<< EOF
: 这是一个 Here 文档(Here Document)的开始标记,它指示将要输入多行文本。EOF
是结束标记,表示输入结束。
补充:
这些配置参数用于启用 Linux 内核的网络桥接功能,并确保网络流量正确地通过 IPTables 和 IP6Tables 进行处理。这些配置对于在 Kubernetes 集群中使用网络插件(如 Flannel、Calico 等)以及进行网络通信和路由非常重要。通过将这些参数写入到
/etc/sysctl.d/k8s.conf
文件中,可以确保在系统启动时自动加载这些配置,以便正确配置 Linux 内核的网络桥接功能
7.重新加载文件中的内核参数配置
sysctl --system
说明:
通过重新加载内核参数,
sysctl --system
命令使系统能够立即生效新的配置,而无需重新启动。这对于需要调整系统性能、优化网络设置或解决特定问题的情况非常有用。
8.配置Yum源
cat <<EOF > /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.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
说明:
创建一个名为
kubernetes.repo
的仓库文件,配置了阿里云的 Kubernetes 仓库地址,并禁用了 GPG 校验。这样就可以使用 yum 命令从该仓库安装 Kubernetes 相关的软件包。
注意:
若安装系统的架构为Arm架构,则需要更换安装
kubernetes.repo
仓库文件的baseurl为Arm的下载地址。即配置如下cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64 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
补充:
配置镜像源,可查看阿里云仓库地址:kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站 (aliyun.com)
9.更新Yum源
yum -y update
步骤二:安装依赖环境
1.安装环境依赖
yum install -y ebtables socat ipset conntrack
说明:
ebtables
: ebtables 是一个用于以太网桥的过滤器,它允许在 Linux 内核中操作以太网桥的数据包过滤规则。它可以用于控制网络流量、设置网络策略等。socat
: socat 是一个功能强大的网络工具,用于建立各种类型的连接,如 TCP、UDP、UNIX 套接字等。它可以用于端口转发、代理、网络调试等任务。ipset
: ipset 是一个用于管理 IP 地址集合的工具。它允许你创建和操作 IP 地址的集合,提供高效的 IP 地址匹配和过滤功能。ipset 可以用于防火墙配置、访问控制列表等。conntrack
: conntrack 是一个连接跟踪工具,用于在 Linux 内核中跟踪网络连接的状态。它可以用于查看和操作活动连接、连接跟踪表等。conntrack 在网络安全和网络分析中很有用。
补充:
- 这些依赖项在 Kubernetes 集群中提供了必要的功能和工具,用于网络隔离、流量管理、连接跟踪和安全策略的实现。它们对于确保集群的网络性能、安全性和可靠性非常重要。
- 当安装Kubernetes 版本 ≥ 1.18时,建议安装如上依赖项
2.安装时间同步服务
yum install chrony -y # 安装时间同步服务
systemctl enable chronyd.service # 启用时间同步服务
systemctl start chronyd.service # 开启时间同步服务
说明:结果
查看chrony状态
systemctl status chronyd.service
查看 chronyc 源
chronyc sources
所有节点都出现此服务表示成功
说明:
chrony
是一个用于计算机时间同步的工具,它提供了精确的时钟同步和时间调整功能。在安装k8s时安装时间同步服务,切换时区为亚洲、上海,而不是UTC。
3.安装Docker容器服务
3.1查看Docker可安装版本
yum list docker-ce --showduplicates | sort -r
说明:
若提示系统中并没有匹配的软件包可以安装。接下来添加docker源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
再次查看Docker可安装版本
- 若此系统Cpu是X86架构,则会显示x86架构的Docker安装镜像
注意:
- 若此系统Cpu为Arm架构,则会显示Arm架构的Docker安装镜像
3.2更换yum安装docker源
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
3.3安装指定版本的Docker镜像
sudo yum -y install docker-ce-3:20.10
说明:
查看Docker版本
sudo docker version
- 作者这里始终不能下载指定版本,真是奇怪,望网友点评
补充:
安装 Docker 环境在安装 Kubernetes(K8s)时起着关键的作用。Kubernetes 是一个容器编排和管理平台,它依赖于容器运行时来创建和管理容器。而 Docker 是目前最流行的容器运行时之一,提供了一种方便和可靠的方式来创建、打包和运行应用程序容器。
补充:
删除Docker服务
sudo yum remove docker*
使用yum工具删除docker相关文件
3.4配置Docker镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://7mimmp7p.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
说明:
设置 Docker 镜像加速器的作用是加快 Docker 镜像的下载速度。在默认情况下,Docker 从 Docker Hub 下载镜像。
3.5启动Docker
sudo systemctl daemon-reload # 重新加载 Systemd 的配置文件
systemctl enable docker.service # 启用Docker服务
systemctl start docker # 启动Docker服务
说明:
查看Docker服务
systemctl status docker.service
查看Docker镜像加速器配置
docker info|grep "Registry Mirrors" -A 1
4.安装kubelet,kubeadm,kubectl组件
yum install -y kubelet-1.22.12 kubeadm-1.22.12 kubectl-1.22.12 --disableexcludes=kubernetes # 安装 kubelet,kubeadm,kubectl
systemctl enable kubelet # 启用kubelet服务
说明:
查看kubelet服务状态
systemctl status kubelet
此时服务还未启动,属于正常状态,因为我们还并没有将此节点初始化未Master节点,初始化完成后,会自动启动
查看kubeadm,kubectl工具状态
kubeadm version kubectl version
补充:
--disableexcludes=kubernetes
: 这是一个选项,用于禁用任何已配置的软件包排除规则。在此命令中,它确保即使存在其他软件包排除规则,也会安装指定版本的 kubelet、kubeadm 和 kubectl。- 搭建一个完整的 Kubernetes 环境,并使用 kubectl 命令管理和操作集群中的资源。kubelet 负责在每个节点上运行和监控容器,而 kubeadm 则简化了集群的初始化过程。这些组件一起提供了创建、部署和管理容器化应用程序的基础设施。
步骤三:各节点配置
1.设置各个节点中网络主机名
1.1设置Master节点名称
hostnamectl set-hostname k8s-master
说明:
验证查看
ping k8s-master
可通过ping网络中的主机名进行ping通即可
hostnamectl set-hostname xxx
是一个用于设置主机名的命令。
补充:
主机名是标识网络中计算机的名称,用于识别和区分不同的设备或节点。设置正确的主机名对于网络管理、系统识别和通信非常重要。
1.2设置node节点名称
hostnamectl set-hostname node1
说明:
验证查看
可通过ping网络中的主机名进行ping通即可
补充:
设置各个工作节点的网络名称未node1,若有其余的工作节点可将名称新增为node2、node3……,有规律便于管理
2.设置各个节点中主机名与IP映射关系
2.1查看Master主机ip
ip a
说明:
注意:
再次提醒,各个Master节点和工作节点需要处于同一个网段,以便建立通信
2.2添加主机名与IP的映射关系
echo "10.13.167.102 k8s-master" >> /etc/hosts
说明:
此操作需要在所有节点都执行,包括Master节点和工作节点。让局域网内的主机能够通过主机名就直接互相的通信交流
验证:在工作节点中进行Ping主机名,能够互通
- 此项设置需要在Master结点和工作结点都执行
补充:
/etc/hosts 是一个包含主机名与 IP 地址映射关系的系统文件。
3.初始化Master节点
kubeadm init \
--apiserver-advertise-address=10.13.167.102 \
--control-plane-endpoint=k8s-master \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=1.22.12 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=192.168.0.0/16 \
--ignore-preflight-errors=ALL
注意:
- 指定主节点IP和Service CIDR以及Pod Network CIDR的IP地址段不能重复,否则可能会造成IP地址冲突
- 记得需要修改
--apiserver-advertise-address
参数的节点地址为Master节点地址
说明:参数解释
--apiserver-advertise-address=10.13.166.254
:指定主节点上的 Kubernetes API Server 应该使用的 IP 地址。这个地址将被公告给集群中的其他节点,使它们能够与 API Server 进行通信。--control-plane-endpoint=k8s-master
:指定控制平面的终结点名称,即主节点的名称。这个名称将被用于组成控制平面的服务地址,其他节点将使用该地址连接到主节点。--image-repository registry.aliyuncs.com/google_containers
:指定容器镜像的仓库地址,这里使用阿里云的镜像仓库地址,而不使用默认的官网k8s.grc.io下载所需镜像。--kubernetes-version v1.20.0
:指定 Kubernetes 的版本为 v1.20.0。--service-cidr=10.1.0.0/16
:指定 Kubernetes 服务的 IP 地址段,即 Service CIDR。这个地址段用于分配给 Kubernetes 服务,包括 Service IP 和 Cluster IP。--pod-network-cidr=172.168.0.0/16
:指定 Pod 网络的 IP 地址段,即 Pod Network CIDR。这个地址段用于分配给 Pod 网络,即容器之间的通信。
说明:结果
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join k8s-master:6443 --token 2tcfgf.lccq14bz1ysql7fu \ --discovery-token-ca-cert-hash sha256:9a3f30056dc2e12a52d8bc71fdc07d1204c40503223d657708ae184b963934f4 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join k8s-master:6443 --token 2tcfgf.lccq14bz1ysql7fu \ --discovery-token-ca-cert-hash sha256:9a3f30056dc2e12a52d8bc71fdc07d1204c40503223d657708ae184b963934f4
- 记录关键信息,便于Master节点初始化集群操作,便于工作节点加入集群使用
补充:取消初始化(若需要取消初始化Master的操作,此步骤可选)
sudo kubeadm reset # 重置 Kubernetes 集群,清除所有相关配置和数据 rm -rf $HOME/.kube # 删除当前用户的 .kube 目录,其中存储了 Kubernetes 相关的配置文件 rm -rf /var/lib/cni/ # 删除 CNI 插件的数据目录 rm -rf /etc/cni/ # 删除 CNI 插件的配置目录 ifconfig cni0 down # 关闭 cni0 网络接口 ip link delete cni0 # 删除 cni0 网络接口
- CNI 是 Kubernetes 中用于容器网络管理的一种标准化接口
4.设置Master节点Kubectl环境
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
说明:
设置环境变量
KUBECONFIG
的值为/etc/kubernetes/admin.conf
可以简化使用kubectl
命令时的配置文件路径的指定,使得在终端中直接执行kubectl
命令更加方便和简洁。
5.安装Master节点网络插件
5.1下载网络插件
curl -O https://docs.tigera.io/archive/v3.22/manifests/calico.yaml
curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5.2修改网络插件Ip(若地址如下,则为默认,无需修改)
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
说明:
- 修改
CALICO_IPV4POOL_CIDR
,此处的IP需要和Pod的ip地址段相同,如此才能保证各个Pod之间的通信
5.4修改网络插件的下载源
sed -i 's#docker.io/##g' calico.yaml
说明:
查看网络插件的下载镜像源
cat kube-flannel.yaml |grep 'image:'
5.3安装calico插件到k8s
kubectl apply -f calico.yaml
说明:
查看Master节点中所有Pod节点状态
kubectl get pod -A
查看Pod详细日志
kubectl describe pod calico-node-6rwsp -n kube-system
补充:
删除calico插件
kubectl delete -f kube-flannel.yaml
补充:
下载 Calico 网络插件的配置文件 calico.yaml,并将其中定义的资源应用到 Kubernetes 集群中。这样,Calico 网络插件将被部署和配置在集群中,用于提供网络功能,例如网络策略、路由、IP 地址分配等。
步骤四:删除Kubernetes
1.停止相关服务
systemctl stop kubelet
systemctl stop etcd
systemctl stop docker
2.卸载k8s
kubeadm reset -f
3.删除k8s相关目录
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
4.卸载k8s相关程序
yum remove kubeadm kubelet
yum erase -y kubelet kubectl kubeadm kubernetes-cni
yum -y remove kube*
5.更新镜像
yum clean all
yum -y update
yum makecache
参考资料
k8s官网:Kubernetes 文档 | Kubernetes
KubeSphere官网:产品介绍 (kubesphere.io)
补充资料
docker-ce
“docker-ce” 是 Docker Community Edition 的缩写,它是 Docker 社区版的意思。
Docker 是一个开源的容器化平台,它允许开发人员将应用程序及其所有依赖项打包成一个可移植的容器,然后在任何支持 Docker 的环境中运行。Docker Community Edition 是 Docker 公开发布的免费版本,适用于个人和小型团队使用。
Docker Community Edition 提供了一套完整的工具和功能,包括 Docker 引擎(用于创建和管理容器)、Docker Compose(用于定义和管理多个容器的应用程序)、Docker Swarm(用于在多个主机上部署和管理容器集群)等。它为开发者和运维人员提供了简单、高效和可移植的容器化解决方案,方便应用程序的开发、测试和部署。
需要注意的是,Docker 社区版也有一个企业版(Docker Enterprise Edition),它是针对企业级用户提供的高级版本,提供了更多的企业级功能和支持服务。
日志
failed to create container
Warning FailedCreatePodContainer 3s (x9 over 107s) kubelet
unable to ensure pod container exists: failed to create container for
[kubepods burstable podeb31145b-1718-4258-8eed-4c1af8f3e04b] :
mkdir /sys/fs/cgroup/memory/kubepods/burstable/podeb31145b-1718-4258-8eed-4c1af8f3e04b:
cannot allocate memory
说明:
增大主机内存