k8s系列2之安装k8s集群

admin 2024年5月31日10:57:15评论6 views字数 6921阅读23分4秒阅读模式

前言

前面一篇文章简单介绍了一下k8s集群,这篇文章就来搭建一个简单的k8s集群,为后续的实验做准备。

环境准备

在正式的环境中,master节点最少需要2核CPU,4GB内存。node节点需要4核,16GB。

k8s系列2之安装k8s集群

本次通过虚拟机进行搭建,资源可能不满足。

master节点:192.168.56.101   4G内存  centos7

node01节点:192.168.56.102  6G内存 centos7

node02节点: 192.168.56.103 6G内存 centos7

1)关闭防火墙

systemctl stop firewalld && systemctl disable firewalld && iptables -F

2)禁用SELinux

setenforce 0   临时生效sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

3)关闭swap分区

swapoff -a   临时关闭sed -ri 's/.*swap.*/#&/' /etc/fstab     永久关闭swap

4)修改内核参数

kube-proxy有两种模式:ip_vs或者iptables。ip_vs需要高版本的linux内核,因此本次3.10的内核采用iptables的方式。

cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOFsysctl --system

kubeadm部署工具

安装k8s集群有两种方式,一是通过使用kubeadm工具安装,二是通过二进制文件方式安装。

目前kubeadm方式越来越方便完善,因此本次通过kubeadm安装。

kubeadm是Kubernetes社区提供的集群构建工具,它负责构建一个最小化可用集群并执行启动等必要的基本步骤,简单来讲,kubeadm是Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等。

kubeadm专注于在现有基础架构上引导Kubernetes集群启动并执行一系列基本的维护任务,其功能未涉及底层基础环境的构建,仅仅是为集群添加最为要紧的核心附件CoreDNS和kube-proxy。余下的其他附件,例如Kubernetes Dashboard、监控系统和日志系统等必要的附加组件则不在kubeadm考虑范围内,这些附加组件由管理员按需自行部署。

k8s系列2之安装k8s集群

kubeadm的核心使用:

kubeadm init:建新的控制平面节点

kubeadm join:用于将节点快速连接到指定的控制平面

kubeadm token:负责可管理集群构建后节点加入集群时使用的认证令牌,以供新节点基于预共享密钥在首次联系API Server时进行身份认证

kubeadm reset:删除集群构建过程中生成的文件并重置回初始状态

kubeadm拉起一个Kubernetes集群主要需要两个步骤:

先在第一个Master主机上运行kubeadm init命令初始化控制平面,待其完成后,

k8s系列2之安装k8s集群

在其他主机上运行kubeadm join命令逐一加入控制平面,进而成为集群成员。

使用kubeadm工具快速安装Kubernetes集群

使用k8s首先需要容器,目前常用的容器有:Docker、Containerd、CRI-O和frakti。在实际情况中我们经常遇到的就是Docker,本次也是通过Docker来进行说明。

安装docker容器

通过yum的方式安装,首先需要配置yun源

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

安装docker

yum install docker-ce docker-ce-cli -y

编辑docker配置文件

编辑/etc/docker/daemon.json,添加国内镜像,或者修改docker存储位置。

{"data-root":"docker存储位置""registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"}

启动docker服务

systemctl daemon-reload && systemctl enable docker && systemctl start docker

通过docker info查看docker配置是否成功

k8s系列2之安装k8s集群

安装kubeadm,kubelet以及kubectl

先来说一下,这三个都是什么

kubeadm:kubeadm是一个致力于简化集群的安装过程,并解决Kubernetes集群的高可用问题的命令行工具。

kubelet:Kubelet 是 kubernetes 工作节点上的一个代理组件,运行在每个节点上。用来处理Master节点下发到本节点的任务,管理Pod和其中的容器。kubelet会在API Server上注册节点信息,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源。可以把kubelet理解成【Server-Agent】架构中的agent,是Node上的pod管家。

kubectl:是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes 集群,我们使用的很多命令都是通过这个完成的。

k8s系列2之安装k8s集群

配置yum源

首先配置yum源,官方yum源的地址为https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。如果无法访问官方yum源的地址,则也可以使用国内的一个yum源,地址为http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/,yum源的配置文件/etc/yum.repos.d/kubernetes.repo的内容如下:

cat > /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF

安装 kubelet  kubeadm  kubectl

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

需要指定版本可以运行下面的命令

yum install -y kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8

k8s系列2之安装k8s集群

       # systemctl enable docker && systemctl start docker

设置开机启动,以及开启kubelet服务。

systemctl enable kubelet && systemctl start kubelet

k8s系列2之安装k8s集群

部署Kuberneter Master节点

接下来就可以部署master节点了

安装的时候,可以通过配置文件的方式或者命令行的方式设置一些需要的参数。

配置文件可以通过下面的命令生成默认的配置,在进行修改

kubeadm config print init-defaults > init.default.yaml

如下面为一个简单的配置文件

apiVersion: kubeadm.k8s.io/v1        kind: ClusterConfiguration        imageRepository: docker.io/dustise        kubernetesVersion: v1.18.0          podSubnet: "192.168.0.0/16"

imageRepository:指定镜像仓库地址,默认为k8s.gcr.io国内无法访问

podSubnet:指定pod节点网络

kubernetesVersion:指定安装版本,注意要和上面安装kubelet的一致。

# kubeadm config images pull --config=init-config.yaml

至此,准备工作已就绪,执行kubeadm init命令即可一键安装Kubernetes的Master。

kubeadm init --config=init-config.yaml

如果不想去写配置文件也可以直接执行kubeadm init命令安装既可,如下

kubeadm init   --kubernetes-version 1.18.8   --apiserver-advertise-address=0.0.0.0   --service-cidr=10.96.0.0/16   --pod-network-cidr=10.245.0.0/16   --image-repository registry.aliyuncs.com/google_containers

执行过程中遇到的问题:

k8s系列2之安装k8s集群

排查错误,查看错误日志

journalctl -xeu kubelet | grep error530 14:18:03 master.local kubelet[22235]: E0530 14:18:03.211582   22235 pod_workers.go:1300] "Error syncing pod, skipping" err="failed to "CreatePodSandbox" for "kube-scheduler-master.local_kube-system(7e9a7f3465e66461d7a7f130301da541)" with CreatePodSandboxError: "Failed to create sandbox for pod "kube-scheduler-master.local_kube-system(7e9a7f3465e66461d7a7f130301da541)": rpc error: code = DeadlineExceeded desc = failed to get sandbox image "registry.k8s.io/pause:3.6": failed to pull image "registry.k8s.io/pause:3.6": failed to pull and unpack image "registry.k8s.io/pause:3.6": failed to resolve reference "registry.k8s.io/pause:3.6": failed to do request: Head "https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/pause/manifests/3.6": dial tcp 74.125.204.82:443: i/o timeout"" pod="kube-system/kube-scheduler-master.local" podUID="7e9a7f3465e66461d7a7f130301da541"

可以看到是拉取镜像的时候出错了,这个是CRI containerd 报的错,所以改docker的镜像地址不管用,需要修改/etc/containerd/config.toml文件。

我们可以先生成一个默认的配置文件

containerd config default > /etc/containerd/config.toml

然后将默认的镜像地址换成aliyun的

sed -i 's/registry.k8s.io/pause:3.6/registry.aliyuncs.com/google_containers/pause:3.9/g' /etc/containerd/config.toml

让配置生效

systemctl daemon-reload && systemctl restart containerd

从新执行kuneadm init即可。‘

k8s系列2之安装k8s集群

等待安装完成,执行下面的命令。

k8s系列2之安装k8s集群

查看此时的节点

kubectl get nodes

k8s系列2之安装k8s集群

到此,我们已经完成了安装master。但是现在还存在两个问题:

1)没有可用的节点

2)缺乏对容器网络的配置。kubeadm的安装过程不涉及网络插件(CNI)的初始化,因此kubeadm初步安装完成的集群不具备网络功能,任何Pod包括自带的CoreDNS都无法正常工作。

安装Node,加入集群

安装node也需要先配置环境,关闭防火墙等操作,跟master一样,这里不再说。同样也需要安装docker,以及kubeadm工具。

接下来安装kubeadm工具:

yum install kubelet kubeadm --disableexcludes=kubernetes

运行下面的命令启动Docker服务与kubelet服务,并将其设置为开机自启动:

前提已经安装过docker

systemctl enable docker && systemctl start dockersystemctl enable kubelet && systemctl start kubelet

将Node加入集群

该命令就是master安装完成以后出现的,token有时间限制,如果超过时间,需要重新生成

kubeadm join 10.211.55.30:6443--token ah9koe.nvuvz2v60iam0e0d             --discovery-token-ca-cert-hash    sha256:9ded80601bc7f5568a9a7ece7ee13fd73be193777641054420a080f778b330fc

重新生成节点加入命令

kubeadm token create --print-join-command

显示节点加入命令

kubeadm token list

安装网络插件

执行kubectl get nodes命令,会发现Kubernetes提示Master为NotReady状态,这是因为还没有安装CNI网络插件

对于CNI网络插件,可以有许多选择,如flannel,weave等。

下面安装flannel

从官网下载yml

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

更改网络配置,要和 pod-network-cidr保持一致

k8s系列2之安装k8s集群

然后执行yaml文件

kubectl apply -f kube-flannel.yaml

查看flannel部署结果

kubectl -n kube-system get pods -o wide

k8s系列2之安装k8s集群

修改集群kube-proxy的模式为iptables

由于 k8s 1.18对内核版本要求比较高,3.10的内核部署1.18.8使用ipvs模式会存在coredns无法解析等问题。股在此采用iptables模式。如果你服务内核4+起,则采用iptables 和ipvs均可。

kubectl get cm kube-proxy -n kube-system -o yaml | sed 's/mode: ""/mode: "iptables"/' | kubectl apply -f -kubectl -n kube-system rollout restart  daemonsets.apps  kube-proxykubectl -n kube-system rollout restart  daemonsets.apps  kube-flannel-ds

-n为pod节点的namespace,要根据实际情况。

安装好网络插件以后,会出现相应的网卡

k8s系列2之安装k8s集群

至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令,再次进行安装。

总结

本篇文章通过kubeadm搭建了一个k8s集群,现在还没有测试网络以及编排应用,下篇文章会继续总结这方面的内容。

原文始发于微信公众号(信安路漫漫):k8s系列2之安装k8s集群

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月31日10:57:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   k8s系列2之安装k8s集群https://cn-sec.com/archives/2798403.html

发表评论

匿名网友 填写信息