
您好,Habr亲爱的读者们!
在本出版物中,我想开始撰写一系列有关使用Kubernetes容器部署功能完善的编排环境的文章,以准备进行操作和启动应用程序。
我不仅要讲述如何部署Kubernetes集群,还想讲述安装后如何配置集群,如何向其添加便捷的工具和附加组件以使用微服务架构。
此周期至少包含四篇文章:
- 在它们的第一篇中,我将告诉您如何在裸铁上安装故障安全kubernetes集群,如何安装标准仪表板并配置对其的访问权限,如何安装入口控制器。
- 在第二篇文章中,我将向您展示如何部署Ceph故障转移群集以及如何在Kubernetes群集中开始使用RBD卷。 我还将介绍其他类型的存储(存储),并更详细地考虑本地存储。 此外,我将告诉您如何根据创建的CEPH集群组织S3容错存储
- 在第三篇文章中,我将介绍如何在Kubernetes集群(即Kubernetes上的Percona XtraDB集群)中部署故障转移集群MySql。 另外,我还将描述当我们决定将数据库转移到kubernetes时遇到的所有问题。
- 在第四篇文章中,我将尝试将所有内容放在一起,并告诉您如何部署和运行将使用数据库和ceph卷的应用程序。 我将告诉您如何配置入口控制器以从外部访问我们的应用程序以及来自Let's Encrypt的自动证书订购服务。 另一个是如何自动维护这些证书的最新状态。 在访问控制面板的上下文中,我们还涉及RBAC。 我将简要介绍Helm及其安装。
如果您对这些出版物中的信息感兴趣,欢迎您!
参赛作品:
这些文章适用于谁? 首先,对于那些刚刚开始研究Kubernetes的人。 而且,对于正考虑从整体式服务转向微服务的工程师来说,该周期将非常有用。 所描述的一切都是我的经验,包括将多个项目从整体翻译为Kubernetes时获得的经验。 有经验的工程师可能会对出版物的某些部分感兴趣。
在本系列出版物中,我将不作详细介绍的内容:
- 详细解释什么是kubernetes原语,例如:pod,部署,服务,入口等。
- 我将非常肤浅地考虑CNI(容器网络接口),因此我们使用callico,因此仅列出其他解决方案。
- docker映像构建过程。
- CI \ CD进程。 (也许是单独的出版物,但在整个周期之后)
- 掌舵 关于他的文章很多,我只涉及在群集中安装它和设置客户端的过程。
我想详细考虑的是:
- Kubernetes集群部署的分步过程。 我将使用kubeadm。 但是同时,我将逐步详细地介绍在裸机上安装集群,各种类型的ETCD安装以及为kube admina配置文件的过程。 我将尝试阐明Ingress控制器的所有平衡选项以及工作节点对服务器api的各种访问方案的差异。
我知道今天有很多很棒的工具来部署kubernetes,例如kubespray或同一个牧场主。 也许有人使用它们会更方便。 但是,我认为,有很多工程师想更详细地考虑这个问题。 - CEPH术语和CEPH群集的逐步安装,以及将ceph存储连接到Kubernetes创建的群集的逐步说明。
- 本地存储,与kubernetes集群的连接以及与hostpath等连接的区别
- kubernetes操作员和Percona XtraDB Cluster的部署在操作员的帮助下,并在六个月的生产经验后尝试谈论这种解决方案的优缺点。 我还将分享一些最终确定percona操作员的计划。
目录:
- 主机,主机资源,操作系统和软件版本的列表
- Kubernetes集群HA图
- 开始之前或开始之前
- 填写create-config.sh文件
- 操作系统内核更新
- 准备节点安装Kubelet,Kubectl,Kubeadm和Docker
- 安装ETCD(各种选件)
- 启动第一个Kubernetes向导
- CNI Callico安装
- 启动第二个和第三个kubernetes向导
- 将工作节点添加到集群
- 在用于HA的工作程序节点上安装haproxy
- 安装入口控制器
- 安装Web UI(仪表板)
主机列表和目的地
我集群中的所有节点都将位于虚拟机上,该虚拟机上预装有Debian 9 Stretch系统,内核为4.19.0-0.bpo.5-amd64。 对于虚拟化,我使用Proxmox VE。
表VM及其性能特征:
不必只具有这样的机器配置,但是我仍然建议您遵守官方文档的建议,对于主服务器,请将RAM的容量增加到至少4GB。 展望未来,我想说的是,在CNI Callico的工作中,我遇到了一些小问题
在内存和磁盘性能方面,Ceph也非常贪婪。
我们的生产安装无需使用裸机虚拟化即可工作,但我知道许多示例,其中具有相当适度资源的虚拟机就足够了。 这完全取决于您的需求和工作量。
清单和软件版本
从1.14版开始,Kubeadm不再支持v1alpha3 API版本,并完全切换到了v1beta1 API版本,它将在不久的将来支持该版本,因此在本文中,我将仅讨论v1beta1。
因此,我们相信您已经为kubernetes集群准备了机器。 它们都可以通过网络相互访问,并具有与Internet的“ Internet连接”,并且已安装“干净”操作系统。
对于每个安装步骤,我将阐明命令或命令块在哪些机器上执行。 除非另有说明,否则以root用户身份执行所有命令。
所有配置文件以及准备脚本均可以在我的github中下载
因此,让我们开始吧。
Kubernetes集群HA图

HA群集的近似图。 老实说,我的画家很一般,但我会尝试简单地进行简单地解释,而无需特别研究理论。
因此,我们的集群将由三个主节点和三个工作节点组成。 在每个kubernetes主节点上,etcd(图中的绿色箭头)和kubernetes服务部件将为我们工作。 让我们通称它们-kubeapi。
通过etcd主群集,节点交换kubernetes群集的状态。 我将指示与用于外部流量的入口控制器入口点相同的地址(图中的红色箭头)
在工作程序节点上,kubelet为我们工作,它通过在每个工作程序节点上本地安装的haproxy与kubernetes api服务器通信。 作为kubelet的服务器api地址,我将使用localhost 127.0.0.1:6443,而roundrobin上的haproxy会将请求分散到三个主节点上,它还将检查主节点的可用性。 该方案将允许我们创建HA,并且在主节点之一发生故障的情况下,工作节点将悄悄地向其余两个主节点发送请求。
开始之前
在集群的每个节点上开始工作之前,我们将提供需要工作的软件包:
apt-get update && apt-get install -y curl apt-transport-https git
在主节点上,使用配置模板复制存储库
sudo -i git clone https://github.com/rjeka/kubernetes-ceph-percona.git
检查向导上主机的ip地址是否与kubernetes服务器将在其上侦听的IP地址匹配
hostname && hostname -i master01 10.73.71.25
对于所有主节点也是如此。
确保禁用SWAP,否则kubeadm将引发错误
[ERROR Swap]: running with swap on is not supported. Please disable swap
您可以禁用命令
swapoff -a
记得在/ etc / fstab中发表评论
填写create-config.sh文件
为了自动填写安装kubernetes集群所需的配置,我上传了一个小脚本create-config.sh。 您实际上需要填写8行。 指示主机的IP地址和主机名。 并且还指定etcd tocken,您不能更改它。 我将在脚本的下面提供您需要进行更改的部分。
#!/bin/bash ####################################### # all masters settings below must be same ####################################### # master01 ip address export K8SHA_IP1=10.73.71.25 # master02 ip address export K8SHA_IP2=10.73.71.26 # master03 ip address export K8SHA_IP3=10.73.71.27 # master01 hostname export K8SHA_HOSTNAME1=master01 # master02 hostname export K8SHA_HOSTNAME2=master02 # master03 hostname export K8SHA_HOSTNAME3=master03 #etcd tocken: export ETCD_TOKEN=9489bf67bdfe1b3ae077d6fd9e7efefd #etcd version export ETCD_VERSION="v3.3.10"
操作系统内核更新
此步骤是可选的,因为需要从后端口更新内核,而这样做的风险和风险由您自己承担。 也许您永远不会遇到这个问题,而且如果这样做,即使部署了kubernetes,也可以更新内核。 通常,由您决定。
需要内核更新才能修复旧的Docker错误,该错误仅在Linux内核版本4.18中得到修复。 您可以在此处阅读有关此错误的更多信息。 在kubernetes节点上网络接口的定期挂起中表达了一个错误,错误为:
waiting for eth0 to become free. Usage count = 1
安装操作系统后,我的内核版本为4.9
uname -a Linux master01 4.9.0-7-amd64
在每台机器上执行kubernetes
步骤1
将端口添加回源列表
echo deb http://ftp.debian.org/debian stretch-backports main > /etc/apt/sources.list apt-get update apt-cache policy linux-compiler-gcc-6-x86
步骤2
套件安装
apt install -y -t stretch-backports linux-image-amd64 linux-headers-amd64
步骤3
重新开机
reboot
检查一切正常
uname -a Linux master01 4.19.0-0.bpo.5-amd64 #1 SMP Debian 4.19.37-4~bpo9+1 (2019-06-19) x86_64 GNU/Linux
准备节点安装Kubelet,Kubectl,Kubeadm和Docker
安装Kubelet,Kubectl,Kubeadm
根据kubernetes的文档,我们放置了集群的所有节点
apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl
安装Docker
根据文档中的说明安装docker
apt-get remove docker docker-engine docker.io containerd runc apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
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 docker-ce-cli containerd.io
安装使用Ansible安装Kubelet,Kubectl,Kubeadm和docker git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/playbooks vim masters.ini
在masters组中,注册ip master。
在worker组中,编写工作节点的ip。
# sudo c ansible-playbook -i hosts.ini kubelet.yaml -K ansible-playbook -i hosts.ini docker.yaml -K # sudo ansible-playbook -i hosts.ini kubelet.yaml ansible-playbook -i hosts.ini docker.yaml
如果出于某种原因您不想使用docker,则可以使用任何CRI。 例如,您可以在此处阅读有关内容,但是该主题不在本文讨论范围之内。
ETCD安装
简而言之,我不会深入到理论上:etcd是一种开源的分布式键值存储。 etcd实际上是用GO编写的,并在kubernetes中用作存储集群状态的数据库。 有关更详细的评论,请参阅kubernetes文档 。
etcd可以通过多种方式安装。 您可以在本地安装它并作为守护程序运行,可以在docker容器中运行它,甚至可以将其安装为kubernetes pod。 您可以手动安装它,也可以使用kubeadm安装它(我没有尝试过这种方法)。 可以安装在群集计算机或单个服务器上。
我将在主节点上本地安装etcd并通过systemd作为守护程序运行,以及考虑在docker中安装。 我使用没有TLS的etcd,如果您需要TLS,请参考etcd或kubernetes本身的文档
同样在我的github中将有一个ansible-playbook,用于通过systemd启动安装etcd。
选件编号1
本地安装,通过systemd运行
在所有主服务器上:(在集群的工作节点上,无需执行此步骤)
步骤1
使用etcd下载档案并解压缩:
mkdir archives cd archives export etcdVersion=v3.3.10 wget https://github.com/coreos/etcd/releases/download/$etcdVersion/etcd-$etcdVersion-linux-amd64.tar.gz tar -xvf etcd-$etcdVersion-linux-amd64.tar.gz -C /usr/local/bin/ --strip-components=1
步骤2
为ETCD创建配置文件
cd .. ./create-config.sh etcd
该脚本接受etcd的值作为输入,并在etcd目录中生成一个配置文件。 脚本运行后,完成的配置文件将位于etcd目录中。
对于所有其他配置,脚本按相同原理工作。 它需要一些输入并在特定目录中创建配置。
步骤3
我们启动etcd集群并检查其性能
systemctl start etcd
检查守护程序的性能
systemctl status etcd ● etcd.service - etcd Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2019-07-07 02:34:28 MSK; 4min 46s ago Docs: https://github.com/coreos/etcd Main PID: 7471 (etcd) Tasks: 14 (limit: 4915) CGroup: /system.slice/etcd.service └─7471 /usr/local/bin/etcd --name master01 --data-dir /var/lib/etcd --listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 --advertise-client-urls http://10.73.71.25:2379,http://10.73.71. Jul 07 02:34:28 master01 etcd[7471]: b11e73358a31b109 [logterm: 1, index: 3, vote: 0] cast MsgVote for f67dd9aaa8a44ab9 [logterm: 2, index: 5] at term 554 Jul 07 02:34:28 master01 etcd[7471]: raft.node: b11e73358a31b109 elected leader f67dd9aaa8a44ab9 at term 554 Jul 07 02:34:28 master01 etcd[7471]: published {Name:master01 ClientURLs:[http://10.73.71.25:2379 http://10.73.71.25:4001]} to cluster d0979b2e7159c1e6 Jul 07 02:34:28 master01 etcd[7471]: ready to serve client requests Jul 07 02:34:28 master01 etcd[7471]: serving insecure client requests on [::]:4001, this is strongly discouraged! Jul 07 02:34:28 master01 systemd[1]: Started etcd. Jul 07 02:34:28 master01 etcd[7471]: ready to serve client requests Jul 07 02:34:28 master01 etcd[7471]: serving insecure client requests on [::]:2379, this is strongly discouraged! Jul 07 02:34:28 master01 etcd[7471]: set the initial cluster version to 3.3 Jul 07 02:34:28 master01 etcd[7471]: enabled capabilities for version 3.3 lines 1-19
集群本身的健康状况:
etcdctl cluster-health member 61db137992290fc is healthy: got healthy result from http://10.73.71.27:2379 member b11e73358a31b109 is healthy: got healthy result from http://10.73.71.25:2379 member f67dd9aaa8a44ab9 is healthy: got healthy result from http://10.73.71.26:2379 cluster is healthy etcdctl member list 61db137992290fc: name=master03 peerURLs=http://10.73.71.27:2380 clientURLs=http://10.73.71.27:2379,http://10.73.71.27:4001 isLeader=false b11e73358a31b109: name=master01 peerURLs=http://10.73.71.25:2380 clientURLs=http://10.73.71.25:2379,http://10.73.71.25:4001 isLeader=false f67dd9aaa8a44ab9: name=master02 peerURLs=http://10.73.71.26:2380 clientURLs=http://10.73.71.26:2379,http://10.73.71.26:4001 isLeader=true
使用Ansible在本地安装etcd,并通过systemd运行使用github,我们将使用代码将存储库克隆到将要从其运行剧本的机器上。 这台机器应该对将来的集群的主服务器具有ssh访问权限。
git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/playbooks vim masters.ini
在masters组中,注册ip master。
etcd_version是etcd的版本。 您可以在github的etcd页面上看到它。 在撰写本文时,我正在使用v3.3.10版本。
etcdToken-您可以保留原样,也可以自己生成。
经营剧本团队
如果要在docker中运行etcd,则扰流板下面有一条指令。
使用docker-compose安装etcd,在docker中启动这些命令必须在所有群集主节点上执行。
使用github,我们使用代码克隆存储库
git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona
etcd_version是etcd的版本。 您可以在github的etcd页面上看到它。 在撰写本文时,我正在使用v3.3.10版本。
etcdToken-您可以保留原样,也可以自己生成。
我们把docker-compose
apt-get install -y docker-compose
我们生成一个配置
./create-config.sh docker
在Docker中运行etcd集群的安装
docker-compose --file etcd-docker/docker-compose.yaml up -d
检查容器是否已装好
docker ps
和集群状态等
root@master01:~/kubernetes-ceph-percona# docker exec -ti etcd etcdctl cluster-health member 61db137992290fc is healthy: got healthy result from http://10.73.71.27:2379 member b11e73358a31b109 is healthy: got healthy result from http://10.73.71.25:2379 member f67dd9aaa8a44ab9 is healthy: got healthy result from http://10.73.71.26:2379 cluster is healthy root@master01:~/kubernetes-ceph-percona# docker exec -ti etcd etcdctl member list 61db137992290fc: name=etcd3 peerURLs=http://10.73.71.27:2380 clientURLs=http://10.73.71.27:2379,http://10.73.71.27:4001 isLeader=false b11e73358a31b109: name=etcd1 peerURLs=http://10.73.71.25:2380 clientURLs=http://10.73.71.25:2379,http://10.73.71.25:4001 isLeader=true f67dd9aaa8a44ab9: name=etcd2 peerURLs=http://10.73.71.26:2380 clientURLs=http://10.73.71.26:2379,http://10.73.71.26:4001 isLeader=false
如果出了什么问题
docker logs etcd
启动第一个Kubernetes向导
首先,我们需要为kubeadmin生成一个配置
./create-config.sh kubeadm
我们反汇编kubeadm的配置 apiVersion: kubeadm.k8s.io/v1beta1 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.73.71.25 # API- --- apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable # apiServer: # kubeadm certSANs: - 127.0.0.1 - 10.73.71.25 - 10.73.71.26 - 10.73.71.27 controlPlaneEndpoint: 10.73.71.25 # etcd: # etc external: endpoints: - http://10.73.71.25:2379 - http://10.73.71.26:2379 - http://10.73.71.27:2379 networking: podSubnet: 192.168.0.0/16 # , CNI .
您可以在kubernetes文档中阅读有关CNI子网的信息。
这是最低限度的配置。 对于具有三个向导的群集,可以将其更改为群集的配置。 例如,如果要使用2个向导,则只需在certSAN中指定两个地址。
所有配置参数都可以在kubeadm API说明中找到 。
我们发起第一个大师
kubeadm init --config=kubeadmin/kubeadm-init.yaml
如果kubeadm正常运行,那么在输出处,我们将获得大约以下输出:
You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join 10.73.71.25:6443 --token ivwoap.259retezqf34amx8 \ --discovery-token-ca-cert-hash sha256:b5c93e32457c8e6478782ff62e8ef77acf72738dda59cd603cdf4821abe12ca3 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.73.71.25:6443 --token ivwoap.259retezqf34amx8 \ --discovery-token-ca-cert-hash sha256:b5c93e32457c8e6478782ff62e8ef77acf72738dda59cd603cdf4821abe12ca3
CNI Calico安装
现在是时候建立一个我们的pod可以在其中工作的网络。 我使用印花布,我们会放上它。
对于初学者,请配置kubelet的访问权限。 我们在master01上执行所有命令
如果您以root身份运行
export KUBECONFIG=/etc/kubernetes/admin.conf
如果来自简单用户
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
您也可以从笔记本电脑或任何本地计算机上管理群集。 为此,请将/etc/kubernetes/admin.conf文件复制到便携式计算机或$ HOME / .kube / config中的任何其他计算机上
我们根据Kubernetes文档放置了 CNI
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
我们等到所有豆荚升起
watch -n1 kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-59f54d6bbc-psr2z 1/1 Running 0 96s kube-system calico-node-hm49z 1/1 Running 0 96s kube-system coredns-5c98db65d4-svcx9 1/1 Running 0 77m kube-system coredns-5c98db65d4-zdlb8 1/1 Running 0 77m kube-system kube-apiserver-master01 1/1 Running 0 76m kube-system kube-controller-manager-master01 1/1 Running 0 77m kube-system kube-proxy-nkdqn 1/1 Running 0 77m kube-system kube-scheduler-master01 1/1 Running 0 77m
启动第二个和第三个kubernetes向导
在启动master02和master03之前,您需要使用创建集群时kubeadm生成的master01复制证书。 我将通过scp复制
在master01上
export master02=10.73.71.26 export master03=10.73.71.27 scp -r /etc/kubernetes/pki $master02:/etc/kubernetes/ scp -r /etc/kubernetes/pki $master03:/etc/kubernetes/
在master02和master03上
为kubeadm创建配置
./create-config.sh kubeadm
并将master02和master03添加到集群
kubeadm init --config=kubeadmin/kubeadm-init.yaml
几个网络接口出现毛刺!在生产中,我使用kubernetes v1.13.5和calico v3.3。 而且我没有这样的故障。
但是在准备本文并使用稳定版本时(在撰写本文时为v1.15.1 kubernetes和3.8版callico),我遇到了一个问题,该问题表示为CNI启动错误
root@master01:~/kubernetes-ceph-percona# kubectl get pods -A -w NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-658558ddf8-t6gfs 0/1 ContainerCreating 0 11s kube-system calico-node-7td8g 1/1 Running 0 11s kube-system calico-node-dthg5 0/1 CrashLoopBackOff 1 11s kube-system calico-node-tvhkq 0/1 CrashLoopBackOff 1 11s
当服务器具有多个网络接口时,这是calico守护程序设置故障
在githab上,此故障有一个问题https://github.com/projectcalico/calico/issues/2720
通过编辑守护程序集calico-node并将IP_AUTODETECTION_METHOD参数添加到env来解决此问题。
kubectl edit -n kube-system ds calico-node
添加IP_AUTODETECTION_METHOD参数以及该向导在其上运行的接口的名称; 在我的情况下是ens19
- name: IP_AUTODETECTION_METHOD value: ens19

检查集群中的所有节点均已启动并正在运行
# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 28m v1.15.1 master02 Ready master 26m v1.15.1 master03 Ready master 18m v1.15.1
活着的氧化钙是什么
# kubectl get pods -A -o wide | grep calico kube-system calico-kube-controllers-59f54d6bbc-5lxgn 1/1 Running 0 27m kube-system calico-node-fngpz 1/1 Running 1 24m kube-system calico-node-gk7rh 1/1 Running 0 8m55s kube-system calico-node-w4xtt 1/1 Running 0 25m
将工作节点添加到集群
目前,我们有一个集群,其中正在运行三个主节点。 但是主节点是运行kubernetes集群的api,调度程序和其他服务的机器。 为了运行Pod,我们需要所谓的工作程序节点。
如果资源有限,则可以在主节点上运行Pod,但我个人不建议这样做。
在主节点上运行壁炉为了允许在主节点上启动壁炉,请在任何向导上执行以下命令
kubectl taint nodes --all node-role.kubernetes.io/master-
与主节点上一样,在工作服务器上安装kubelet,kubeadm,kubectl和docker节点
安装kubelet,kubeadm,kubectl和docker apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl
安装Docker
根据文档中的说明安装docker
apt-get remove docker docker-engine docker.io containerd runc apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
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 docker-ce-cli containerd.io
安装使用Ansible安装Kubelet,Kubectl,Kubeadm和docker git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/playbooks vim masters.ini
在masters组中,注册ip master。
在worker组中,编写工作节点的ip。
# sudo c ansible-playbook -i hosts.ini kubelet.yaml -K ansible-playbook -i hosts.ini docker.yaml -K # sudo ansible-playbook -i hosts.ini kubelet.yaml ansible-playbook -i hosts.ini docker.yaml
现在该回到我们安装主节点时kubeadm生成的行了。
她对我来说像这样。
kubeadm join 10.73.71.25:6443 --token ivwoap.259retezqf34amx8 \ --discovery-token-ca-cert-hash sha256:b5c93e32457c8e6478782ff62e8ef77acf72738dda59cd603cdf4821abe12ca3
必须在每个工作程序节点上执行此命令。
如果您尚未编写令牌,则可以生成一个新的令牌
kubeadm token create --print-join-command --ttl=0
kubeadm工作后,您的新节点将进入集群并准备工作
This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
现在让我们看一下结果
root@master01:~# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 10d v1.15.1 master02 Ready master 10d v1.15.1 master03 Ready master 10d v1.15.1 worknode01 Ready <none> 5m44s v1.15.1 worknode02 Ready <none> 59s v1.15.1 worknode03 Ready <none> 51s v1.15.1
在工作节点上安装haproxy
现在,我们有了一个具有三个主节点和三个工作节点的工作集群。
问题是现在我们的工作节点没有HA模式。
如果查看kubelet配置文件,我们将看到我们的工作节点仅访问三个主节点之一。
root@worknode01:~# cat /etc/kubernetes/kubelet.conf | grep server: server: https://10.73.71.27:6443
就我而言,这是master03。 使用此配置,如果master03崩溃,则工作程序节点将失去与集群API服务器的通信。 为了使我们的集群完全具备高可用性,我们将在每个工作服务器上安装一个负载均衡器(Haproxy),根据循环机制,它将分散对三个主节点的请求,在工作节点上的kubelet配置中,我们会将服务器地址更改为127.0.0.1:6443
首先,在每个工作程序节点上安装HAProxy。
有一个很好的备忘单可供安装
curl https://haproxy.debian.net/bernat.debian.org.gpg | \ apt-key add - echo deb http://haproxy.debian.net stretch-backports-2.0 main | \ tee /etc/apt/sources.list.d/haproxy.list apt-get update apt-get install haproxy=2.0.\*
安装HAproxy之后,我们需要为其创建配置。
如果在工作节点上没有包含配置文件的目录,则我们将其克隆
git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/
并使用haproxy标志运行配置脚本
./create-config.sh haproxy
该脚本将配置并重新启动haproxy。
检查haproxy是否开始侦听端口6443。
root@worknode01:~/kubernetes-ceph-percona# netstat -alpn | grep 6443 tcp 0 0 127.0.0.1:6443 0.0.0.0:* LISTEN 30675/haproxy tcp 0 0 10.73.75.241:6443 0.0.0.0:* LISTEN 30675/haproxy
现在,我们需要告诉kubelet访问localhost而不是主节点。 为此,请在所有工作节点上的/etc/kubernetes/kubelet.conf和/etc/kubernetes/bootstrap-kubelet.conf文件中编辑服务器值。
vim /etc/kubernetes/kubelet.conf vim nano /etc/kubernetes/bootstrap-kubelet.conf
服务器值应采用以下形式:
server: https://127.0.0.1:6443
进行更改后,重新启动kubelet和docker服务
systemctl restart kubelet && systemctl restart docker
检查所有节点是否正常工作。
kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 29m v1.15.1 master02 Ready master 27m v1.15.1 master03 Ready master 26m v1.15.1 worknode01 Ready <none> 25m v1.15.1 worknode02 Ready <none> 3m15s v1.15.1 worknode03 Ready <none> 3m16s v1.15.1
到目前为止,我们集群中没有用于测试HA的应用程序。 但是,我们可以在第一个主节点上停止kubelet的操作,并确保我们的集群保持运行状态。
systemctl stop kubelet && systemctl stop docker
从第二个主节点检查
root@master02:~# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 NotReady master 15h v1.15.1 master02 Ready master 15h v1.15.1 master03 Ready master 15h v1.15.1 worknode01 Ready <none> 15h v1.15.1 worknode02 Ready <none> 15h v1.15.1 worknode03 Ready <none> 15h v1.15.1
除了停止服务的节点以外,所有节点均正常运行。
不要忘记在第一个主节点上回退kubernetes服务
systemctl start kubelet && systemctl start docker
安装入口控制器
入口控制器是Kubernetes附加组件,我们可以使用它从外部访问我们的应用程序。 详细的描述在Kuberbnetes文档中 。 有很多控制器入口,我使用Nginx的控制器。 我将讨论其安装。 Nginx提供的有关Ingress控制器的操作,配置和安装的文档可以在官方网站上阅读
让我们开始安装,所有命令都可以使用master01执行。
自行安装控制器
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
现在-一项可通过其访问的服务
为此,请准备配置
./create-config.sh ingress
并将其发送到我们的集群
kubectl apply -f ingress/service-nodeport.yaml
检查我们的Ingress是否在正确的地址上正常工作,并在正确的端口上进行侦听。
# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.99.35.95 10.73.71.25,10.73.71.26,10.73.71.27 80:31669/TCP,443:31604/TCP 10m
kubectl describe svc -n ingress-nginx ingress-nginx Name: ingress-nginx Namespace: ingress-nginx Labels: app.kubernetes.io/name=ingress-nginx app.kubernetes.io/part-of=ingress-nginx Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/par... Selector: app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx Type: NodePort IP: 10.99.35.95 External IPs: 10.73.71.25,10.73.71.26,10.73.71.27 Port: http 80/TCP TargetPort: 80/TCP NodePort: http 31669/TCP Endpoints: 192.168.142.129:80 Port: https 443/TCP TargetPort: 443/TCP NodePort: https 31604/TCP Endpoints: 192.168.142.129:443 Session Affinity: None External Traffic Policy: Cluster Events: <none>
安装Web UI(仪表板)
Kubernetes有一个标准的Web UI,通过它有时可以方便地快速查看集群或其各个部分的状态。 在我的工作中,我经常使用仪表板进行部署的初始诊断或集群各部分的状态。
该文档的链接位于kubernetes网站上
安装方式 我正在使用稳定版本,但尚未尝试2.0。
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml # 2.0 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml
在将面板安装到集群中之后,该面板在以下位置可用
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.
但是,为了达到目的,我们需要使用kubectl代理从本地计算机转发端口。 对我来说,这种方案不是很方便。 因此,我将更改控制面板的服务,以使仪表板在端口30443上任何群集节点的地址上可用。还有其他访问仪表板的方法,例如,通过入口。 也许我会在以下出版物中考虑这种方法。
要更改服务,请运行已更改服务的部署
kubectl apply -f dashboard/service-nodeport.yaml
剩下创建管理员用户和令牌以通过仪表板访问集群的过程
kubectl apply -f dashboard/rbac.yaml kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
之后,您可以登录到https://10.73.71.25:30443的控制面板。

仪表板主屏幕

恭喜你! 如果您已完成此步骤,那么您将拥有一个可用的Kubernetes HA集群,该集群可用于部署应用程序。
Kubernetes , . .
, GitHub, , .
C , .