目 录CONTENT

文章目录

Kubeadm管理k8s集群系列04-部署Master节点和Node节点

cplinux98
2022-09-06 / 0 评论 / 0 点赞 / 699 阅读 / 1,791 字 / 正在检测是否收录...

00:文章简介

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

01:安装软件

查看kubeadm的版本信息

image

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

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

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

预先拉取镜像

kubeadm config images pull

02:使用命令初始化集群

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添加,如果是普通用户也可以使用下面的命令

  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插件

# 下载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 命令得到

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软件
#!/bin/bash

# settings apt source
> /etc/apt/sources.list
cat >> /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
EOF

apt update

# off swap
echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
sed -i 's/.*swap/#&/' /etc/fstab
swapoff /swap.img

# setting kernel params
echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.d/k8s.conf
echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf

# open model
modprobe br_netfilter
modprobe overlay

# install docker
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get -y update
apt-get -y install docker-ce


# setting docker
cat >> /etc/docker/daemon.json << EOF
{
 "registry-mirrors": ["https://73yi6cz9.mirror.aliyuncs.com"],
 "insecure-registries": ["harbor.linux98.com"],
 "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl restart docker


# install k8s soft source
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 >/etc/apt/sources.list.d/kubernetes.list << EOF
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. 查看node节点加入集群的命令

kubeadm token create --print-join-command

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节点中操作

echo "source <(kubectl completion bash)" >> ~/.bashrc

效果

image

07:让pods在master节点中运行

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

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

image

取消master的"污点"

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

添加master的"污点"

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

08:token过期的处理方法

Node加入的token是有期限的

image

重新生成token

kubeadm token create --print-join-command

09:移除Node节点

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

步骤:

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

操作:

kubectl cordon kubeadm-node02
kubectl drain kubeadm-node02 --delete-emptydir-data --force --ignore-daemonsets
kubectl delete nodes kubeadm-node02

image

image

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

image

10:重置集群状态

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

kubeadm reset

清空kubernetes相关环境

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让它重新生成

ifconfig cni0 down
ip link delete cni0

12:简单分析一下kubeadm的master启动流程和节点加入流程

master节点启动流程:
1.当前环境检查,确保当前主机可以部署kubernetes
2.生产kubernetes对外提供服务所需要的各种私钥以及数字证书
3.生成kubernetes控制组件的kubeconfig文件
4.生成kubernetes控制组件的pod对象需要的manifest文件
5.为集群控制节点添加相关的标识,不让主节点参与node的工作
6.生成集群的统一认证token信息,方便其他节点加入到当前的集群
7.进行基于TLS的安全引导相关配置、角色策略、签名请求、自动配置策略
8.为集群安装DNS和kube-proxy插件
node节点加入流程:
1.当前环境检查,读取相关集群配置信息
2.获取集群相关数据后启动kubelet服务
3.获取认证信息后,基于证书方式进行通信
0

评论区