当前版本的kubeadm已经原生支持部署HA模式集群,非常方便即可实现HA模式的kubernetes集群。本次部署基于飞腾麒麟的ARM架构,原则上来说,其他ARM架构也适配,系统版本是:麒麟V10,docker版本:18.09.8,kubernetes适用1.21.x版本,本文采用1.21.6。
准备了六台机器作安装测试工作,机器信息如下:
关闭防火墙:
systemctlstopfirewalldsystemctldisablefirewalld关闭selinux:
sed-i's/enforcing/disabled/'/etc/selinux/configsetenforce0关闭swap:
swapoff-avim/etc/fstab流量转发
cat>/etc/sysctl.d/k8s.conf< 安装docker-compose yuminstalldocker-composeMaster01节点的ETCD的docker-compose.yml: 使用阿里云提供的源安装软件包 cat>/etc/sysconfig/modules/ipvs.modules< 本文采用DNS轮询解析实现简单的负载均衡,在Dns01,Dns02节点上部署DNS。 1、添加/etc/dnsmasq/hosts.dnsmasq文件,添加域名解析 172.16.2.1api.k8s.com172.16.2.2api.k8s.com172.16.2.3api.k8s.com2、docker-compose部署dnsmasq服务: version:"3"services:dnsmasq:image:gists/dnsmasq:2.85command:-q--log-facility=---addn-hosts=/etc/hosts.dnsmasqnetwork_mode:"host"volumes:-/root/dnsmasq/hosts.dnsmasq:/etc/hosts.dnsmasqcap_add:-NET_ADMINrestart:alwaysstdin_open:truetty:true3、在除了部署dnsmasq服务的其他所有节点上(包括Master和Node),配置DNS(如果有默认启动的DNS服务,需要先将其停止) cat< kubeadminit--config=kubeadm-config.yaml--upload-certs如果镜像已经提前下载,安装过程大概30秒,输出结果如下: opensslx509-pubkey-in/etc/kubernetes/pki/ca.crt|opensslrsa-pubin-outformder2>/dev/null|openssldgst-sha256-hex|sed's/^.*//'加载管理员配置文件 方式一: mkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config方式二: calico-rbac.yml: kubectlapply-fcalico-rbac.ymlkubectlapply-fcalico.yml检查各节点组件运行状态: root@master01:~#kubectlgetnodesNAMESTATUSROLESAGEVERSIONmaster01Readymaster13mv1.21.6root@master01:~#kubectlgetpo-nkube-systemNAMEREADYSTATUSRESTARTSAGEcalico-kube-controllers-697d964cc4-p8jcn1/1Running032scalico-node-wg9l41/1Running032scoredns-89cc84847-l48q81/1Running013mcoredns-89cc84847-mf5nr1/1Running013mkube-apiserver-master011/1Running012mkube-controller-manager-master011/1Running012mkube-proxy-9l2871/1Running013mkube-scheduler-master011/1Running012m9安装Master02和Master03节点在master02,master03上执行加入集群命令: kubeadmjoinapi.k8s.com:6443--tokenvbcbuv.osci507haylbl00i\--discovery-token-ca-cert-hashsha256:87540f79ca94e422f3600a1e4d3e8669d0f4125d46877e296b790810a1f9aade\--control-plane--certificate-key8a36d44089b5a08270e511834ebd3f2a39be6644a78a702fbb1b6f1fceb8ea1f可以查看下各节点及组件运行状态: root@master01:~#kubectlgetnodesNAMESTATUSROLESAGEVERSIONmaster01Readymaster25mv1.21.6master02Readymaster8m6sv1.21.6master03Readymaster7m33sv1.21.6root@master01:~#kubectlgetpo-nkube-systemNAMEREADYSTATUSRESTARTSAGEcalico-kube-controllers-697d964cc4-p8jcn1/1Running012mcalico-node-lvnl81/1Running07m35scalico-node-p8h5z1/1Running08m9scalico-node-wg9l41/1Running012mcoredns-89cc84847-l48q81/1Running025mcoredns-89cc84847-mf5nr1/1Running025mkube-apiserver-master011/1Running024mkube-apiserver-master021/1Running08m9skube-apiserver-master031/1Running07m35skube-controller-manager-master011/1Running024mkube-controller-manager-master021/1Running08m9skube-controller-manager-master031/1Running07m35skube-proxy-9l2871/1Running025mkube-proxy-jmsfb1/1Running08m9skube-proxy-wzh621/1Running07m35skube-scheduler-master011/1Running024mkube-scheduler-master021/1Running08m9skube-scheduler-master031/1Running07m35s10安装Node节点Master节点安装好了Node节点就简单了,在各个Node节点上执行。 kubeadmjoinapi.k8s.com:6443--tokenvbcbuv.osci507haylbl00i\--discovery-token-ca-cert-hashsha256:87540f79ca94e422f3600a1e4d3e8669d0f4125d46877e296b790810a1f9aade11DNS集群部署删除原单点coredns kubectldeletedeploycoredns-nkube-system部署多实例的coredns集群,参考配置coredns.yml: kubectlapply-fmetrics-server.yaml查看监控数据: kubectlgetsecrets-nkube-system|grepk8dash-sa-token|awk'{print$1}'|xargskubectldescribesecret-nkube-system暴露本地端口到Master01访问测试: kubernetes中的Service暴露到外部有三种方式,分别是: LoadBlancerService是kubernetes深度结合云平台的一个组件;当使用LoadBlancerService暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器来向外暴露服务;目前LoadBlancerService支持的云平台已经相对完善,比如国外的GCE、DigitalOcean,国内的阿里云,私有云Openstack等等,由于LoadBlancerService深度结合了云平台,所以只能在一些云平台上来使用。 NodePortService顾名思义,实质上就是通过在集群的每个node上暴露一个端口,然后将这个端口映射到某个具体的service来实现的,虽然每个node的端口有很多(0~65535),但是由于安全性和易用性(服务多了就乱了,还有端口冲突问题)实际使用可能并不多。 Ingress可以实现使用nginx等开源的反向代理负载均衡器实现对外暴露服务,可以理解Ingress就是用于配置域名转发的一个东西,在nginx中就类似upstream,它与ingress-controller结合使用,通过ingress-controller监控到pod及service的变化,动态地将ingress中的转发信息写到诸如nginx、apache、haproxy等组件中实现方向代理和负载均衡。 Traefik-ingress-controller是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。它支持多种后台(Docker,Swarm,Kubernetes,Marathon,Mesos,Consul,Etcd,Zookeeper,BoltDB,RestAPI,file…)来自动化、动态的应用它的配置文件设置。 相比起Nginx,Traefik更轻量,速度更快,配置更简单,不过功能及拓展性不如Nginx丰富多样,各位可根据实际情况选择。 本次部署中,将Traefik-ingress部署到master01、master02、master03上,监听宿主机的80端口: Namespace和RBAC角色配置: 针对单个应用开启TLS安全访问的步骤: 修改TraefikConfigmap配置文件中的entryPoints,修改更新Configmap后需要重建Traefik容器以便快速应用新的配置。 entryPoints:web:address:":80"##配置80端口,并设置入口名称为webwebsecure:address:":443"##配置443端口,并设置入口名称为websecure创建证书Secret可以使用自建证书或购买证书,自建证书为不受信任证书,地址栏访问时会提示不安全。 #生成证书opensslreq-newkeyrsa:4096-nodes-sha256-keyoutcerts/cloudnil.com.key-x509-days365-outcerts/cloudnil.com.crt#创建证书Secretkubectlcreatesecrettlstls-cert--cert=cloudnil.com.crt--key=cloudnil.com.key-nkube-system修改k8dash的Ingress配置,可以使用原生Ingress或者Traefik拓展的IngressRoute(二选一)。