基于kubeadm方式搭建K8s集群

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

  1. Kubernetes部署

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  #关闭防火墙

  1. 关闭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

  1. 将桥接的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  #让配置生效

  1. 时间同步

  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

  1. 添加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首页即为成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值