基于kubeadm方式搭建K8s集群
在 Kubernetes 中,Pause 容器是一种特殊类型的容器,它的主要作用是充当依赖其他容器的容器,为其他容器提供一个可靠的、隔离的运行环境。Kubernetes Service通过虚拟IP地址或者节点端口为用户应用提供访问入口,然而这些IP地址和端口是动态分配的,如果用户重建一个服务,其分配的clusterIP和nodePort或者LoadBalancerIP都是会变化的,实际项目中无法把
k8S,全称 Kubernetes,是一个用于管理容器的开源平台。它可以让用户更加方便地部署、扩展和管理容器化应用程序,并通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。
具体来说,Kubernetes 可以将应用程序打包成容器,并将这些容器部署到一个集群中,然后自动处理容器的生命周期管理、自动扩容等操作,让用户更加专注于应用程序的开发和业务逻辑。同时,Kubernetes 还提供了一系列的资源管理机制,如资源调度、容器网络、存储编排等,控制整个容器集群的运行状态,并保证应用程序在容器集群中的高可用性和可靠性。
总之,Kubernetes 提供了一种优秀的容器化应用程序管理解决方案,可以让用户更加轻松地部署、扩展和管理容器化应用程序,提高应用程序的可靠性和稳定性。
1. 部署环境
(1)安装要求
- 一台或者多台虚拟机,操作系统CentOS7.x-86_64或者更高版本;
- 硬件配置:2GB或者更多RAM,2个CPU或者更多CPU,硬盘30G+;
- 可以访问外网,以便拉取镜像,如果服务器不能上网,需提前下载镜
并导入到节点; - 禁用swap分区
(2)环境规划
角色 | IP |
master | 192.168.1.99 |
node | 192.168.1.89 |
node | 192.168.1.90 |
2.1、 服务介绍cube-appraiser、kube-proxy、kube-scheduler、kube-controller-manager、etcd、coredns、pause
2.1.1 kube-apiserver
apiserver 是 Kubernetes 集群的网关。它是 Kubernetes 集群中的所有用户、自动化和组件都可以访问的中心接触点。API Server通过 HTTP 实现 RESTful API,执行所有 API 操作,并负责将 API 对象存储到持 久存储后端。
2.1.2 kube-proxy
kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服务,从 apiserver获取所有server信息,并根据server信息创建代理服务,实现server到Pod 的请求路由和转发,从而实现K8s层级的虚拟转发网络。
kube-proxy 有三种模式:userspace、iptables 和 IPVS,其中 userspace 模式不太常用。iptables 模式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题。为解决 iptables 模式的性能问题,v1.11 新增了 IPVS 模式(v1.8 开始支持测试版,并在 v1.11 GA),采用增量式更新,并可以保证 service 更新期间连接保持不断开。
2.1.3 kube-scheduler
kube-scheduler 是 Kubernetes 集群的核心组件之一,负责将新创建的 Pod 分配到合适的节点上。它根据一系列规则和策略,确保集群资源的最佳利用和应用的高效运行。
2.1.4 kube-controller-manager
Controler Manager负责集群内的Node、Pod副本、服务端点(Endpoint)、命令空间(Namespace)、服务帐号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controler Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
2.1.5 etcd
k8s中所有对象的manifest都需要保存到某个地方,这样他们的manifest在api server重启和失败的时候才不会丢失,因此引入了etcd。在k8s中只有api server和etcd直接交互,其它组件都通过api server间接和etcd交互。
2.1.6 coredns
Kubernetes Service通过虚拟IP地址或者节点端口为用户应用提供访问入口,然而这些IP地址和端口是动态分配的,如果用户重建一个服务,其分配的clusterIP和nodePort或者LoadBalancerIP都是会变化的,实际项目中无法把一个可变的入口发布出去供用户访问。为了解决这个问题,Kubernetes提供了内置的域名服务,用户定义的服务会自动获取域名,通过域名解析,可以对外向用户提供一个固定的服务访问地址。CoreDNS包含一个内存态DNS,以及其他controller类似的控制器。CoreDNS的实现原理是控制器监听Service和Endpoint的变化并配置DNS,客户端Pod在进行域名解析时,从CoreDNS中查询服务对应的地址记录。
2.1.7 pause
在 Kubernetes 中,Pause 容器是一种特殊类型的容器,它的主要作用是充当依赖其他容器的容器,为其他容器提供一个可靠的、隔离的运行环境。 Pause 容器是一种轻量级的容器,它本身不包含任何业务逻辑,只是为其他容器提供一个稳定、可靠的运行环境。Pause 容器的实现基于 Docker 的 pause 镜像,可以在创建其他容器之前将其加载到 Pod 中,以确保 Pod 中的其他容器在 Pause 容器的基础上运行。Pause 容器的主要作用是为其他容器提供生命周期的隔离和协调。它可以帮助管理员确保 Pod 中各个容器的启动顺序和依赖关系,避免容器之间的相互干扰和冲突。同时,Pause 容器还可以为 Pod 中的容器提供一个稳定的网络环境,确保容器的网络连接可靠性。
2.2、kubeadm部署
kubeadm是官方社区推出的一个用于快速部署kubernates集群工具,该工具通过两条命令即可完成一个kubernetes集群的部署:
(1)创建一个Master节点 kubeadm init
(2)将Node节点加入到当前集群中 $kubeadm join <Master节点的IP和端口>,详细步骤如下:
2.2.1、虚拟机系统配置
(1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld #关闭防火墙
- 关闭selinux
setenforce 0 #临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
(3)关闭swap
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
#辅助命令 sfdisk -l 显示分区信息
(4)设置主机名称和hosts配置
hostnamectl set-hostname k8s-master01 && bash
hostnamectl set-hostname k8s-node1 && bash
hostnamectl set-hostname k8s-node2 && bash
并在master节点添加hosts
cat >> /etc/hosts << EOF
192.168.1.99 k8s-master01
192.168.1.89 k8s-node1
192.168.1.90 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 #校时服务器,可是其他服务器
#辅助命令:date 查看系统时间
2.2.2、在所有节点安装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-20.10.23
systemctl enable docker && systemctl start docker
#辅助命令:docker -v 查看docker版本
#配置镜像仓库地址
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}
EOF
systemctl daemon-reload && systemctl restart docker
- 添加k8s的yum软件源(此处选择阿里云)
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
(3)安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.20 kubeadm-1.18.20 kubectl-1.18.20
systemctl enable kubelet
#辅助命令: kubelet version kubeadm version kubectl version 查看(4) 部署Kubernetes Master节点
#apiserver-advertise-address 对应本机ip地址
#cidr 和当前网段不冲突即可
kubeadm init \
--apiserver-advertise-address=192.168.1.99 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.20 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
master部署成功输出如下:
注意:执行成功后的kubeadm join命令,拷贝到Node节点执行;
使用kubectl命令工具,在master节点按顺序执行如下命令:
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 #查看k8s集群节点
查看k8s集群节点,显示如下
(5)加入Kubernetes Node节点
在(Node)执行
向集群添加新节点,执行在kubeadm init成功输出的kubeadm join命令
kubeadm join 192.168.1.99:6443 --token zqwxb6.mz0is4mecrlmp2f8 \
--discovery-token-ca-cert-hash sha256:192adc1bdb5fbd3949ee8e24d5bfeb43922d012a47765943e61264de1c454e94
执行命令成功输出如下
(6)部署CNI网络插件
为了要让 Kubernetes Cluster 能够正常工作,必须安装 Pod 网络,否则 Pod 之间无法通信。Kubernetes 支持多种网络方案,这里我们使用 flannel,在Master节点执行即可
wget kube-flannel.yml
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system #检查 Pod 的状态,可能存在ImagePullError(镜像拉取失败)
再次查看k8s集群节点,显示如下
如果节点不是 Ready 则 所有节点操作
wget cni-plugins-linux-amd64-v0.8.6.tgz 下载后通过上传到Linux /home目录解压
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
复制 flannel 到 /opt/cni/bin/
cp flannel /opt/cni/bin/
kubectl get pods -n kube-system
验证集群可用性
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
nginx 安装根据服务器网络性能而定如果显示 不为Running 状态需要等待一段时间再次查询查看结果,如果一直不为Running需要具体问题排查
如命令:kubectl describe pod nginx-f89759699-s59z7
验证集群是否部署成功
http://192.168.1.99:31175/ 所有 http://<IP>:31175 能访问到nginx首页即为成功
更多推荐
所有评论(0)