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