适用于小型企业的带电池的高可用性Kubernetes

2020-05-25 17:57:03

Kindie(Kubernetes个人)是一种针对个人或小企业的固执己见的Kubernetes集群设置。随附电池,让您可以立即投入运行并增加生产工作负荷。

Sysadmin、DevOps、使用Linux的云工程师和Kubernetes的经验,希望构建一个Kubernetes集群用于生产用途,并将重点放在Web工作负载上。您应该可以在几小时内准备好群集。如果您不了解这里的一些信息,请在下面评论或在互联网上搜索。本指南不是为完全的初学者编写的,但我们尽量使其易于理解,而不涉及太多细节。

您可以随意更改设置,但您可以自行决定。即使我们声称这是为我们自己准备好的生产,但它可能不是为你准备的。因此,进一步调整和测试此设置,直到您满意为止。为了节省时间,我们故意使用root用户而不是sudo。因为我们知道我们在做什么(大多数时候)。

Ubuntu服务器20.04 ISO下载并在U盘上安装NUC。

核心路由器服务于内部网络10.0.0.0/16。这与AWS VPC等公有云服务中的默认网络是内联的。有足够的空间来扩展您的群集,而且您可能永远不会使用这里的所有可分配地址。在此范围内,我们有以下静态地址:

10.0.1.0=>;分配给保持连接的主机的浮动IP。此地址高度可用,因此用于Kubernetes API服务器的群集端点和进入群集的HTTP。

此外,还有一个支持系统核心的可选UPS:路由器+Synology。Synology还公开NFS,以便节点可以将其用作中央存储。

上面仅显示了有3个主节点和N个工作节点,其中N大于或等于零。每个节点将运行HA的入口控制器。在此设置中,我们不污染主节点,以便可以在它们上调度常规工作负载;因此,将它们当作工作节点对待。

将路由器配置为内部网络:10.0.0.0/16,并按照网络架构图中的说明创建端口转发规则。

创建类型A的通配符DNS记录(如果需要,也可以创建CNAME):*.app.example.dev=>;your_public_ip。

创建另一个类型为A的通配符DNS记录(如果需要,也可以创建CNAME):*.sys.example.dev=>;your_public_ip。

在Synology中创建一个名为node1的虚拟机,内存为7 GB,磁盘为100 GB,安装ubuntu-server:

如上所述安装所有其他物理/专用节点(显然对节点2使用10.0.1.2/16,对节点3使用10.0.1.3/16,等等…)。

此时,您有3个节点在运行:node1、node2和node3。因为前3个节点是主节点,所以我们将为它们做好准备,使它们都具有Keepalived和kubeadm。对于每个节点,使用您在安装期间使用的ops用户名和密码通过SSH登录到它。登录后,使用sudo su切换到root用户,然后再次输入密码。

VRRP_INSTANCE VI_1{状态主接口ens3虚拟路由器id 101优先级100 advert_int 1身份验证{auth_type pass auth_pass随机字符串_HERE}虚拟IP地址{10.0.1.0}}。

如果需要,请将RANDOM_STRING_HERE替换为您选择的强密码(因为这是内部网络,这不是什么大事)。

但是,必须设置正确的接口名称。你可以用ip a找到它。

我们对所有主节点使用相同的mainalived.conf,以便随机选择活动的主节点。如果需要,可以随意调整优先级以影响首选项。

cat>;/etc/module-load.d/tainerd.conf<;<;EOF overlay br_netfilter EOFmodbe overlaymodbe br_netfilter#setup必需的sysctl参数,这些参数在重新启动后仍然存在。cat>;/etc/sysctl.d/99-kubernetes-cri.conf<;<;EOF net.bridge-nf-call-iptables=1net.ipv4.ip_ward=1net.bridge-nf-call-ip6tables=1EOFsysctl--systemcurl-fsSL https://download.docker.com/linux/ubuntu/gpg|APT-KEY ADD-ADD-APT-REPORITORY\";DEB[ARCH=AMD64]https://download.docker.com/linux/ubuntu\$(lsb_release-cs)\STRISE";APT-GET UPDATE&;&。apt-get install-y tainerd.iomkdir-p/etc/tainerdtainerd config default>;/etc/tainerd/config.tomlsystemctl重新启动tainerd。

apt-get update&;&;apt-get install-y apt-Transport-https curlcurl-s https://packages.cloud.google.com/apt/doc/apt-key.gpg|apt-key add-cat<;<;eoff|sudo tee/etc/apt/Soures.list.d/kubernet.list deb https://apt.kubernetes.io/kubernetes-xiial main EOFapt-get updateapt-get install-y kubelet kubeadm kubectlapt-mark hold kubelet.list deb kubernetes-xiial main EOFapt-get updateapt-get install-y kubelet kubeadm kubectlapt-mark hold kubelet。

要在node1上安装第一个主节点,我们首先在node2和node3上关闭Keepalived:

您的Kubernetes控制平面已成功初始化!要开始使用群集,您需要以普通用户身份运行以下命令:mkdir-p$HOME/.kube sudo cp-i/etc/Kubernetes/admin.conf$HOME/.kube/config sudo chown$(id-u):$(id-g)$HOME/.kube/config您现在应该将Pod网络部署到群集。Run";kubece。使用下列选项之一:https://kubernetes.io/docs/concepts/cluster-administration/addons/You现在可以加入任意数量的控制平面节点,在每个节点上运行以下命令作为根:kubeadm join cluster-endpoint.sys.example.dev:6443--Token XXXX.XXXX\-DISCOVERY-TOKEN-CA-CERT-HASH SHA256:XXXX\--CONTROL-PLAN--CERTIFICATE-KEY XXXX请注意,证书密钥授予访问群集敏感数据的权限,请对其保密!为安全起见,上载的证书将。如有必要,您可以使用";kubeadm初始阶段Upload-certs--Upload-certs&34;之后重新加载证书。然后,您可以通过在每个工作节点上以root身份运行以下命令来加入任意数量的工作节点:kubeadm join cluster-endpoint.sys.example.dev:6443--Token XXXX.XXXX\-Discovery-Token-ca-cert-hash sha256:XXXX。

要安装node2和node3,请以ops身份登录到节点并切换到root,然后执行:

名称状态角色时效VERSIONnode1就绪主机3d2h v1.18.3node2就绪主机3d2h v1.18.3node3就绪主机5h46M v1.18.3

如果您执行kubectl Get Pods-A操作,您将看到Coredns未正确启动:

root@node1:/home/ops#kubectl get pods-ANAMESPACE名称就绪状态重新启动AGEkube-系统核心-66bff467f8-2bqht 0/1挂起07m15skube-系统核心-66bff467f8-17pbt 0/1挂起07m15s.。

root@node1:/home/ops#kubectl get pods-ANAMESPACE名称就绪状态重新启动AGEkube-system calico-kube-Controller-789f6df884-b8tsg 1/1运行0 4m58skube-system calico-node-9fgqj 1/1运行0 4m59skube-system coredns-66bff467f8-2bqht 1/1运行0 13mkkb。

root@node1:/home/ops#kubectl run--rm=true--i--tty busybox--image=busybox--Restart=Never--ps如果没有看到命令提示符,请尝试按Enter键。错误连接,回退到日志:无法升级连接:容器busybox在pod busybox_defaultPID中找不到用户时间命令1 root 0:00 pspod";busybox&34;已删除。

现在,我们的集群中运行着3个主节点。我们可以测试API服务器的高可用性。为此,我们首先需要在node2和node3上启动Keepalived:

您将注意到,node1当前拥有主IP。让我们将kubeconfig从node1复制到您的本地计算机:

现在您应该能够从本地计算机执行kubectl命令了。例如,做以下事情:

kubectl获取节点名称状态角色时效版本node1就绪主机3d2h v1.18.3node2就绪主机3d2h v1.18.3node3就绪主机5h46M v1.18.3

现在,如果重新启动node1,主IP会自动由另一个节点接管。因此,当node1重新启动时,kubectl命令仍然有效。作为练习,找出哪个故障转移节点拥有主IP。

现在我们已经有了一个运行有3个主服务器的Kubernetes集群和一个API服务器的高可用性端点,我们可以继续设置服务了。从现在开始,您可以从本地机器与Kubernetes集群交互。

Helm Repo添加稳定的https://kubernetes-charts.storage.googleapis.com/helm Repo更新cat>;metrab-config.yaml<;<;EOF apiVersion:v1种类:配置映射元数据:名称空间:sys名称:metalb-config data:config:|address-pool:-name:default protocol:layer 2地址:-10.0.200.0-10.0.255.0EOFkubectl application-f metalb-config.yamlhelm安装金属稳定/金属配置数据:配置:|地址池:-名称:默认协议:层2地址:-10.0.200.0-10.0.255.0EOFkubectl应用-f金属/金属配置.yamlhelm安装金属稳定/金属配置数据。

cat>;nginx-inress-values.yaml<;<;eOF控制器:Kind:DaemonSet守护进程:useHostPort:TRUE HOSTPORT:HTTP:30080 HTTPS:30443服务:ENABLED:FALSE度量:ENABLED:TRUE SERVICE:ANNOTIONS:prometheus.io/sccup:";true";prometheus.io/port:";10254";defaultBackend:image:pository:cinaq/default-backend tag:1.2复制计数:2 EOFhelm安装nginx-inress稳定/nginx-inress--命名空间sys-f nginx-inress-values.yaml。

helm repo add jetstack https://charts.jetstack.iohelm repo updatekubectl Apply--VALIDATE=FALSE-f https://github.com/jetstack/cert-manager/releases/download/v0.14.2/cert-manager.crds.yamlhelm安装证书管理器Jetstack/证书管理器--命名空间sys--v0.14.2cat>;Issuer_letscrypt.yaml<;<;EOF apiVersion:cert-manager.io/v1alpha2 Kind:ClusterIssuer元数据:名称:letscrypt命名空间:sys spec:acme:#acme服务器URL服务器:https://acme-v02.api.letsencrypt.org/directory#用于acme注册电子邮件的电子邮件地址:[email protected]#用于存储acme帐户私钥Private KeySecretRef:名称:letscrypt#启用HTTP-01质询提供程序解算器:-http01:

Helm安装nfs-storage稳定/nfs-client-provisioner--命名空间sys--set nfs.server=10.0.0.2--set nfs.path=/volume1/kuberneteskubectl修补程序存储类nfs-client-p';{";METADATA";:{";ANNOTIONS";:{";storageclass.kubernetes.io/is-default-class";:";TRUE";}}。

cat>;prometheus-values.yaml<;<;EOF alert tmanager:replicaCount:2推送网关:replicaCount:2 server:replicaCount:2 stateSet:Enabled:true EOFhelm安装Prometheus稳定/prometheus-n监控-f prometheus-values.yaml。

cat>;grafana-resources.yaml<;<;EOF api版本:扩展/v1beta1种类:入口元数据:名称:grafana-inress命名空间:监视批注:cert-manager.io/cluster-Issuer:";letscrypt";nginx.ingress.kubernetes.io/proxy-body-size:1M nginx.ingress.kubernetes.io/。规范:tls:-hosts:-grafan a.sys.example.dev SecretName:dev-grafana-sys-grafana-tls规则:-host:grafan a.sys.example.dev http:path:-path:/backend:serviceName:grafana servicePort:80 EOF

现在您应该可以通过公共url:http://grafana.sys.example.dev访问grafana,并注意到您会被自动重定向到HTTPS,并且它是由LetsEncrypt签名的。

$kubectl get pods-A-o wideNAMESPACE名称就绪状态重新启动期限IP节点提名节点就绪GATESkube-system calico-kube-Controller-789f6df884-g2gm4 1/1运行2 3d2h 192.168.166.149节点1<;None&>;None>;Kube-system calico-node-8nv5r 1/1运行16小时。无>;kube-system calico-node-tslz8 1/1运行6 3d2h 10.0.1.2节点2<;无>;<;无>;kube-系统核心-66bff467f8-6dsk5 1/1运行1 5h24m 192.168.135.30节点3<;无>;<;无>;kube;系统核心-66bff4。Kube-system etcd-node1 1/1运行3 3d2h 10.0.1.1节点1<;None>;None>;Kube-System etcd-node2 1/1运行7 3d2h 10.0.1.2 node2<;None>;None>;Kube-System etcd-node3 1/1运行1 6h27M 10.0.1.3节点3<;None>。None>;None>;Kube-System Kube-apiserver-node2 1/1运行9 3d2h 10.0.1.2节点2<;None>;None>;Kube-System Kube-apiserver-node3 1/1运行1 6h27M 10.0.1.3节点3<;None>;None>;KUBE-SYSTEM KUBE-CONTROLLER-MANAGER-。Kube-System Kube-Controller-manager-node2 1/1运行35 3d2h 10.0.1.2节点2<;None&>;None>;Kube-System Kube-Controller-manager-node3 1/1运行4 6h27m 10.0.1.3节点3&>;None>;None>;Kube-System Kube-Proxy-cj42b 1/1运行5 3d2h 10.0.1.2节点。Kube-System Kube-Proxy-nt7zn 1/1运行2 3d2h 10.0.1.1节点1<;None&>;None>;Kube-System Kube-Proxy-s8vgt 1/1运行1 6h27M 10.0.1.3节点3&>;None>;None>;Kube-System Kube-Scheduler-node1/1运行30 3d2h 10.0.1.1节点1。Kube-system Kube-Scheduler-node2 1/1运行33 3d2h 10.0.1.2 node2<;None&>;None>;Kube-System Kube-Scheduler-node3 1/1运行5 6h27M 10.0.1.3节点3&1运行33 3d2h 10.0.1.2 node2<;None>;监控grafana-74f7c48746-9dvxf 1/1运行0 3h31M。无&>监控LOKI-0 1/1运行04h39m 192.168.104.47节点2<;None>;监控Loki-Promail-785qg 1/1运行4 3d1h 192.168.104.3节点2<;None>;None>;监控Loki-ProTail-8fnkw 1/。监控LOKI-PROMPTail-8vwpf 1/1运行1 6h27m 192.168.135.37节点3<;None&>;None>;监控Prometheus-alert tmanager-6fcfd7bb84-mvm9k 2/2运行2 5h11M 192.168.135.33节点3<;None&>;None>;监控Prometheus-Alertt3<;None&>t;None>;None>;监控Prometheus-AlertManager-6fcfd7bb84-mvm9k 2/2运行2 5h11M 192.168.135.33节点。监控prometheus-kube-state-metrics-79f5b77cb8-4kh9x 1/1运行1 5h24M 192.168.135.27节点3<;None&>;None>;监控普罗米修斯节点导出器-278sb 1/1运行1 6h22M 10.0.1.3节点3<;None>;监控Prometheus-Node-Exporter-czrbw1/1运行4 3D 10.0.1.2节点2<;None>;None<;None>;None&>;监控普罗米修斯节点导出器-Czrbw1/1运行4 3D 10.0.1.2节点2<;无。监视Prometheus-node-exporter-xfw7s 1/1运行1 3D 10.0.1.1节点1<;None&>;监视Prometheus-Push Gateway-5d85697467-88mp5 1/1运行0 3h27m 192.168.104.23 node2<;None&>;监视Prometheus-Push Gateway-5d85697。监控Prometheus-server-0 2/2运行0 3h21m 192.168.104.19节点2<;None&>;None>;监控Prometheus-SERVER-1 2/2运行0 3h20M 192.168.135.44节点3>;None>;None>;sqirly PostgreSQL-545d95dcb9-npnbj 1/1运行0 5。<;None>;sqirly sqirly-5d674b8d5b-mnzzv 1/1运行5 5h24M 192.168.166.152节点1<;None>;sys cert-manager-678bc78d5d-gmb86 1/1运行1 5h24M 192.168.135.26节点3<;None>;<;None&。sys cert-manager-webhook-5b5485577f-5wz6c 1/1运行1 5h24M 192.168.135.40节点3<;None>;None>;sys Distcc-Deployment-5d6fb547d7-pjhd7 1/1运行1 5h24M 192.168.135.42 node3<;None<;None>;sys金属扬声器-4bpqd 1/1运行1 3d2h 10.0.1.1节点1<;无>;无>;系统金属扬声器-t2jpt 1/1运行4 3d2h 10.0.1.2节点2<;无>;系统金属扬声器-w4q2s 1/1运行1 6h27m 10.0.1.3节点3<;无>;系统金属扬声器-w4q2s 1/1运行1 6h27m 10.0.1.3节点3<;无>;系统金属扬声器-w4q2s 1/1运行1 6h27m 10.0.1.3节点3<;无&