一、前言

平时测试点小东西我用minikube就弄了,但最近要做EFK的部署,需要多节点,因此记录一下安装k8s多节点的过程。

kubeadm是Kubernetes官方提供的用于快速部署Kubernetes集群的工具,本次使用kubeadm部署包含1个master节点及2个node节点的k8s集群。本文是参考https://blog.csdn.net/networken/article/details/84991940 这篇博文部署而成。因为我的设置过科学上网,所以下边的安装很多并没有用阿里云的地址而是直接走的官方地址,如果大家未设置科学上网建议按上边的链接部署。

二、集群环境

主机名 IP 角色 OS 组件 配置
node1 10.53.5.94 master Ubuntu 16.04.1 kube-apiserver
kube-controller-manager
kube-scheduler
kube-proxy
etcd
coredns
calico
8核16G内存
node2 10.53.6.185 node Ubuntu 16.04.1 kube-proxy
calico
8核16G内存
node3 10.53.5.94 node Ubuntu 16.04.1 kube-proxy
calico
8核16G内存

三、配置和安装

注明:无特别说明,以下步骤需要在各个主机配置

1、基本设置

#各个节点配置主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3#配置hosts解析
cat >> /etc/hosts << EOF
10.53.5.94 node1
10.53.6.185 node2
10.53.7.37 node3
EOF#关闭swap
sed -i '/swap/d' /etc/fstab
swapoff -a#查看swap分区是否开启
swapon -a#确认时间同步
sudo apt install -y chrony
systemctl enable --now chronyd
chronyc sources && timedatectl

2、加载ipvs模块
kuber-proxy代理支持iptables和ipvs两种模式,使用ipvs模式需要在初始化集群前加载要求的ipvs模块并安装ipset工具。另外,针对Linux kernel 4.19以上的内核版本使用nf_conntrack 代替nf_conntrack_ipv4。参考

cat > /etc/modules-load.d/ipvs.conf <<EOF
# Load IPVS at boot
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOFsudo systemctl enable --now systemd-modules-load.service#确认内核模块加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4#安装ipset、ipvsadm
sudo apt install -y ipset ipvsadm

  3、安装docker

直接参考官方文档:https://kubernetes.io/docs/setup/production-environment/container-runtimes/

$ sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"$ sudo apt-get update && sudo apt-get install -y containerd.io=1.2.10-3 docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)$ sudo touch /etc/docker/daemon.json
$ sudo vi /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}$ sudo mkdir -p /etc/systemd/system/docker.service.d$ sudo systemctl daemon-reload$ sudo systemctl restart docker

  4、安装kubeadm、kubelet、kubectl
官方文档:https://kubernetes.io/docs/setup/independent/install-kubeadm/

$ sudo apt-get install -y iptables arptables ebtables$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -#编辑文件,添加文件的内容:deb https://apt.kubernetes.io/ kubernetes-xenial main
$ sudo vi /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl# 配置内核参数
$ sudo vi  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1$ sudo sysctl --system

四、部署master节点

1、初始化主节点

官方参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
在master节点运行以下命令初始化master节点:

$ sudo kubeadm init --apiserver-advertise-address=10.53.5.94 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16

初始化命令说明:

  • –apiserver-advertise-address(可选) :kubeadm 会使用默认网关所在的网络接口广播其主节点的 IP 地址。若需使用其他网络接口,请给 kubeadm init 设置 --apiserver-advertise-address= 参数。
  • –pod-network-cidr:选择一个 Pod 网络插件,并检查是否在 kubeadm 初始化过程中需要传入什么参数。这个取决于您选择的网络插件,您可能需要设置 --Pod-network-cidr 来指定网络驱动的
  • CIDR。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,flannel设置为 10.244.0.0/16,calico设置为192.168.0.0/16
  • –image-repository:Kubenetes默认Registries地址是k8s.gcr.io,国内无法访问,在1.13版本后可以增加–image-repository参数,将其指定为可访问的镜像地址,这里使用registry.aliyuncs.com/google_containers。

注意:安装过程会持续几分钟,并且在开始会有两个⚠,那是因为

W0310 10:22:10.392906   23530 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0310 10:22:10.393012   23530 validation.go:28] Cannot validate kubelet config - no validator is available
[init] Using Kubernetes version: v1.17.3
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet......Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 10.53.5.94:6443 --token 1wtkoi.6pp22vg8wyq1xm7v \--discovery-token-ca-cert-hash sha256:e50885161cd99e82c19634b6be816be21e4e4525b8a9b19e923b5038b9291173 

  2、配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具, Master 初始化完成后需要做一些配置工作才能使用kubectl,参考初始化结果给出的命令进行以下配置:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config#验证一下
$ kubectl get pod -A
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-9d85f5447-lmjbg         0/1     Pending   0          5m5s
kube-system   coredns-9d85f5447-xjmhg         0/1     Pending   0          5m5s
kube-system   etcd-node1                      1/1     Running   0          5m21s
kube-system   kube-apiserver-node1            1/1     Running   0          5m21s
kube-system   kube-controller-manager-node1   1/1     Running   0          5m20s
kube-system   kube-proxy-v2jw4                1/1     Running   0          5m5s
kube-system   kube-scheduler-node1            1/1     Running   0          5m20s

3、部署网络插件
  参考:https://github.com/containernetworking/cni
  必须安装pod网络插件,以便pod之间可以相互通信,必须在任何应用程序之前部署网络,CoreDNS不会在安装网络插件之前启动。

  • 安装calico网络插件:

官方文档参考:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
https://docs.projectcalico.org/v3.10/getting-started/kubernetes/
为使calico正常工作,你需要传递–pod-network-cidr=192.168.0.0/16到kubeadm init或更新calico.yml文件,以与您的pod网络相匹配。

kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml

注:如果安装flannel网络插件,必须通过kubeadm init配置–pod-network-cidr=10.244.0.0/16参数。
4、 验证网络插件
安装了pod网络后,确认coredns以及其他pod全部运行正常,查看master节点状态为Ready

$ kubectl get pod -A
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-9d85f5447-lmjbg         1/1     Running   0          5m5s
kube-system   coredns-9d85f5447-xjmhg         1/1     Running   0          5m5s
kube-system   etcd-node1                      1/1     Running   0          5m21s
kube-system   kube-apiserver-node1            1/1     Running   0          5m21s
kube-system   kube-controller-manager-node1   1/1     Running   0          5m20s
kube-system   kube-proxy-v2jw4                1/1     Running   0          5m5s
kube-system   kube-scheduler-node1            1/1     Running   0          5m20s

至此,Kubernetes 的 Master 节点就部署完成了。如果只需要一个单节点的 Kubernetes,现在你就可以使用了。

五、部署node节点

在两个node节点上都执行下边的命令,将其注册到 Cluster 中:

$ kubeadm join 10.53.5.94:6443 --token 1wtkoi.6pp22vg8wyq1xm7v \--discovery-token-ca-cert-hash sha256:e50885161cd99e82c19634b6be816be21e4e4525b8a9b19e923b5038b9291173 #如果执行kubeadm init时没有记录下加入集群的命令,可以通过以下命令重新创建
$ kubeadm token create --print-join-command

六、kube-proxy开启ipvs

修改kube-proxy的configmap,在config.conf中找到mode参数,改为mode: "ipvs"然后保存:

kubectl -n kube-system get cm kube-proxy -o yaml | sed 's/mode: ""/mode: "ipvs"/g' | kubectl replace -f - #或者手动修改
kubectl -n kube-system edit cm kube-proxykubectl -n kube-system get cm kube-proxy -o yaml | grep modemode: "ipvs"#重启kube-proxy pod
kubectl -n kube-system delete pods -l k8s-app=kube-proxy#确认ipvs模式开启成功
[root@kmaster ~]# kubectl -n kube-system logs -f -l k8s-app=kube-proxy | grep ipvs
I1026 04:11:46.474911       1 server_others.go:176] Using ipvs Proxier.
I1026 04:11:42.842141       1 server_others.go:176] Using ipvs Proxier.
I1026 04:11:46.198116       1 server_others.go:176] Using ipvs Proxier.

日志中打印出Using ipvs Proxier,说明ipvs模式已经开启。

七、安装Helm

1、在官网下载指定想要版本的helm并传入服务器:https://github.com/helm/helm/releases

tar zxvf helm-xxxxx-linux-amd64.tar.gz
mv liniux-amd64/helm /usr/local/bin
helm version #查看helm client版本

2、创建rbac-config.yaml,并输入以下内容:

apiVersion: v1
kind: ServiceAccount
metadata:name: tillernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: tiller
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:- kind: ServiceAccountname: tillernamespace: kube-system

3、然后执行kubectl create -f rbac-config.yaml

4、以上步骤配置成功后,安装tiller。(和helm client对应的版本一样)

# google源
helm init --service-account tiller --upgrade -i gcr.io/kubernetes-helm/tiller:v2.11.0# 阿里源
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

参数--stable-repo-url用于拉取charts所在源的位置,如果不设置则默认访问官方charts

注明:对于 Kubernetes v1.16.0 以上的版本,有可能会碰到 Error: error installing: the server could not find the requested resource 的错误。这是由于 extensions/v1beta1 已经被 apps/v1 替代。相信在2.15 或者 3 版本发布之后, 应该就不会遇到这个问题了。还是生态比较慢的原因。

解决方法是使用如下语句安装:

helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -

八、卸载集群

想要撤销kubeadm执行的操作,首先要排除节点,并确保该节点为空, 然后再将其关闭。

1、在Master节点上运行:

$ kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
$ kubectl delete node <node name>

2、然后在需要移除的节点上,重置kubeadm的安装状态:

$ kubeadm reset -f

3、在每个节点上都执行清理命令

$ kubeadm reset
$ sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
$ sudo apt-get autoremove
$ sudo rm -rf ~/.kube
$ sudo rm -rf /etc/kubernetes

九、卸载后安装指定版本的集群

由于安装的1.17.3版本太高了,做的es项目依赖的api没那么高版本,所以降版本,指定版本1.15.3-00

$ sudo apt-get install -y kubelet=1.15.3-00 kubectl=1.15.3-00 kubeadm=1.15.3-00

下边的步骤就是把第三、四、五、六、七再走一遍,注意版本,docker版本会报警告但影响不大。

十、故障恢复

有次把master这个节点重新启动了  查看 有哪些服务 kubectl get svc  报如下的错误信息

The connection to the server 192.168.37.201:6443 was refused - did you specify the right host or port?

知道是 k8s 集群没有起来 因为之前搭集群的时候 swap 是临时关闭的 所以重启master后 需要在关闭swap

sudo swapoff -a

因为我搭建 k8s 集群用的是 kubeadm

在Kubernetes集群master和nodes上禁用Swap后,运行下面命令重启Kubelet:

sudo systemctl daemon-reload

sudo systemctl restart kubelet

之后就可以用 k8s 的命令了。

【参考文章】

参考文章1:https://blog.csdn.net/networken/article/details/84991940

【Kubernets】——搭建k8s多节点集群相关推荐

  1. docker-compose 搭建 nats-streaming 3节点集群

    nats-streaming-cluster Nats-Streaming Cluster By Docker Compose Nats-Streaming Cluster By Kubernetes ...

  2. 搭建Kubernetes多节点集群

    文章目录 1. 实验环境 2. 系统网络配置 3. 修改节点Hostname 4. 关闭防火墙.SeLinux.Swap分区 5. 设置docker和k8s的yum源 5.1 docker源的配置 5 ...

  3. Vanish搭建CDN的节点集群

    前言: 在不同地域的用户访问网站的相应速度存在差异,为了提高用户访问的相应 速度,优化现有internet中的信息流动,需要在用户和服务器之间加入中间层CDN, 是用户能以最快的速度从最近的地方获得所 ...

  4. hadoop 多节点集群_设置Apache Hadoop多节点集群

    hadoop 多节点集群 我们正在分享有关在基于Linux的机器(多节点)上安装Apache Hadoop的经验. 在这里,我们还将分享我们在各种故障排除方面的经验,并在将来进行更新. 用户创建和其他 ...

  5. 设置Apache Hadoop多节点集群

    我们正在分享有关在基于Linux的机器(多节点)上安装Apache Hadoop的经验. 在这里,我们还将分享我们在各种故障排除方面的经验,并在将来进行更新. 用户创建和其他配置步骤– 我们首先在每个 ...

  6. 【Docker系列】Docker Swarm 多节点集群

    三节点集群搭建 创建3节点swarm cluster的方法 https://labs.play-with-docker.com/ play with docker 网站, 优点是快速方便,缺点是环境不 ...

  7. kubeadm安装K8S单master双节点集群

    宿主机: master:172.16.40.97 node1:172.16.40.98 node2:172.16.40.99 # 一.k8s初始化环境:(三台宿主机) 关闭防火墙和selinux sy ...

  8. SpringCloud 使用Docker搭建Consul节点集群

    一.Docker 环境Consul 集群搭建 1,准备工作,为后面要创建的容器准备consul数据卷 我们在linux 主机上任意一个目录下创建三个不同的目录,为后面创建容器时创建不同的数据容器卷使用 ...

  9. k8s安装3节点集群Fate v1.8.0

    采用k8s,而非minikube, 在3个centos系统的节点上安装fate集群. 本人安装这个v1.8.0版本后,能登陆fateboard,但无法传输数据,问题无法解决.于是选择安装v1.7.2版 ...

  10. 利用kubeadm安装kubernetes1.21.2单节点集群

    利用kubeadm安装kubernetes集群 环境: 1.关闭防火墙, 2.配置好/etc/hosts k8s-master:192.168.248.128 k8s-node01: 192.168. ...

最新文章

  1. 运行时异常与一般异常区别
  2. OVS vswitchd启动(三十七)
  3. 20以内究竟包不包括20?
  4. 闲来无事刷水题、简单博弈论专题、sg函数、洛谷
  5. 在 Java 中初始化 List 的五种方法
  6. C语言编程规范--代码注释
  7. c#划分目录和文件(小白的一点经验)
  8. 配置多个git账号_Git ssh配置(Mac)
  9. vue____后台管理系统搭建(推荐,懒得自己写了)
  10. 微软桌面虚拟化MED-V系列教程
  11. 由于 Exception.tostring()失败,因此无法打印异常字符串
  12. con 元器件符号_multisim元器件符号速查
  13. 企业绩效管理怎么做?
  14. Appcan与后台数据交互,登录例子
  15. Oracle数据库临时表-----会话级的临时表和事务级的临时表
  16. 优雅代码的秘密,都藏在这6个设计原则中
  17. 学机械 计算机,机械设计制造专业
  18. 神经网络之梯度下降法及其实现
  19. solaris 10 ipmp
  20. 国际电工委员会发布标准 IEC 62077:2022 《光纤互连设备和无源元件-光纤环行器-通用规范》

热门文章

  1. 数学之美——google大脑和人工神经网络
  2. 【Android容器组件—AdapterView】
  3. 脑电时频分析II:时频分析
  4. 基于python3,抓取韩寒博客文章
  5. 2021年智慧交通十大热点
  6. 编程珠玑 第一部分 基础
  7. c++ primer plus第六版复习题及答案
  8. dell笔记本外接显示器_小桌面 笔记本外接显示器的正确姿势
  9. Win7下 tts开发
  10. 微软服务器补丁每月几号发布,微软11月安全公告 发布一个紧急级补丁