kubeadm搭建高可用集群

kubeadm是官方的一个用来管理k8s集群的工具

kubeadm,虽然是官方的是使用起来也不是很方便,他需要在每个节点上进行安装,在大规模的时候需要借助其他工具

环境信息说明

  • 4台2c2g虚拟机,官方要求最少2c4g但是我的机器没这么高配置,如果仅仅是学习的话够用了
  • 系统为centos7
  • lb方案为了方便使用hosts文件,生产环境请使用lvs,haproxy,nginx等方案
  • 默认为最新版本

节点初始化

所有节点无论master和node

设置主机名字和PS1为主机IP

为了方便统一设置主机名为ip地址

echo 'export PS1="[\u@\H \W]\$ "' >> .bashrc

IP=$(ip addr show $(ip route |grep default |awk '{print$5}') |grep -w inet |awk -F '[ /]+' '{print $3}')
hostnamectl set-hostname $IP
关闭swap交换分区
# 临时关闭
swapoff -a

# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disable/g' /etc/selinux/config
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
同步时间
ntpdate cn.pool.ntp.org
yum源

默认源很慢,改为阿里云的

修改centos7源为阿里云
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
修改centos7 epel源为阿里云
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装k8s源

官方的国内不可用,使用阿里云的

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装CRI
安装docker

k8s 1.24之后无法直接支持docker,需要安装cri-dockerd

# 添加配置文件

cat <<EOF > /etc/docker/daemon.json 
{
    "oom-score-adjust": -1000,
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "3"
    },
    "exec-opts": ["native.cgroupdriver=systemd"],
    "live-restore": true,
    "max-concurrent-downloads": 10,
    "max-concurrent-uploads": 10,
    "registry-mirrors": ["http://hub-mirror.c.163.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"],
    "storage-driver": "overlay2",
    "storage-opts": [
        "overlay2.override_kernel_check=true"
    ]
}
EOF

# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 重启docker
systemctl restart docker && systemctl enable docker
安装containerd
# 加载内核模块
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter
# 使用阿里的源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install containerd.io-1.6.6-3.1.el7.x86_64.rpm
安装k8s组件
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

# ipvs模式推荐安装
yum install -y ipvsadm

安装master

# 执行master节点初始化
kubeadm init \
    --control-plane-endpoint "k8s-api:6443" \
    --upload-certs \
    --image-repository registry.aliyuncs.com/google_containers \
    --pod-network-cidr=172.16.1.0/16 \
    --v=6

# 初始化完成之后会打印出加入集群的命令

加入集群的命令可以使用kubeadm重新获取,参考后面kubeadm

其他两个master节点
kubeadm join k8s-api:6443 --token iq5o5t.8mtwj9117qhed25p \
       --discovery-token-ca-cert-hash sha256:95fda448e3cb56303efc3bccbc785e000c3124a9a045ff2ed33c854cb9ee3108 \
       --control-plane --certificate-key f075fe20e799440297bf9bd48942134da1c95f1c00ef94d7d208a2a66ce87bda

安装工作节点

kubeadm join k8s-api:6443 --token iq5o5t.8mtwj9117qhed25p \
        --discovery-token-ca-cert-hash sha256:95fda448e3cb56303efc3bccbc785e000c3124a9a045ff2ed33c854cb9ee3108

cni

k8s支持很多cni,这里使用了最简单的flannel

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

清理master上的污点

默认安装完成之后master是有污点的

kubectl taint nodes <节点名字> node-role.kubernetes.io/master:NoSchedule-
  • 新版本叫control-plane
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

metrics-server

metrics-server提供了最基础的metrics手机,使用kubectl top和hpa时需要他,当然也可以使用kube-prometheus代理

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

ingress

ingress官方只是定义了crd,具体实现由第三方实现,这里使用了常见的nginx-ingreses

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml

# 使用helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx

dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
删除清理

master要保持奇数!

  • 驱逐节点上的pod
kubectl drain <节点> --delete-local-data --force --ignore-daemonsets
  • 删除节点
kubectl delete <节点>
  • 在要删除的节点上执行
kubeadm reset
  • 清理iptables规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  • 如果使用了ipvs模式
ipvsadm -C
  • 清理安装目录和文件
rm -rf ~/.kube
rm -rf /opt/cni
rm -rf /etc/cni
rm -rf /etc/kubernetes
rm -rf /var/etcd # master节点才有
  • 卸载组件
yum remove kube*
  • 重启
reboot
升级版本

k8s升级版本最大不能跨越两个次版本,其版本通过二进制的版本来确定要通过kubeadm去每个节点上执行

master节点
yum -y update kubeadm kubelet kubectl

# 验证版本
kubeadm version

# 查看升级计划
kubeadm upgrade plan

# 执行升级
sudo kubeadm upgrade apply v1.y.x

# 其他的master
sudo kubeadm upgrade node
工作节点
  • 驱逐节点上pod
kubectl drain <节点> --delete-local-data --force --ignore-daemonsets
  • 升级节点
yum update -y kubelet

systemctl restart kubelet
  • 恢复节点
kubectl uncordon <节点>
其他
  • 查看cni是不是需要根据版本升级
  • dashboard等k8s应用升级

kubeadm常用命令

# 打印默认的初始化配置
kubeadm config print init-defaults > kubeadm-config.yaml

# 打印默认的初始化配置,巴罗了kubeetl组件
kubeadm config print init-defaults --component-configs KubeletConfiguration

# 使用配置文件来初始化集群
kubeadm init --config kubeadm-config.yaml

# 查看所需要的镜像列表
kubeadm config images list

# 下载默认配置的镜像
kubeadm config images pull

# 由于国内无法访问gcr.io,可以指定仓库,这里使用了阿里的镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version latest

# 获取key
kubeadm init phase upload-certs --upload-certs

# 获取加入节点的命令
kubeadm token create --print-join-command --ttl 0

# 将获取的key组合成添加master的命令
kubeadm join k8s-api:6443 
--token <token> \
--discovery-token-ca-cert-hash <cert>\
--control-plane \
--certificate-key <key> \
--v=6

# 加入master的简便命令
kubeadm token create --print-join-command --certificate-key $(kubeadm init phase upload-certs --upload-certs|tail -1)

# kubeadm init 和 kubeadm join 如果cpu配置太低可以使用下面的参数忽略
--ignore-preflight-errors=Mem,NumCPU

# 查看证书时间
kubeadm certs check-expiration

# 证书续期
kubeadm certs renew all

参考资料

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker