国内环境下,CentOS7部署k8s集群

CentOS7虚拟机部署k8s集群

提示:1、此文默认已安装VMWare和CentOS7。

​ 2、在安装之前,对Linux系统的命令比较熟悉。

​ 2、虚拟机环境是:2CPU,内存不小于20GB。

​ 3、此文选择使用两个节点,多个节点的类似于k8s-worker节点的做法。

环境选择
  • 虚拟机:VMWare Workstation 16
  • 两个虚拟机:CentOS-7-x86_64
前置准备
  1. 以管理员身份登录虚拟机。
  2. 禁用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


  1. 禁用防火墙
# systemctl disable fireable && systemctl stop fireable
  1. 禁用交换分区
//如果使用了交换分区则无法启动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
  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. 为主机配置名称解析
//查看主节点和工作节点的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
安装环节
  1. 安装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
  1. 修改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"]
}
  1. 设置开机启动

    $ systemctl enable docker
    $ systemctl start docker
    
  2. 查看自己安装的docker版本

    $ docker --version
    
  3. 安装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节点
  1. 初始化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
  1. 如果需要让 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
  1. 通过kubectl get nodes查看节点状态
[17:42] k8s-master | kubectl get nodes
NAME         STATUS     ROLES    AGE     VERSION
k8s-master   NotReady   master   9m45s   v1.19.2
  1. 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
  1. 安装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
配置工作节点
  1. 使用上述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

出现的问题

  1. 在前置准备阶段应该是没有什末大的问题,出现了直接搜索就可以解决了。

  2. 前置阶段,安装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)
      

      出现这个问题,我也没办法,我也弄了好几遍,就是前面版本的问题太高了,得改一下,改的时候就按照上面的版本应该不会出错。

  3. 安装阶段

    • 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.#进行交流)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值