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
NAME          STATUS   ROLES                  AGE   VERSION
k8s-master1   NotReady    control-plane,master   8h    v1.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
NAME          STATUS   ROLES                  AGE   VERSION
k8s-master1   NotReady    control-plane,master   8h    v1.23.0
k8s-node01    NotReady    <none>                 8h    v1.23.0
k8s-node02    NOtReady    <none>                 8h    v1.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_第1张图片
修改完配置后,即可进行部署

~]# kubectl apply -f calico.yaml
~]# kubectl get pods -n kube-system

如果看到的是以下的内容,就说明部署成功,部署后需要等待几分钟。

~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS        AGE
calico-kube-controllers-5c64b68895-xlg4q   1/1     Running   0               76m
calico-node-8hks2                          1/1     Running   0               76m
calico-node-nv7kg                          1/1     Running   0               76m
calico-node-v9mcl                          1/1     Running   0               76m
coredns-6d8c4cb4d-8pd2l                    1/1     Running   0               8h
coredns-6d8c4cb4d-kg6h2                    1/1     Running   0               8h
etcd-k8s-master1                           1/1     Running   10 (109m ago)   8h
kube-apiserver-k8s-master1                 1/1     Running   8               8h
kube-controller-manager-k8s-master1        1/1     Running   7 (109m ago)    8h
kube-proxy-946p5                           1/1     Running   0               8h
kube-proxy-fdm9s                           1/1     Running   0               8h
kube-proxy-wrccj                           1/1     Running   1               8h
kube-scheduler-k8s-master1                 1/1     Running   8 (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_第2张图片

部署

~]# kubectl apply -f kubernetes-dashboard.yaml
~]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-799d786dbf-dkkzd   1/1     Running   0          84m
kubernetes-dashboard-6b6b86c4c5-6c58q        1/1     Running   0          84m

访问dashboard

bashboard部署好后,可直接通过浏览器进行访问,可以访问k8s集群任意主机ip的30001端口,30001端口在yaml文件中定义了。访问后,会看到以下界面
k8s的安装-单master、多node_第3张图片
这里需要使用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_第4张图片
到此时,我们的kubernetes集群算是安装部署完成了,此时我们可以尝试在dashboard中部署一个nginx

dashboard中部署nginx的

k8s的安装-单master、多node_第5张图片
选择镜像、pod名、pod数量、端口信息,然后点击部署
k8s的安装-单master、多node_第6张图片
等待几分钟后,在终端使用命令可查看pod节点

~]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-969b69cd7-44wbm   1/1     Running   0          85m
web-969b69cd7-fn4kn   1/1     Running   0          84m
web-969b69cd7-t248l   1/1     Running   0          84m

也可在前端查看pod节点
k8s的安装-单master、多node_第7张图片
在终端通过命令查看nginx的pod映射的端口

~]# kubectl get service
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.0.0.1     <none>        443/TCP        8h
web          LoadBalancer   10.5.82.77   <pending>     80:30608/TCP   86m

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

在node节点上配置kubectl命令

只需要将master节点上的.kube/下的配置文件拷贝到node节点下的.kube/目录下即可

[root@k8s-node01 ~]# mkdir .kube              # 在node节点上创建.kube目录,是用户家目录下创建
[root@k8s-master1 ~]# scp .kube/* [email protected]:/root/.kube/      # 在master主机上将配置文件拷贝到node节点上
[root@k8s-node01 ~]# kubectl get nodes       # 在node节点上使用kubectl命令
NAME          STATUS   ROLES                  AGE   VERSION
k8s-master1   Ready    control-plane,master   14h   v1.23.0
k8s-node01    Ready    <none>                 14h   v1.23.0
k8s-node02    Ready    <none>                 14h   v1.23.0

安装中遇到故障的排查

初始化失败

原因:执行初始化命令时,本机ip为192.168.1.21在命令中写成了0.21,导致初始化失败,日志中提示一下内容。执行失败后,可根据提示执行命令查看相关日志
k8s的安装-单master、多node_第9张图片
k8s的安装-单master、多node_第10张图片
解决方案:由于我ip填写错误,导致我后面修改回正确的ip后还是回去连接0.21,这是时候需要执行清楚配置命令,该命令危险性较大,建议谨慎执行。

~]# kubectl reset

清楚配置后再重新进行初始化即可

calio插件部署失败,提示:Init: ImagePullBackOff

k8s的安装-单master、多node_第11张图片
原因:该问题可能是网络问题导致的,这是再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
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
calico/kube-controllers                              v3.23.3   32d39d8db456   3 days ago      127MB
calico/cni                                           v3.23.3   ecf96bae0aa7   3 days ago      254MB
calico/node                                          v3.23.3   5f5175f39b19   3 days ago      203MB
registry.aliyuncs.com/google_containers/kube-proxy   v1.23.0   e03484a90585   7 months ago    112MB
registry.aliyuncs.com/google_containers/coredns      v1.8.6    a4ca41631cc7   9 months ago    46.8MB
registry.aliyuncs.com/google_containers/pause        3.6       6270bb605e12   11 months ago   683kB

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 [email protected]:/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    
NAME                  READY   STATUS    RESTARTS   AGE    IP              NODE         NOMINATED NODE   READINESS GATES
web-969b69cd7-44wbm   1/1     Running   0          114m   10.244.58.196   k8s-node02   <none>           <none>
web-969b69cd7-fn4kn   1/1     Running   0          114m   10.244.85.196   k8s-node01   <none>           <none>
web-969b69cd7-t248l   1/1     Running   0          114m   10.244.58.195   k8s-node02   <none>           <none>

查看kubectl的日志

journalctl -f -u kubelet

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

docker logs 容器id

查看某个pod日志

~]# kubectl logs pod名

你可能感兴趣的:(学习,docker,linux,kubernetes)