00:文章简介
介绍如何使用kubeadm部署Master节点和Node节点。
01:安装软件
查看kubeadm的版本信息
使用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
成功后会显示如下
根据命令执行后显示的提示信息,我们需要做下面的事情
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是内部网卡,则如下图设置
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:查看集群内部节点节点状态
04:初始化时的常见问题
- kubectl get cs 时,scheduler或controller的状态显示为Unhealthy
默认配置文件中对端口做了定制化操作,需要取消定制化,将/etc/kubernetes/manifests/kube-scheduler.yaml 的第19行 port=0注释掉
- kubectl get nodes 时,master显示NotReady
flannel插件没有安装好,重新安装
05:配置node节点
- 安装docker环境
- 配置daemon.json
- 安装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节点中用不到
- 查看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节点中查看状态
- 如果加入没问题,则按照上面的步骤,添加其他2个节点
Node节点的信息查看
kubectl get nodes
主要查看的是events里面的信息,后面会重点说明相关信息的查看
06:kubectl命令补全
只需要在master节点中操作
echo "source <(kubectl completion bash)" >> ~/.bashrc
效果
07:让pods在master节点中运行
正常来说master只当作管理角色,性能不满足运行pods。
pods不能运行在master节点中的原因是: master有"污点"
取消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是有期限的
重新生成token
kubeadm token create --print-join-command
09:移除Node节点
当我们维护Node节点时,需要将Node节点从k8s集群中移出
步骤:
- 冻结该节点,目的是不让master将pods继续分配给该node
- 驱离该节点上的pods
- 清理k8s集群其他配置 kubeadm reset
操作:
kubectl cordon kubeadm-node02
kubectl drain kubeadm-node02 --delete-emptydir-data --force --ignore-daemonsets
kubectl delete nodes kubeadm-node02
下面有重置集群状态的操作,按照设置即可,若不设置,node节点再次加入时会提示问题
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
可能是因为重新加入后flannel.1和cni0的地址没有重新生成,导致不在一个网段内
直接干掉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.获取认证信息后,基于证书方式进行通信
评论区