前言
前面一篇文章简单介绍了一下k8s集群,这篇文章就来搭建一个简单的k8s集群,为后续的实验做准备。
环境准备
在正式的环境中,master节点最少需要2核CPU,4GB内存。node节点需要4核,16GB。
本次通过虚拟机进行搭建,资源可能不满足。
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 << EOF
1 =
1 =
1 =
EOF
sysctl --system
kubeadm部署工具
安装k8s集群有两种方式,一是通过使用kubeadm工具安装,二是通过二进制文件方式安装。
目前kubeadm方式越来越方便完善,因此本次通过kubeadm安装。
kubeadm是Kubernetes社区提供的集群构建工具,它负责构建一个最小化可用集群并执行启动等必要的基本步骤,简单来讲,kubeadm是Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等。
kubeadm专注于在现有基础架构上引导Kubernetes集群启动并执行一系列基本的维护任务,其功能未涉及底层基础环境的构建,仅仅是为集群添加最为要紧的核心附件CoreDNS和kube-proxy。余下的其他附件,例如Kubernetes Dashboard、监控系统和日志系统等必要的附加组件则不在kubeadm考虑范围内,这些附加组件由管理员按需自行部署。
kubeadm的核心使用:
kubeadm init:建新的控制平面节点
kubeadm join:用于将节点快速连接到指定的控制平面
kubeadm token:负责可管理集群构建后节点加入集群时使用的认证令牌,以供新节点基于预共享密钥在首次联系API Server时进行身份认证
kubeadm reset:删除集群构建过程中生成的文件并重置回初始状态
kubeadm拉起一个Kubernetes集群主要需要两个步骤:
先在第一个Master主机上运行kubeadm init命令初始化控制平面,待其完成后,
在其他主机上运行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配置是否成功
安装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 集群,我们使用的很多命令都是通过这个完成的。
配置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=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装 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
# systemctl enable docker && systemctl start docker
设置开机启动,以及开启kubelet服务。
systemctl enable kubelet && systemctl start kubelet
部署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
执行过程中遇到的问题:
排查错误,查看错误日志
journalctl -xeu kubelet | grep error
5月 30 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即可。‘
等待安装完成,执行下面的命令。
查看此时的节点
kubectl get nodes
到此,我们已经完成了安装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 docker
systemctl 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保持一致
然后执行yaml文件
kubectl apply -f kube-flannel.yaml
查看flannel部署结果
kubectl -n kube-system get pods -o wide
修改集群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-proxy
kubectl -n kube-system rollout restart daemonsets.apps kube-flannel-ds
-n为pod节点的namespace,要根据实际情况。
安装好网络插件以后,会出现相应的网卡
至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令,再次进行安装。
总结
本篇文章通过kubeadm搭建了一个k8s集群,现在还没有测试网络以及编排应用,下篇文章会继续总结这方面的内容。
原文始发于微信公众号(信安路漫漫):k8s系列2之安装k8s集群
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论