通过后面的架构概述,能够看出,若想手动部署一套高可用的Kubernetes集群,还是相当麻烦的。所以官网推出了疾速建设Kubernetes集群的工具:Kubeadm。
Kubeadm是一个提供Kubeadm init 和 Kubeadm join命令,用于创立Kubernetes集群的最佳实际“疾速门路”工具。
Kubeadm的指标是在不装置其余性能插件的根底上,建设一个通过Kubernetes一致性测试Kubernetes Conformance tests的最小可行集群。它在设计上并不会装置网络解决方案,而是须要用户自行装置第三方合乎CNI的网络解决方案(如:flannel,calico,weave network等)。
筹备工作
机器
这个太难了,好不容易从生产环境坑蒙拐骗挪进去3台能用的,总算能弄个一主两从的集群,零碎都是CentOS:
机器角色 | IP |
---|---|
master | 10.128.2.53 |
node | 10.128.1.187 |
node | 10.11.7.94 |
配置host
三台机器均配置host,/etc/hosts
文件增加以下配置:
10.128.2.53 kubernetes-master0110.128.1.187 kubernetes-node0110.11.7.94 kubernetes-node02
hostnamectlhostnamectl set-hostname kubernetes-master01
敞开防火墙
systemctl stop firewalldsystemctl disable firewalldsystemctl status firewalld
敞开selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永恒 需重启setenforce 0 # 长期
敞开swap
swapoff -ased -i 's/^[^#].*swap/#&/' /etc/fstabsystemctl daemon-reload
若要启用swap设施,则须要在集群初始化时增加--ignore-preflight-errors=swap,意义为疏忽因swap设施导致的报错
敞开ipv6
echo net.ipv6.conf.all.disable_ipv6=1 >> /etc/sysctl.confecho NETWORKING_IPV6=no >> /etc/sysconfig/networksed -i 's/IPV6INIT=yes/IPV6INIT=no/g' /etc/sysconfig/network-scripts/ifcfg-ens33sysctl -pip a # 查看ipv6是否敞开
将桥接的IPv4流量传递到iptables
cat >/etc/sysctl.d/kubernetes.conf << EOFnet.bridge.bridge-nf-call-ip6tables =1net.bridge.bridge-nf-call-iptables =1EOFsysctl --system # 失效
这个不晓得什么意思然而通过Kubeadm装置Kubenetes集群时会校验。这里也搜到一篇文章阐明net.bridge.bridge-nf-call-iptables的作用
参数作用,然而我示意看不懂。
装置容器运行时
三台机器必须都装置容器运行时,这里我应用Dokcer,并且须要配置Docker的Cgroup Driver为systemd
:
vi /etc/docker/daemon.json{ "exec-opts":["native.cgroupdriver=systemd"]}systemctl restart docker
什么是cgroups?
首先说下容器是什么?容器是一个视图隔离、资源可限度、独立文件系统的过程汇合。cgroups(Control Groups) 是 linux 内核提供的一种机制,作用就是能够对资源进行限度。此外,视图隔离是通过namespace实现,而文件系统是通过chroot实现。
为什么要批改Cgroup Driver
Docker默认的Cgroup Driver是cgroupfs,而Kubernetes 举荐应用 systemd 来代替 cgroupfs。如果不批改,那么同时运行有两个cgroup管制管理器,当资源有压力的状况时,有可能呈现不稳固的状况。并且在kubeadm init时也会呈现正告。
master机器设置免登录node
ssh-keygen -t rsa # 一路默认回车即可ssh-copy-id kubernetes-master01 # 过程中须要输出明码ssh-copy-id kubernetes-node01ssh-copy-id kubernetes-node02ssh root@kubernetes-node01 # 测试是否胜利,切记测试完exit,不然就像我一样捣鼓一下午不胜利才发现问题。。
集群部署
装置kubeadm、kubelet、kubectl
以下操作在所有节点进行
- 增加阿里云YUM源
cat >/etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
- 指定版本装置软件,这里我装置的是1.19.8版本,1.20不再把Docker作为默认的容器运行时了,所以临时抉择1.19版本。
yum install -y kubelet-1.19.8 kubeadm-1.19.8 kubectl-1.19.8systemctl enable kubelet
Master节点装置
kubeadm init --kubernetes-version=1.19.8 --image-repository=registry.aliyuncs.com/google_containers
依照提醒执行下列命令:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
此处要记住打印出的下列命令,在增加Node节点时须要用到:
kubeadm join 10.128.2.53:6443 --token dvt5z4.sdf2rfwprp7byv62 \ --discovery-token-ca-cert-hash sha256:c2262789b43f4fae6a6ed42740abcf077e9f8da379713a0dee6c8d3a2de98fdb
若没留神,可通过kubeadm token list
查看以后的token,默认有效期为24小时,若遗记token或token过期,可应用命令kubeadm token create --print-join-command
从新生成,若初始有问题可通过命令kubeadm reset
重置。
启动kubelet并查看状态:
systemctl start kubeletsystemctl status kubelet
查看此时节点信息:
kubectl get nodes
能够看到master节点是NotReady状态。
部署CNI网络
在应用Docker时咱们就发现,除非网络模式设为host
,否则会产生很多网络上的问题,过后也调研了一些容器跨主机网络通信的解决方案,最终还是抉择了--net=host
共享宿主机网络。
在Kubernetes集群中或者说云原生中,网络同样存在容器跨主机网络通信的问题,始终以来,Kubernetes 并没有专门的网络模块负责网络配置,它须要用户在主机上曾经配置好网络。kubernetes 对网络的要求是:
- 容器之间(包含同一台主机上的容器,和不同主机的容器)能够相互通信
- 容器和集群中所有的节点也能间接通信
Kubernetes 网络的倒退方向是心愿通过插件的形式来集成不同的网络计划,于是便呈现了CNI的概念:
CNI(Container Network Interface)是 CNCF 旗下的一个我的项目,由一组用于配置 Linux 容器的网络接口的标准和库组成,同时还蕴含了一些插件。CNI 仅关怀容器创立时的网络调配,和当容器被删除时开释网络资源。
CNI自身是一种规范的设计和概念,它只专一解决容器网络连接和容器销毁时的资源开释,提供一套框架,所以CNI能够反对大量不同的网络模式。更深刻的在后续深入研究局部再具体学习。
网络插件抉择,calico vs fannel
fannel和calico算是目前网络实现最热门的2个插件,通过简略的比照,calico在性能更好以外,还能够与服务网格 Istio 集成,所以毫不犹豫的抉择calico。
装置calico
curl https://docs.projectcalico.org/manifests/calico.yaml -o calico.yaml
kubectl apply -f calico.yaml
这时kubectl get nodes
命令查看节点状态变为Ready
:
查看组件状态
下列文字于2021年3月16日批改废除
# 都可kubectl get cskubectl get componentstatus
能够看到scheduler与controller-manager是Unhealthy的,按端口提醒查看10251及10252是否有监听
ss -ant|grep 10251ss -ant|grep 10252
发现均未有监听,查看配置文件/etc/kubernetes/manifests/kube-scheduler.yaml
与/etc/kubernetes/manifests/kube-controller-manager.yaml
并将两个配置文件的配置项- --port=0
均正文掉,并重启kubelet,从新查看组件状态
2021年3月16日批改如下:
Kubectl get cs 命令因为平安起因在1.19+版本已废除,查看组件状态应用以下命令
kubectl get po -n kube-system
Node节点装置
systemctl start kubeletkubeadm join 10.128.2.53:6443 --token dvt5z4.sdf2rfwprp7byv62 \ --discovery-token-ca-cert-hash sha256:c2262789b43f4fae6a6ed42740abcf077e9f8da379713a0dee6c8d3a2de98fdb
查看节点:
集群查看
查看节点
[root@promote ~]# kubectl get csWarning: v1 ComponentStatus is deprecated in v1.19+NAME STATUS MESSAGE ERRORscheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"}
查看根底利用
[root@promote ~]# kubectl get po -ANAMESPACE NAME READY STATUS RESTARTS AGEkube-system calico-kube-controllers-6949477b58-mzpbf 1/1 Running 0 16mkube-system calico-node-4jlnb 1/1 Running 0 12mkube-system calico-node-mbxvg 1/1 Running 0 16mkube-system calico-node-r75dk 1/1 Running 0 3m28skube-system coredns-6d56c8448f-sx9nk 1/1 Running 0 24mkube-system coredns-6d56c8448f-vkf9x 1/1 Running 0 24mkube-system etcd-kubernetes-master01 1/1 Running 0 24mkube-system kube-apiserver-kubernetes-master01 1/1 Running 0 24mkube-system kube-controller-manager-kubernetes-master01 1/1 Running 0 14mkube-system kube-proxy-b2jdp 1/1 Running 0 24mkube-system kube-proxy-fjvvs 1/1 Running 0 3m28skube-system kube-proxy-gpwcn 1/1 Running 0 12mkube-system kube-scheduler-kubernetes-master01 1/1 Running 0 14m
至此集群就搭建结束了。
集群测试
还记得后面文章本机mac搭建minikube的过程吗,集群测试我就照着前文来试了一遍,一切正常。附上上文链接。
上面的文章会对集群节点的操作以及多主多从的高可用集群做一些操作尝试。
参考资料
- https://kubernetes.io/zh/docs...
- https://kubernetes.io/zh/docs...