国内环境下,CentOS7部署k8s集群
CentOS7虚拟机部署k8s集群
提示:1、此文默认已安装VMWare和CentOS7。
2、在安装之前,对Linux系统的命令比较熟悉。
2、虚拟机环境是:2CPU,内存不小于20GB。
3、此文选择使用两个节点,多个节点的类似于k8s-worker节点的做法。
环境选择
- 虚拟机:VMWare Workstation 16
- 两个虚拟机:CentOS-7-x86_64
前置准备
- 以管理员身份登录虚拟机。
- 禁用SELinux:
- 临时禁用:setenforce 0 (这只是暂时禁用,下次重启还会启动)
- 永久禁用:修改/etc/selinux/config文件,将SELINUX=enforcing修改为SELINUX=permissive。
//永久禁用
vim /etc/selinux/config
//文件修改后的内容(此处需要对vim命令有一定了解)
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
- 禁用防火墙
# systemctl disable fireable && systemctl stop fireable
- 禁用交换分区
//如果使用了交换分区则无法启动kubelet,因此必须禁用(k8s不支持swap分区)
##临时关闭
$ swapoff -a
##查看swap是否关闭
$ free
##永久关闭:编辑/etc/fstab将swap那一行注释掉
vim /etc/fstab
//文件修改后的内容
UUID=17fcafd2-630d-4277-8d2a-cbe165051b2e /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
- 将桥接的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
- 为主机配置名称解析
//查看主节点和工作节点的IP地址
ifconfig | grep inet
//修改主机的名称
hostnamectl --static set-hostname k8s-master(主节点)
hostnamectl --static set-hostname k8s-worker(工作节点)
//将IP地址和名称添加到/etc/hosts 文件下(每一台主机都要添加)
vim /etc/hosts
//以下是添加的内容
192.168.243.134 k8s-master
192.168.243.133 k8s-worker
安装环节
- 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
如果想要安装指定版本的docker,首先查看可安装的版本
yum list --showduplicates | grep docker
安装指定的版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 修改docker镜像
默认情况下拉取镜像回到docker官网,在国内不适应,因此我们采用阿里云镜像
阿里云镜像源直接去阿里云官网https://www.aliyun.com/获得即可。
//创建目录/etc/docker
mkdir /etc/docker
//在/etc/docker目录下创建文件daemon.json
touch /etc/docker/daemon.json
//修改镜像源(使用自己获得的阿里镜像源)
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
-
设置开机启动
$ systemctl enable docker $ systemctl start docker
-
查看自己安装的docker版本
$ docker --version
-
安装kubelet、kubeadm、kubectl、kubernetes-cni
- 在安装之前,首先在yum仓库中添加kubernetes
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
注意:拉取的镜像要是国内的,如果从kubernetes官网则对于国内网络不可成功
- 正式安装kubelet、kubeadm、kubectl、kubernetes-cni
//指定版本,不然默认最新版,可能会和自己的虚拟机版本不相匹配,没办法使用kubelet
# yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3
# systemctl enable kubelet
可能会出现的错误
1)遇到kubernetes-cni的问题,需要手动设置kubernetes-cni的版本
yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0
2)出现下面的问题
错误:软件包:kubelet-1.13.3-0.x86_64 (kubernetes)
需要:kubernetes-cni = 0.6.0
可用: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes)
kubernetes-cni = 0.3.0.1-0.07a8a2
可用: kubernetes-cni-0.5.1-0.x86_64 (kubernetes)
kubernetes-cni = 0.5.1-0
可用: kubernetes-cni-0.5.1-1.x86_64 (kubernetes)
kubernetes-cni = 0.5.1-1
可用: kubernetes-cni-0.6.0-0.x86_64 (kubernetes)
kubernetes-cni = 0.6.0-0
正在安装: kubernetes-cni-0.7.5-0.x86_64 (kubernetes)
kubernetes-cni = 0.7.5-0
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest
可以使用kubectl clean all
来清除以前安装的,再重新直接安装(一般如果安装上面的版本安装的话,是不会出现上面的问题的)
3)使用yum安装程序时,提示xxx.rpm公钥尚未安装
使用 yum install xxx.rpm --nogpgcheck 命令格式跳过公钥检查,如下:
yum install cri-tools-1.12.0-0.x86_64 --nogpgcheck
yum install kubectl-1.14.1-0.x86_64 --nogpgcheck
yum install kubeadm-1.14.1-0.x86_64 --nogpgcheck
这一块很容易出错,可能安装的时候没有问题,但是后面kubeadm join时可能会出现问题,因此一定要安装上面的版本来进行安装,亲测可用,出错的话,就用上面的那几条命令来解决就可。
-
启动kubectl
systemctl enable kubelet
部署master节点
- 初始化kubeadm
sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers
待出现以下信息时,则部署成功:
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
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.***.***:6443 --token 6u7syg.8opcbarnen34wks0 \
--discovery-token-ca-cert-hash sha256:37904294a91a207d11c4e824748f8d1abd3d4add7879a0c0857c917dcaeda7eb
- 如果需要让 kubectl 和部署的集群进行沟通,需要让 kubectl 使用上一步生成的配置文件
/etc/kubernetes/admin.conf
,这里直接复制上面生成的代码即可。
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
查看节点状态
[17:42] k8s-master | kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 9m45s v1.19.2
-
kubectl get po -n kube-system
: 列出 Control Plane 中的 pods。-n 表示这些 pods 在 kube-system namespace 中。
NAME READY STATUS RESTARTS AGE
coredns-6d56c8448f-sz8tb 0/1 Pending 0 67m
coredns-6d56c8448f-wgjnm 0/1 Pending 0 67m
etcd-k8s-master 1/1 Running 0 67m
kube-apiserver-k8s-master 1/1 Running 0 67m
kube-controller-manager-k8s-master 1/1 Running 0 67m
kube-proxy-t54fr 1/1 Running 0 67m
kube-proxy-tgbx5 1/1 Running 0 116s
kube-scheduler-k8s-master 1/1 Running 0 67m
weave-net-9hc6t 0/2 ContainerCreating 0 28s
weave-net-ptwm8 0/2 ContainerCreating 0 28s
- 安装CNI插件,让集群中的不同节点直接交流
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
查看节点的状态kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 38s v1.19.3
配置工作节点
- 使用上述
kubeadm init
得到的kubeadm join
直接进行操作,j将工作节点添加到主节点上,得到如下,则操作成功。
//kubeadm join操作
kubeadm join 192.168.***.***:6443 --token 6u7syg.8opcbarnen34wks0 \
--discovery-token-ca-cert-hash sha256:37904294a91a207d11c4e824748f8d1abd3d4add7879a0c0857c917dcaeda7eb
//输出结果
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
至此,k8s集群的配置就完成了,可以通过kubectl get nodes
查看节点状态,通过kubectl get po -n kube-system
列出pod的状态。
$kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 69m v1.19.3
k8s-worker Ready <none> 3m45s v1.19.3
$kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6d56c8448f-sz8tb 1/1 Running 0 72m
coredns-6d56c8448f-wgjnm 1/1 Running 0 72m
etcd-k8s-master 1/1 Running 0 72m
kube-apiserver-k8s-master 1/1 Running 0 72m
kube-controller-manager-k8s-master 1/1 Running 0 72m
kube-proxy-t54fr 1/1 Running 0 72m
kube-proxy-tgbx5 1/1 Running 0 7m44s
kube-scheduler-k8s-master 1/1 Running 0 72m
weave-net-9hc6t 2/2 Running 0 6m16s
weave-net-ptwm8 2/2 Running 0 6m16s
注意:kubeadm reset 可以重置kubeadm init和kubeadm join
出现的问题
-
在前置准备阶段应该是没有什末大的问题,出现了直接搜索就可以解决了。
-
前置阶段,安装kubelet、kubeadm、kubectl、kubernetes-cni的时候一定要注意上述提到的几个问题,基本上都可以解决,如果解决不了的话,就
kubectl clean all
重新安装就行。-
这一块虽然没什莫大的问题,但是如果版本出现问题的话,可能会使后面的kubeadm join出现问题。
[ERROR KubeletVersion]:kubelet版本高于控制平面版本([ERROR KubeletVersion]: the kubelet version is higher than the control plane version)
出现这个问题,我也没办法,我也弄了好几遍,就是前面版本的问题太高了,得改一下,改的时候就按照上面的版本应该不会出错。
-
-
安装阶段
-
kubeactl init
没有问题,但是kubectl reset
完成之后,执行其他的命令都会出现如下错误:Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” while trying to verify candidate authority certificate “kubernetes”)
原意是啥呢?就是因为他咋reset的时候根本没有删除干净,老是出错,老是出错,老是出错(重要的事情讲三遍!!!)))怎么改呢?删除整个新建的$HOME/.kube目录就可以了执行
rm -rf $HOME/.kube
,但是执行完之后,你再kubeadm reset
一遍,还是会说这个目录没清干净,但是查看又查看不到,不过不影响再一次kubeadm init
。 -
kubectl join
时出现[ERROR KubeletVersion]:kubelet版本高于控制平面版本([ERROR KubeletVersion]: the kubelet version is higher than the control plane version)
对,就是前面2出现的问题,这个地方真的是就是得在回去重新安装kubectl了。然后再进行那个操作就可以了。
-
kubectl join时出现
[discovery] Failed to request cluster info, will try again: [Get https://192.168.243.134:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: dial tcp 192.168.243.134:6443: connect: no route to host]
就是这个地的问题
connect: no route to host
:原因有三(① 访问的域名确实不通,这一般在这是不存在的;② 本机自己开了防火墙,真的有可能是这一个,回去自己检查检查自己防火墙是不是开了,可设为开机立刻禁用防火墙:systemstl disable firewalld && systemctl stop firewalld;③ 没有配置/etc/hosts文件内的内容,这一个也有可能会忘记的,回去检查一下。) -
kubectl join时出现
unable to fetch the kubeadm-config ConfigMap: failed to decode cluster configuration data: no kind "ClusterConfiguration" is registered for version "kubeadm.k8s.io/v1beta2" in scheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme/scheme.go:31"
这一个问题就是执行 join 的 kubeadm 版本与执行 init 的 kubeadm 版本不匹配,升级 kubeadm 版本。查看kubeadm的版本的终端命令是
yum list --showduplicates | grep kubeadm
,而且kubeadm进行版本的升级不能调级升级,例如,只能是1.12.#升级到1.13.#,而不能直接从1.12.#升到1.14.#。升级命令是yum install kubeadm-1.18.1-0.x86_64 --nogpgcheck
。而且主节点和工作节点之间的kubeadm的版本之间最高可以相差1个版本(也就是主节点的kubeadm1.18.#可以和kubeadm 1.19.#进行交流)。
-
上一篇: 使用minikube快速搭建k8s环境
下一篇: 并行计算
推荐阅读
-
ubuntu20.04下使用juju+maas环境部署k8s-7-使用graylog和Prometheus2监控k8s集群-4-prometheus2部署
-
国内环境部署使用minikube部署k8s
-
阿里云CentOS7下部署Nginx,MySQL,PHP7环境
-
centos7内网环境部署(kubernates)k8s环境-rancher部署
-
荐 CentOS7环境下redis安装部署(史上最详细)
-
centos7系统部署k8s集群详细介绍
-
Kubernetes(K8S)容器集群管理环境完整部署详细教程-上篇
-
Kubernetes(K8S)容器集群管理环境完整部署详细教程-中篇
-
Kubernetes(K8S)容器集群管理环境完整部署详细教程-下篇
-
Centos7环境下源码部署ThingsBoard