使用kubeadm进行单master(single master)和高可用(HA)kubernetes集群部署
kubeadm部署k8s
使用kubeadm进行k8s的部署主要分为以下几个步骤:
- 环境预装: 主要安装docker、kubeadm等相关工具。
- 集群部署: 集群部署分为single master(单master,只有一个master节点)和高可用HA集群部署两种模式。主要部署k8s的相关组件。本文将分别做介绍。
- 网络部署: 部署网络环境。本文以flannel为例进行部署。
环境预装
在所有节点上都先要做好环境的准备,这里以debian为例,整理了安装docker和kubeadm的相关命令。这个里面主要需要解决的是国内源的问题。
## 准备环境
swapoff -a
systemctl stop firewalld
systemctl disable firewalld
echo "net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1" > /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
modprobe br_netfilter
## 更换apt源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" > /etc/apt/sources.list
## 安装docker
apt-get update
apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common -y --force-yes
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
apt-get update
apt-get install docker-ce containerd.io -y
## 使用阿里云安装kubeadm
curl -s 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 kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
## 关闭swap
echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
以上命令在所有节点上都需要执行下。
单master集群部署
单master集群部署是以一个节点作为master节点,其他的节点作为node角色加入到集群中。
首先在master节点上,通过kubeadm进行集群的初始化。
nodename默认会使用hostname,这里使用ip作为nodename,在查看node节点时会更加直观一些。
这里面基本都使用的是国内的azure提供的镜像源,镜像下载速度比较快一些
cat << EOF > /root/kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta1
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: gcr.azk8s.cn/google_containers/pause-amd64:3.1
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
imageRepository: gcr.azk8s.cn/google_containers
kubernetesVersion: v1.14.2
networking:
podSubnet: 10.244.0.0/16
EOF
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'`
echo $nodename
kubeadm init --config=kubeadm-config.yaml --apiserver-advertise-address=kubemaster.cluster.local --node-name $nodename > kubeadm.log
在master中查看kubeadm.log中的最后几行,可以看到其他节点加入集群的命令。
root@i-5i2nhchleypb9h6oofb9h5suy:~# tail -n 5 kubeadm.log
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join kubemaster.cluster.local:6443 --token br1lyz.kgnz5d6apvtcvdlg \
--discovery-token-ca-cert-hash sha256:a8a80875b68ddd8d8e0cd794daa1b81a7893eebceca77c3d5f9074b2dc7e109b
这时切换到其他的node节点,可以直接使用以下命令,加入集群。
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'`
echo $nodename
kubeadm join kubemaster.cluster.local:6443 --token bbnth6.tyxpf0ec27r5y5b8 \
--discovery-token-ca-cert-hash sha256:5a9d6d25558c0e5031d4d6a69b555f0db8dd0ac7e798b9f823f7f33352748ae6 --node-name $nodename
node节点全部加入后,即完成节点的部署。
高可用(HA)集群部署
高可用集群目前支持两种拓扑结构,一种是etcd在master节点中部署,一种是etcd在另外的节点中进行部署。在小规模集群中,其实采用前者就可以了。本文也是采用这种方式。
高可用集群一般需要三个以上的master节点组成,以及若干个node节点组成。其中master节点需要一个负载均衡器进行流量的分发。但是在小规模集群中,额外再部署一个负载均衡器无疑会增加部署的复杂度。这里我使用了一个偷懒的方式,就是不使用真实的负载均衡器,而是使用域名。这里我有三个节点,我在每个节点的/etc/hosts中做了如下配置。这样kubemaster.cluster.local就可以解析到三个节点上。
11.62.68.3 kubemaster.cluster.local
11.62.68.4 kubemaster.cluster.local
11.62.68.5 kubemaster.cluster.local
这里为了防止连接都压到同一台上,可以在不同的节点上调整hosts中的配置顺序。
这里同前面相似,用以下命令进行集群的初始化。这里特别注意下在配置中同上面最大的区别在于加入了controlPlaneEndpoint: "kubemaster.cluster.local:6443"配置。实现对于集群控制面的负载均衡器的配置。
cat << EOF > /root/kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta1
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: gcr.azk8s.cn/google_containers/pause-amd64:3.1
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
imageRepository: gcr.azk8s.cn/google_containers
kubernetesVersion: v1.14.2
controlPlaneEndpoint: "kubemaster.cluster.local:6443"
networking:
podSubnet: 10.244.0.0/16
EOF
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'`
echo $nodename
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --node-name $nodename > kubeadm.log
在完成初始化后,可以查看相关日志。可以看到同单master部署模式的情况不同,高可用集群中有两个命令。
root@i-5i2nhchleypb9h6oofb9h5suy:~# tail -n 15 kubeadm.log
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \
--discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb \
--experimental-control-plane --certificate-key b73eba61d73c35ca4de43b9dd10a7db88023cbd767c98cc1d19489829ea0fc03
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --experimental-upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \
--discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb
第一个是加入master的方式。也就是说,通过第一个命令加入后,该节点将会作为master加入到集群中。这里我们使用该命令即可将节点加入到master中,作为master的节点之一。
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'`
echo $nodename
kubeadm join kubemaster.cluster.local:6443 --token pcumbv.qwa7uwzr7m7cijxy \
--discovery-token-ca-cert-hash sha256:bae4c6e70cc92cc6cba66bc96d48bf0c5a45fddf83e90b89eea519fc4bad16ac \
--experimental-control-plane --certificate-key 33f387801d51c0a743353357b138cf4ad70fd3acaa7a6ccec9835627773f1cb7 --node-name $nodename
当然,第二个同单master模式就相似了。
nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F ' ' '{print $NF}'`
echo $nodename
kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \
--discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb --node-name $nodename
master节点准备
在master节点上可以做一些相关的准备,方便后面使用kubectl等命令。
systemctl enable kubelet.service
## 为kubectl准备config
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
## 去掉master的污点,使得master节点也可以创建容器
## 该命令可选。如果不想让master执行node的角色,也可以不执行
kubectl taint nodes --all node-role.kubernetes.io/master-
网络安装
这里使用flannel网络。
mkdir -p ~/k8s/
cd ~/k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 这里使用quay.azk8s.cn进行进行加速。该命令可选。
sed -i "s/quay.io/quay.azk8s.cn/g" kube-flannel.yml
kubectl apply -f kube-flannel.yml
测试
这里我们尝试在每个节点创建一个容器,然后进行集群部署验证。这里给了一个样例。
cat << EOF > /root/daemonset.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: debian
spec:
template:
metadata:
labels:
debian: debian
spec:
containers:
- name: debian
image: dockerhub.azk8s.cn/library/debian
command: ["sleep", "999999d"]
resources:
requests:
cpu: 100m
memory: 100Mi
EOF
kubectl create -f /root/daemonset.yaml
这里我写了一个小工具可以自动进行各个节点的容器之间的网络验证,自动统计哪些节点还没有正常运行。后面我会再开源出来放到博客里。
清理命令
有时候安装失败或者清理环境时一些常用的命令,也整理在了下面。
清理环境
该命令主要用于将kubeadm安装的本节点恢复到安装前。需要输入yes确认。该命令适用于master和node节点。
kubeadm reset
清理cni0网桥
重复安装有时候会导致cni0的配置错误,可以通过删除cni0网桥,然后重新创建实现故障恢复。
apt-get install bridge-utils -y
ifconfig cni0 down
brctl delbr cni0
systemctl restart kubelet
清理iptables
kubeadm清理时不会清理iptables,里面会有很多冗余的规则,可以使用该命令清理。该命令慎用。
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
清理bridge的残余信息
在使用flannel时,有时mac信息过时没能更新,导致无法将消息转发到目标机器的flannel.1。可以在检查后,通过bridge命令清理过期的mac信息。
flannel的具体原理和排障可以参考我之前的博客,《flannel vxlan工作基本原理及常见排障思路》。其中介绍更为详细。
route -n
arp -e
bridge fdb show
bridge fdb del 76:21:60:e5:ea:0b dev flannel.1
参考资料
- Creating a single master cluster with kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
- Options for Highly Available topology https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
- Creating Highly Available clusters with kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
使用kubeadm进行单master(single master)和高可用(HA)kubernetes集群部署的更多相关文章
- 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...
- kubernetes教程第一章-kubeadm高可用安装k8s集群
目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...
- 【二】Kubernetes 集群部署-kubeadm方式(亲测)
一.概述 本次部署 Kubernetes 集群是通过 kubeadm 工具来进行部署, kubeadm 是 Kubernetes 官⽅提供的⽤于快速部署 Kubernetes 集群的⼯具,利⽤其来部署 ...
- Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记
目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...
- 【Containerd版】Kubeadm高可用安装K8s集群1.23+
目录 基本环境配置 节点规划 网段规划及软件版本 基本配置 内核升级配置 K8s组件及Runtime安装 Containerd安装 K8s组件安装 高可用实现 集群初始化 Master01初始化 添加 ...
- Kubernetes集群部署之四Master节点部署
Kubernetes Master节点部署三个服务:kube-apiserver.kube-controller-manager.kube-scheduler和一个命令工具kubectl. Maste ...
- 使用Kubeadm搭建高可用Kubernetes集群
1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...
- k8s 组件介绍__单Master集群部署
参考链接:https://github.com/opsnull/follow-me-install-kubernetes-cluster kubernetes 概述 1.kubernetes 是什么 ...
- RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)
以下部署方式结合众多博友的博客,经过自己一步一步实际搭建,如有雷同,侵权行为,请见谅...其中遇到不少的坑,希望能帮到更多的人,现在很少能找到一份完整版4.2.6版本的搭建教程了,如果你有幸遇见,那么 ...
随机推荐
- python 版本及pip安装相关
python2与python3 由于历史原因,Python有两个大的版本分支,Python2和Python3,又由于一些库只支持某个版本分支,所以需要在电脑上同时安装Python2和Python3,因 ...
- sizeof +数组名
链接:https://www.nowcoder.com/questionTerminal/daa5422cb468473c9e6e75cc98b771de 来源:牛客网 sizeof一个数组名称的时候 ...
- poj 2762
Tarjan + TopsortTarjan 缩点Topsort 判断 Topsort 判断:在DAG中若初始状态下存在多于1个入度为0的点则说明这些 入度为0的点之间不会有路径可达若不存在入度为0的 ...
- java 内部类简单总结
在java中,一个类可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类.不过对于Java虚拟机而言,它是不知道内部类这回事的, 每个内部类最后都会被编译为一个独立的类,生成一个独立 ...
- GAN生成式对抗网络(四)——SRGAN超高分辨率图片重构
论文pdf 地址:https://arxiv.org/pdf/1609.04802v1.pdf 我的实际效果 清晰度距离我的期待有距离. 颜色上面存在差距. 解决想法 增加一个颜色判别器.将颜色值反馈 ...
- 7.27T2
不可做题 sol:首先有个很显然的性质就是答案一定是在叶子上最优,然后画画图发现就是从最底层看,如果一条链就看做一个点,向上的第一颗非链的节点,它的儿子数-1就会对答案贡献,所有这样的累加起来就是答案 ...
- openpyxl模块(excel操作)
openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读 ...
- 用docker 下载NGINX nginx安装错误:No package nginx available
docker 内安装 nginx,提示 解决方案: 1,备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.rep ...
- Java排序之归并排序
Java排序之归并排序 1. 简介 归并排序的算法是将多个有序数据表合并成一个有序数据表.如果参与合并的只有两个有序表,则成为二路合并.对于一个原始的待排序数列,往往可以通过分割的方法来归结为多路合并 ...
- 最全的tcpdump使用详解
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...