配套学习课程:

k8s集群部署【基于k8s1.21版本】https://edu.51cto.com/course/28121.html

1、安装环境介绍

安装k8s集群环境,需要3台主机,学习环境4核8G内存,500GB磁盘即可满足要求。这里采用centos7.9系统。

主机名/IP                                              用途 
k8smaster(172.16.213.221) k8s集群的master节点 
k8snode1(172.16.213.222) k8s集群的work节点1 
k8snode2(172.16.213.223) k8s集群的work节点2 

2、升级内核

#安装新内核

[root@master1 kernel]#  wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.114-1.el7.elrepo.x86_64.rpm
[root@master1 kernel]#  wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.114-1.el7.elrepo.x86_64.rpm
 [root@master1 kernel]#  yum -y install  kernel-lt-5.4.114-1.el7.elrepo.x86_64.rpm kernel-lt-devel-5.4.114-1.el7.elrepo.x86_64.rpm

#调整默认内核启动


[root@master1 kernel]# grub2-set-default "CentOS Linux (5.4.114-1.el7.elrepo.x86_64) 7 (Core)"

#检查是否修改正确并重启系统

[root@master1 kernel]# grub2-editenv list
[root@master1 kernel]# reboot

3、开启IPVS支持

创建/etc/sysconfig/modules/ipvs.modules文件,内容如下:

#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
  /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    /sbin/modprobe ${kernel_module}
  fi
done

最后,执行如下命令使配置生效:

[root@master1 kernel]# chmod 755 /etc/sysconfig/modules/ipvs.modules 
[root@master1 kernel]# sh /etc/sysconfig/modules/ipvs.modules 
[root@master1 kernel]# lsmod | grep ip_vs

4、关闭防火墙、selinux

K8s集群每个节点都需要关闭防火墙,执行如下操作:

[root@master1 kernel]# systemctl stop firewalld && systemctl disable firewalld
[root@master1 kernel]# setenforce 0
[root@master1 kernel]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

接着,还需要关闭系统的交换分区,执行如下命令:

[root@master1 kernel]# swapoff -a
[root@master1 kernel]# cp /etc/fstab  /etc/fstab.bak
[root@master1 kernel]# cat /etc/fstab.bak | grep -v swap > /etc/fstab

然后,还需要修改iptables设置,在/etc/sysctl.conf中添加如下内容:

vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1

最后,执行如下命令,以使设置生效:


[root@master1 kernel]# sysctl -p

5、主机名本地解析配置

每个主机的主机名以及IP地址都在上面环境介绍中给出来了,根据这些信息,在每个k8s集群节点添加如下主机名解析信息,将这些信息添加到每个集群节点的/etc/hosts文件中,主机名解析内容如下:

127.0.0.1   localhost
172.16.213.221  k8smaster
172.16.213.222  k8snode1
172.16.213.223  k8snode2

6、安装docker环境(所有节点都执行下面步骤)

所有节点都需要安装docker,每个节点都需要使docker开机自启,执行如下命令

[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 [root@master ~]# yum makecache fast
[root@master ~]# yum install docker-ce -y
[root@master ~]# systemctl restart docker
[root@master  ~]# systemctl enable docker
[root@master  ~]# docker version

7、安装Kubeadm、kubelet、kubectl工具

在确保系统基础环境配置完成后,现在我们就可以来安装 Kubeadm、kubelet了,我这里是通过指定yum 源的方式来进行安装,使用阿里云的源进行安装:

[root@k8smaster ~]# cat <<EOF > /etc/yum.repos.d/k8s.repo 
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF

然后安装 kubeadm、kubelet、kubectl,可先查询可安装的版本,然后指定版本进行安装。

[root@k8smaster containerd]# yum list kubelet 
kubelet.x86_64                                        1.21.0-0                                        k8s

下面进行安装:


[root@k8smaster ~]#  yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0

然后将 kubelet 设置成开机启动:


 [root@k8smaster ~]# systemctl daemon-reload && systemctl enable kubelet

8、初始化k8s集群

执行如下命令:

[root@master ~]#kubeadm config print init-defaults
[root@master ~]#kubeadm config images list
[root@master ~]# kubeadm config images list --kubernetes-version=v1.21.0 --image-repository swr.myhuaweicloud.com/iivey

其中:
第一个命令用来查看安装k8s的相关信息,主要是安装源和版本。
第二条命令是查询需要的镜像,从输出可在,默认是从k8s.gcr.io这个地址下载镜像,此地址国内无法访问,因此需要修改默认下载镜像的地址。
第三条命令是设置k8s镜像仓库为华为云镜像站地址,查看一下需要下载的镜像都有哪些。

由此可知,通过kubeadm初始化集群,需要这7个镜像,由于gcr无法访问,因此,我将这些镜像统一放到了我的华为云仓库下。

接着,在 master 节点配置 kubeadm 初始化文件,可以通过如下命令导出默认的初始化配置:

[root@master ~]#  kubeadm config print init-defaults > kubeadm.yaml

然后根据我们自己的需求修改配置,这里修改的有advertiseAddress、criSocket、name、imageRepository 的值,同时,添加了kube-proxy的模式为ipvs,,并且,需要注意的是,由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd。

在保证所需要的镜像都可以正常下载后,使用上面的配置文件进行初始化:

[root@k8smaster ~]# kubeadm init --config=kubeadm.yaml

初始化完成,根据提示,在master节点执行如下操作

[root@k8smaster ~]# mkdir -p $HOME/.kube
[root@k8smaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8smaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config 

为了使用更便捷,启用 kubectl 命令的自动补全功能。

[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

现在kubectl可以使用了

9、添加集群节点

初始化集群的操作是在master节点完成的,接下来,要将work节点加入到集群中,首先需要在每个node节点上执行基础配置工作,主要有关闭防火墙和selinux、禁用swap、配置主机名解析、启动网络桥接功能以及启动kubeket服务并设置开机自启,这些已经在前面介绍过,这里不再多说了。

下面介绍下如何添加nodes到集群中,执行如下命令:

[root@master ~]# kubeadm join 172.16.213.221:6443 --token bnefy8.d79yn6ylxlk7k8hr     --discovery-token-ca-cert-hash sha256:eaa17f4b308e9406891f85f664c0d2c97a49bd9e963f64c9453b7042509e106c 

这里的–token来自前面kubeadm init输出提示,如果当时没有记录下来可以通过如下命令找回, token是有24小时有效期的:

[root@master ~]# kubeadm token create --ttl 0 --print-join-command

执行成功后运行 get nodes 命令

[root@k8smaster ~]#kubectl get node
NAME         STATUS     ROLES                  AGE   VERSION
k8smaster   NotReady   control-plane,master   29m   v1.21.0
k8snode1    NotReady   <none>                 28m   v1.21.0
k8snode2    NotReady   <none>                 28m   v1.21.0

可以看到是,两个节点都是NotReady 状态,这是因为还没有安装网络插件。

10、安装网络插件

接下来安装网络插件。网络插件可以选择calico和flannel,这里我们使用calico。

[root@k8smaster ~]# wget https://docs.projectcalico.org/manifests/calico.yaml

建议使用课程自带的文件,此文件已经修改过镜像地址,可直接使用。

安装calico网络插件

[root@k8smaster ~]# kubectl apply -f calico.yaml

此插件的安装过程,需要下载三个镜像文件,下载完成,网络插件即可正常工作。等网络插件镜像下载完成以后,看到node的状态会变成ready,执行如下命令查看:

[root@k8smaster ~]# kubectl  get node

如果发现某个节点还是处于NotReady状态,可以重启此节点的kubelet服务,然后此节点就会重新下载需要的镜像。

最后,执行如下命令,查看pod状态:

[root@master ~]# kubectl get pods -n kube-system

11、在k8s集群中安装kubernetes-dashboard

kubernetes-dashboard是k8s的UI看板,可以查看、编辑整个集群状态。

可从https://github.com/kubernetes/dashboard/releases/tag/v2.2.0 下载最新的dashboard/资源文件,然后进行安装。

下载下来的文件名为recommended.yaml,默认情况下此文件中的几个镜像地址,国内无法访问,需要修改,为方便大家学习,我已经将此文件提供在学习资料中,大家下载下来即可直接使用。

执行如下命令进行安装:

kubectl apply -f  recommended.yaml

安装完成后,执行如下命令,查看kubernetes-dashboard随机的访问端口:

[root@k8smaster ~]#  kubectl  get svc -n kubernetes-dashboard   
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.98.184.182   <none>        8000/TCP        150m
kubernetes-dashboard        NodePort    10.100.209.10   <none>        443:32081/TCP   150m

此时,可以通过集群任意一个节点的ip加上32081端口访问kubernetes-dashboard 。

访问dashboard需要认证,因此还需要创建一个认证机制,执行如下命令,创建一个ServiceAccount用户dashboard-admin:

[root@master k8s]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created

然后将dashboard-admin用户与角色绑定:


[root@master k8s]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

最后,查看Token令牌,执行如下组合命令:

[root@master k8s]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

此命令输出中,token就是令牌,复制出来保存。有了令牌后,就可以在dashboard选择令牌登录了。