4. 完整版Ubuntu k8s 集群搭建及采坑记录(k8s 连载)(二)

414 阅读3分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」 接着上一篇说:juejin.cn/editor/draf…

为什么要记录呢? 后面我们可以吧生成的kubeadm join记录下来, 然后后面在节点上执行一下, 就表示这个节点加入了k8s集群 此条kubeadm init操作完成以下步骤:

1> 准备工作,检查主机配置是否符合要求等

2> 下载相关镜像  (其实是我们提前准备好的)

3>  启动kubelet,配置对应的配置文件,

    为各个组件生成证书,放在/etc/kubernetes/pki/ 目录

    核心组件配置文件,放在/etc/kubernetes/manifests 目录下 (静态pod生命周期与pod一致,可以通过yaml或者http方式创建)

4> kubeadm的配置文件保存,上报各种接口和信息给k8s master    

5> 生成 token,node申请加入集群时授权,启用基于角色的访问控制

6> 安装两个重要组件,coredns,kube-proxy。 7> 提示安装完成,提示使用准备命令。    

复制代码

 

 

 4. 执行下面三个命令

1. mkdir -p $HOME/.kube
2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3.   

 

 

第八步: 安装网络插件(只在master上执行)

sysctl net.bridge.bridge-nf-call-iptables=1


kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

把文件下载到本地

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 

第二个命令我在命令行执行连接超时. 直接在网页打开(需要FQ). 

# Ubuntu安装rzsz
sudo apt-get install lrzsz

 View Code

然后保存到本地.

 修改kube-flannel.yml文件, 增加下图中红色的部分

 

 将这个文件改完放在根目录~下

 

 

执行命令, 应用到kubeadm

kubectl apply -f kube-flannel.yml

查看当前master的状态

kubectl get node

 

 如果不是ready状态, 查看日志, 看原因

journalctl -f -u kubelet.service

比如, 没有安装网络插件

 

 

遇到的问题error:

1、error: unable to recognize “mycronjob.yml”: no matches for kind “CronJob” in version “batch/v2alpha1”
去kube-apiserver.yaml文件中添加: - --runtime-config=batch/v2alpha1=true,然后重启kubelet服务,就可以了

下面是具体操作:

cd /etc/kubenetes/manifest

vi kube-apiserver.yaml

 

 重启

这个问题是参考了下面这两篇文章解决的

参考文章:

1. blog.csdn.net/qq_34857250…   第六条

2. www.cnblogs.com/aaroncnblog… 在后面的位置,包括重启kubectl

 

 2. no matches for kind "DaemonSet" in version "extensions/v1beta1"

这个问题是参考这篇文章解决的. 按照它上面说的操作:blog.csdn.net/wangmiaoyan…

 

 第九步:添加node

1. 将之前记录下来的kubeadm join 命令执行
2. 禁用虚拟内存 swapoff -a
3. sysctl net.bridge.bridge-nf-call-iptables=1

1. 将之前记录下来的kubeadm join命令执行

kubeadm join 192.168.1.109:6443 --token ehtgdn.c7cjv35rqp45it25     --discovery-token-ca-cert-hash sha256:2f6192bc28397d1bbd00922538a9588345c37f890e7c8ace5d22585fa1922464

 

 

2. 禁用虚拟内存 swapoff -a

3. 执行sysctl net.bridge.bridge-nf-call-iptables=1

4. 检查node是否ready

在master上进行检查

kubectl get node

 

 

 

都是NotReady, 下面我们来处理NotReady的问题

5. 检查所有pod是否正常

kubectl get pod --all-namespaces -o wide
如果有pod处于非running状态, 则查看该pod, 
kubectl describe pod ***  -n kube-system, 
有可能是镜像无法下载导致镜像启动失败, 如果是, 手动在node上pull image, 然后在master上删掉对应的pod, 
k8s会自动重新调度pod, 删除pod命令: 
kubectl delete pod *** -n kube-system

 

现在coredns-66bff467f8-8dntc是Pending状态, 非Running状态. 我们来处理一下

a) 查看该pod 

kubectl describe pod kube-proxy-lcqjv -n kube-system

 

 

 从错误原因可以看出, 需要pause:3.2镜像, 但是没有.

b) 在node节点上, 拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/dva-1024/pause:3.2
docker tag  registry.cn-hangzhou.aliyuncs.com/dva-1024/pause:3.2 k8s.gcr.io/pause:3.2
docker rmi registry.cn-hangzhou.aliyuncs.com/dva-1024/pause:3.2

c) 在master节点上删除kube-proxy-lcqjv这个pod, 然后让他重新调度

kubectl delete pod kube-proxy-lcqjv -n kube-system

 

 删除后, 重新查看发现还是有pod是ContainerCreating状态, 继续按照上面的方法, 查看. 直到这些pod都running为止

 

 

查询节点状态

kubectl get node

 

 node是Ready的状态, 但是....master依然是notReady

处理master的NotReady状态

查看节点日志: 

journalctl -f -u kubelet.service

 

 

 备注: 处理pod都是pending状态, 参考文章: blog.csdn.net/wangmiaoyan…

  

第十步: k8s安装异常处理

1. 在node上执行kubeadm reset 可以断开node, 然后重新join

2. 在master上执行kubeadm reset后可以重新init

ERROR1 : 执行kubeadm reset后, 会遇到这个问题ERROR

Unable to connect to the server: x509: certificate signed by unknown authority

问题描述: 

复制代码

昨天按照教程搭建了一个集群,今天想重新实验下,于是执行kubeadm reset命令清除集群所有的配置。

接着按照部署的常规流程执行kubeadm init --kubernetes-version=v1.14.3 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=0.0.0.0命令创
建集群。然后执行以下几个命令:

  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等命令时,所有的命令都会打印出错误: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”)

当在这些 kubectl 命令后加入 --insecure-skip-tls-verify 参数时,就会报如下错误:error: You must be logged in to the server (Unauthorized)

复制代码

我记得reset完成的时候, 给了一个提示,如下: 

 没有手动删除~/.kube/config配置文件. 而我重新执行了init初始化以后, 没有再次执行这三句话, 因为里面有下面的这个文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

于是, 把关注点放在config这个配置的第二句话上

 

 首先. 看了cd /etc/kubernetes目录, 发现admin.conf的创建时间是5月1号

然后,看了cd ~/.kube目录, 发现config的创建时间是4月30号. 很显然不是最新的. 

于是, 执行了sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/configsudochownHOME/.kube/config 和sudo chown (id -u):(idg)(id -g) HOME/.kube/config

在执行kubectl get nodes, 可以正常显示了.

3. 重新启动后, 要执行如下命令

0. ufw disable
1.swapoff -a && sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab 
2. systemctl daemon-reload // 重新读取本地配置文件
3. systemctl restart kubelet 
设置开机自启  systemctl enable kubelet

头疼的问题: 从单位回到家, 网络的ip地址变了

1. 修改配置文件

2. 将网络换成静态ip

参考文章: blog.csdn.net/whywhy0716/…