学习|k8s的安装-单master、多node


k8s的安装-单master、多node

  • 平台安装
    • 环境准备
      • 关闭firewalld、selinux、swap
      • 设置主机名
      • 桥接IPV4到iptables链上
      • 配置时钟同步
    • 安装docker
      • 配置docker的yum镜像源为阿里云
      • 配置docker镜像仓库
    • 安装kubenetes
      • 执行安装kubernetes
      • 初始化kubernetes集群
      • 拷贝kubectl需要的证书到默认路径下
      • 安装node节点
    • 部署calico网络插件
    • 部署dashboard
      • 修改配置yaml文件
      • 部署
      • 访问dashboard
    • dashboard中部署nginx的
    • 在node节点上配置kubectl命令
  • 安装中遇到故障的排查
    • 初始化失败
    • calio插件部署失败,提示:Init: ImagePullBackOff
    • 排查问题种需要使用的命令

平台安装 环境准备 本文章主要介绍测试环境的kubenetes集群部署
准备三台虚拟机,2核2G即可,资源不够也可1核2G
操作系统:centos 7.9
主机ip:192.168.1.21(master节点)、192.168.1.22(node节点)、192.168.1.23(node节点)
为主机固定ip,可详见本人博客:vmware中使用桥接使虚拟机使用宿主机WiFi
关闭firewalld、selinux、swap
# 关闭防火墙 ~]# systemctl stop firewalld ~]# systemctl disable firewalld# 关闭selinux ~]# setenforce 0 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config# 关闭swap ~]# swapoff -a ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab

设置主机名
这里以master主机为例,主机名可自定义,主要用于区分master主机与node主机
~]# hostnamectl set-hostname k8s-master1 ~]# hostname k8s-master1

桥接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

配置时钟同步
~]# yum -y install ntpdate ~]# ntpdate time.windows.com

安装docker 配置docker的yum镜像源为阿里云
~]# yum -y install yum-utils ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ~]# yum repolist# 查看yum是否加载成功 ~]# yum -y install docker-ce# 安装docker

配置docker镜像仓库
配置docker镜像仓库为阿里云,并指定cgourp
~]# vim /etc/docker/daemon.json# docker目录默认不存在,需要创建 { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } ~]# systemctl start docker# 启动docker ~]# systemctl enable docker# 配置开机自启 ~]# docker info# 查看docker信息

安装kubenetes 配置kubernetes的yum镜像源为阿里云
~]# vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg~]# yum makecache# 清理yum缓存 ~]# yum repolist# 检查kubernetes源是否启用

执行安装kubernetes
执行安装命令
~]# yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0 ~]# systemctl enable kubelet

▲ ▲
Ⅰ Ⅰ
Ⅰ Ⅰ
Ⅰ Ⅰ
【以上步骤在所有主机上执行】
初始化kubernetes集群
【初始化集群只需要在master节点上执行即可】
kubeadm init \ --apiserver-advertise-address=192.168.1.21 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all

命令中参数说明
–apiserver-advertise-address 集群通告地址
–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
–kubernetes-version K8s版本,与上面安装的一致
–service-cidr 集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
–ignore-preflight-errors 跳过报错
初始化完成后,最后会输出一个join命令,先记住,下面用。
初始化生成的join命令有效期只有24小时,如果24小时候后需要加新的node或者忘记了join命令,需要再次生成,命令入下
~]# kubeadm token create --print-join-command kubeadm join 192.168.1.21:6443 --token 3efg2c.lbck9kqgxjow77bx --discovery-token-ca-cert-hash sha256:ecd6cfafa72a86303ce8e724de135bb5a688e06ecad2c55be893b2ee5c7ba7f6

拷贝kubectl需要的证书到默认路径下
~]# mkdir -p $HOME/.kube ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ~]# chown $(id -u):$(id -g) $HOME/.kube/config

查看kubernetes节点,此时只能看到一个节点
~]# kubectl get nodes NAMESTATUSROLESAGEVERSION k8s-master1NotReadycontrol-plane,master8hv1.23.0

安装node节点
复制初始化后的join字符串到node节点上执行
这里以node1为例,注意:此处不要用我的命令,需要使用你master主机上初始化成功后的,在初始化成功后会看到这条命令,直接复制就好了。如果忘记可在master主机上再次生成
~]# kubeadm join 192.168.1.21:6443 --token 3efg2c.lbck9kqgxjow77bx --discovery-token-ca-cert-hash sha256:ecd6cfafa72a86303ce8e724de135bb5a688e06ecad2c55be893b2ee5c7ba7f6

安装好node节点,即可在master节点上查看,此时看到的节点状态都是NotReady,这是因为没有安装网路插件,安装好网络插件就好了。
~]# kubectl get nodes NAMESTATUSROLESAGEVERSION k8s-master1NotReadycontrol-plane,master8hv1.23.0 k8s-node01NotReady8hv1.23.0 k8s-node02NOtReady8hv1.23.0

部署calico网络插件 该步骤在master节点上执行
使用wget命令获取插件的yaml文件,如果下载失败,我将我的calico.yaml文件上传到了资源,可通过本连接下载:calico.yaml
wget https://docs.projectcalico.org/manifests/calico.yaml

修改yaml文件,需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样,如下图
学习|k8s的安装-单master、多node
文章图片

修改完配置后,即可进行部署
~]# kubectl apply -f calico.yaml ~]# kubectl get pods -n kube-system

如果看到的是以下的内容,就说明部署成功,部署后需要等待几分钟。
~]# kubectl get pods -n kube-system NAMEREADYSTATUSRESTARTSAGE calico-kube-controllers-5c64b68895-xlg4q1/1Running076m calico-node-8hks21/1Running076m calico-node-nv7kg1/1Running076m calico-node-v9mcl1/1Running076m coredns-6d8c4cb4d-8pd2l1/1Running08h coredns-6d8c4cb4d-kg6h21/1Running08h etcd-k8s-master11/1Running10 (109m ago)8h kube-apiserver-k8s-master11/1Running88h kube-controller-manager-k8s-master11/1Running7 (109m ago)8h kube-proxy-946p51/1Running08h kube-proxy-fdm9s1/1Running08h kube-proxy-wrccj1/1Running18h kube-scheduler-k8s-master11/1Running8 (109m ago)8h

部署dashboard 该步骤在master节点上执行
也是一样需要使用wget命令下载对应的yaml文件
~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

下载失败可以使用我上传的资源,资源链接:kubernets-dashboard.yaml
修改配置yaml文件
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。
学习|k8s的安装-单master、多node
文章图片

部署
~]# kubectl apply -f kubernetes-dashboard.yaml ~]# kubectl get pods -n kubernetes-dashboard NAMEREADYSTATUSRESTARTSAGE dashboard-metrics-scraper-799d786dbf-dkkzd1/1Running084m kubernetes-dashboard-6b6b86c4c5-6c58q1/1Running084m

访问dashboard
bashboard部署好后,可直接通过浏览器进行访问,可以访问k8s集群任意主机ip的30001端口,30001端口在yaml文件中定义了。访问后,会看到以下界面
学习|k8s的安装-单master、多node
文章图片

这里需要使用token进行访问,可以通过以下命令来创建token
# 创建用户 ~]# kubectl create serviceaccount dashboard-admin -n kube-system # 用户授权 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin # 获取用户Token ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

复制token登录,注意:在复制时不要将前后的空格也复制进去
学习|k8s的安装-单master、多node
文章图片

到此时,我们的kubernetes集群算是安装部署完成了,此时我们可以尝试在dashboard中部署一个nginx
dashboard中部署nginx的 学习|k8s的安装-单master、多node
文章图片

选择镜像、pod名、pod数量、端口信息,然后点击部署
学习|k8s的安装-单master、多node
文章图片

等待几分钟后,在终端使用命令可查看pod节点
~]# kubectl get pods NAMEREADYSTATUSRESTARTSAGE web-969b69cd7-44wbm1/1Running085m web-969b69cd7-fn4kn1/1Running084m web-969b69cd7-t248l1/1Running084m

也可在前端查看pod节点
学习|k8s的安装-单master、多node
文章图片

在终端通过命令查看nginx的pod映射的端口
~]# kubectl get service NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetesClusterIP10.0.0.1443/TCP8h webLoadBalancer10.5.82.7780:30608/TCP86m

通过命令可以看到,映射的端口为30608,此时在浏览器访问集群内任意机器的30608端口即可访问到nginx
学习|k8s的安装-单master、多node
文章图片

在node节点上配置kubectl命令 只需要将master节点上的.kube/下的配置文件拷贝到node节点下的.kube/目录下即可
[root@k8s-node01 ~]# mkdir .kube# 在node节点上创建.kube目录,是用户家目录下创建 [root@k8s-master1 ~]# scp .kube/* root@192.168.1.22:/root/.kube/# 在master主机上将配置文件拷贝到node节点上 [root@k8s-node01 ~]# kubectl get nodes# 在node节点上使用kubectl命令 NAMESTATUSROLESAGEVERSION k8s-master1Readycontrol-plane,master14hv1.23.0 k8s-node01Ready14hv1.23.0 k8s-node02Ready14hv1.23.0

安装中遇到故障的排查 初始化失败 原因:执行初始化命令时,本机ip为192.168.1.21在命令中写成了0.21,导致初始化失败,日志中提示一下内容。执行失败后,可根据提示执行命令查看相关日志
学习|k8s的安装-单master、多node
文章图片

学习|k8s的安装-单master、多node
文章图片

解决方案:由于我ip填写错误,导致我后面修改回正确的ip后还是回去连接0.21,这是时候需要执行清楚配置命令,该命令危险性较大,建议谨慎执行。
~]# kubectl reset

清楚配置后再重新进行初始化即可
calio插件部署失败,提示:Init: ImagePullBackOff 学习|k8s的安装-单master、多node
文章图片

原因:该问题可能是网络问题导致的,这是再pull镜像时失败,可尝试手动pull一下镜像。我这里是只有一个镜像pod节点没起来,所有我可以到其他的running的节点上去看镜像版本。经过检查我的是master节点上没有calico/cni、calico/node、calico/kube-controllers 这三个镜像。
解决方案:
1、在缺少镜像的节点上,手动pull指定版本的插件,pull时版本需要与其他节点上的一致
2、在有镜像的节点上,将镜像导成tar包,然后传到缺少镜像的节点上,然后load上镜像
手动pull镜像时,可以用grep命令看一下calico依赖的镜像。这里我们可以看到,calico需要三个镜像,分别为:calico/cni:v3.23.3、calico/node:v3.23.3、calico/kube-controllers:v3.23.3。在pull时一定要注意版本。
~]# grep image calico.yaml image: docker.io/calico/cni:v3.23.3 image: docker.io/calico/cni:v3.23.3 image: docker.io/calico/node:v3.23.3 image: docker.io/calico/node:v3.23.3 image: docker.io/calico/kube-controllers:v3.23.3

我这里使用的是第二种方案
检查节点镜像
~]# docker images REPOSITORYTAGIMAGE IDCREATEDSIZE calico/kube-controllersv3.23.332d39d8db4563 days ago127MB calico/cniv3.23.3ecf96bae0aa73 days ago254MB calico/nodev3.23.35f5175f39b193 days ago203MB registry.aliyuncs.com/google_containers/kube-proxyv1.23.0e03484a905857 months ago112MB registry.aliyuncs.com/google_containers/corednsv1.8.6a4ca41631cc79 months ago46.8MB registry.aliyuncs.com/google_containers/pause3.66270bb605e1211 months ago683kB

save镜像为tar包
~]# docker save -o calico_kube-controllers.tar.gz calico/kube-controllers:v3.23.3 ~]# docker save -o calico_cni.tar.gz calico/cni:v3.23.3 ~]# docker save -o calico_node.tar.gz calico/node:v3.23.3

由于我是master节点缺少镜像,这里就scp镜像包到master节点上
~]# scp *.tar.gz root@192.168.1.21:/root/

在master节点上将镜像包load成镜像
~]# docker load -i calico_cni.tar.gz ~]# docker load -i calico_kube-controllers.tar.gz ~]# docker load -i calico_node.tar.gz

加载完镜像后重启kubectl进程,让程序自动加载生成pod,等待几分钟就好了。
~]# systemctl restart kubectl

排查问题种需要使用的命令 查看pod时加上 -o wide可以看到pod是运行在那个节点上
~]# kubectl get pods -o wide NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES web-969b69cd7-44wbm1/1Running0114m10.244.58.196k8s-node02 web-969b69cd7-fn4kn1/1Running0114m10.244.85.196k8s-node01 web-969b69cd7-t248l1/1Running0114m10.244.58.195k8s-node02

查看kubectl的日志
journalctl -f -u kubelet

查看容器日志,在pod部署失败时,查看pod日志使用
docker logs 容器id

【学习|k8s的安装-单master、多node】查看某个pod日志
~]# kubectl logs pod名

    推荐阅读