kubernetes04-使用kubeadm部署Master及Node

00:文章简介

介绍如何使用kubeadm部署Master节点和Node节点。

01:安装软件

查看kubeadm的版本信息

image

使用kubeadm的命令行安装k8s master角色

Text
1
2
# 这里的版本要和kubeadm的版本一致
apt-get install kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00

此时kubelet可能会报错,等待kubeadm生成配置文件后报错就消失了

预先拉取镜像

Text
1
kubeadm config images pull

02:使用命令初始化集群

Text
1
2
3
4
5
6
kubeadm init --kubernetes-version=1.22.1 \
--apiserver-advertise-address=172.20.200.201 \
--image-repository=harbor.linux98.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap

成功后会显示如下

image

根据命令执行后显示的提示信息,我们需要做下面的事情

1: 给用户添加权限,这里给root添加,如果是普通用户也可以使用下面的命令

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

2: 给root用户添加权限

这里我们已经是root用户,且执行了上面的命令,就不需要再重复添加了

3: 给pod的网络安装插件

这里我们安装flannel插件

Text
1
2
3
4
5
6
7
8
# 下载flannel插件
cd /root/mykube/init/
mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/v0.14.0/Documentation/kube-flannel.yml
# 安装flannel
# 替换原有配置文件里的image地址
sed -i 's#quay.io/coreos/flannel:v0.14.0#harbor.linux98.com/google_containers/flannel:v0.14.0#g' kube-flannel.yml
kubectl apply -f kube-flannel.yml

如果设备是多个网卡,则需要在kube-flannel中指定集群内部通信使用的网卡,如果eth1是内部网卡,则如下图设置

image

4: 保存节点加入的命令,如果忘记保存可以使用 kubeadm token create –print-join-command 命令得到

Text
1
2
kubeadm join 172.20.200.201:6443 --token nsdt95.fc88klsticmfun79 \
--discovery-token-ca-cert-hash sha256:ab96b29a85daeb4b115c3fd53dfa8631329978522cfc96670f6076905be5f26a

03:查看集群内部节点节点状态

image

04:初始化时的常见问题

  1. kubectl get cs 时,scheduler或controller的状态显示为Unhealthy

image

默认配置文件中对端口做了定制化操作,需要取消定制化,将/etc/kubernetes/manifests/kube-scheduler.yaml 的第19行 port=0注释掉

  1. kubectl get nodes 时,master显示NotReady

image

flannel插件没有安装好,重新安装

05:配置node节点

  1. 安装docker环境
  2. 配置daemon.json
  3. 安装kubeadm和kubelet软件
Text
1
2
3
4
5
6
7
8
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet=1.22.1-00 kubeadm=1.22.1-00
# 这里会默认安装kubectl 但是node节点中用不到
  1. 使用上面的命令安装 kubeadm token create –print-join-command
Text
1
2
3
kubeadm join 172.20.200.201:6443 --token nsdt95.fc88klsticmfun79 \
--discovery-token-ca-cert-hash sha256:ab96b29a85daeb4b115c3fd53dfa8631329978522cfc96670f6076905be5f26a

然后在master节点中查看状态

image

  1. 如果加入没问题,则按照上面的步骤,添加其他2个节点

image

Node节点的信息查看

kubectl get nodes

主要查看的是events里面的信息,后面会重点说明相关信息的查看

06:kubectl命令补全

只需要在master节点中操作

Text
1
echo "source <(kubectl completion bash)" >> ~/.bash_rc

效果

image

07:让pods在master节点中运行

正常来说master只当作管理角色,性能不满足运行pods。

pods不能运行在master节点中的原因是: master有”污点”

image

取消master的”污点”

Text
1
kubectl taint nodes kubeadm-master01 node-role.kubernetes.io/master-

添加master的”污点”

Text
1
kubectl taint nodes kubeadm-master01 node-role.kubernetes.io/master:NoSchedule

08:token过期的处理方法

Node加入的token是有期限的

image

重新生成token

Text
1
kubeadm token create --print-join-command

09:移除Node节点

当我们维护Node节点时,需要将Node节点从k8s集群中移出

步骤:

  1. 冻结该节点,目的是不让master将pods继续分配给该node
  2. 驱离该节点上的pods
  3. 清理k8s集群其他配置 kubeadm reset

操作:

Text
1
2
3
kubectl cordon kubeadm-node02
kubectl drain kubeadm-node02 --delete-emptydir-data --force --ignore-daemonsets
kubectl delete nodes kubeadm-node02

image

image

下面有重置集群状态的操作,按照设置即可,若不设置,node节点再次加入时会提示问题

image

10:重置集群状态

如果在初始化中出现了问题,需要重新初始化时使用

Text
1
kubeadm reset

清空kubernetes相关环境

Text
1
2
3
4
5
6
7
8
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/cni/
ifconfig
ifconfig flannel.1 down
ifconfig cni0 down
ip link delete cni0
ip link delete flannel.1

11:重新加入节点后可能出现的问题

network: failed to set bridge addr: “cni0” already has an IP address different from 10.244.4.1/24

image

可能是因为重新加入后flannel.1和cni0的地址没有重新生成,导致不在一个网段内

image

直接干掉cni0让它重新生成

Text
1
2
ifconfig cni0 down
ip link delete cni0