使用Kubespray在Debian 10上安装Kubernetes集群

有一个隐含的共识,即2020年是风雨如磐的一年。新年伊始,确实,世界各地的许多人都对动人的回忆印象深刻。我们已经吸取了教训,并意识到了机遇,但最重要的是,您很安全。 随着2021年的曙光,我们希望今年覆盖的乌云能够清除,纯净的阳光将照亮我们的希望和梦想。

本指南重点介绍Kubernetes。是的,该平台将继续改变业务应用程序的部署和管理方式。 无论是CI / CD还是手册,Kubernetes都是处理,管理,扩展和编排应用程序的最佳选择。对于那些不知道的人,Kubernetes将在未来的版本中弃用docker。换句话说,它将不再支持将docker作为容器运行时。在发脾气之前,必须注意这些更改不会影响映像的构造和部署方式,这一点很重要。 Docker包含许多Kubernetes不会使用的组件,请记住,您需要一个简单且轻量级的容器运行时来启动和运行容器。

正如您已经猜到的那样,您可以使用Docker继续构建映像,而Kubernetes将使用其他容器执行时间(例如containered和CRI-O)拉并运行该映像。 Containered和CRI-O非常轻巧,可以很好地插入Container Runtime Interface规范中。

安装先决条件

您需要将其他服务器或计算机用作安装服务器,此部署才能开始并成功进行。该机器包含Kubernetes文件,并连接到安装了kubernetes的服务器,以继续进行Kubernetes的安装。下图简化了部署体系结构,其中包括一个主节点,一个etcd和两个工作节点。

在您的构建器机器上生成SSH密钥,并将公共密钥复制到将在其中构建Kubernetes的Debian 10服务器。

考虑到所有这些,请使用Kuberspra​​y在Debian 10服务器上安装Kubernetes,并使用containerd作为容器运行时。以下步骤足以使您的集群支持您的应用程序。

步骤1:准备服务器

准备服务器是确保部署的各个方面顺利进行到最后的重要步骤。在此步骤中,您将进行快速更新以确保已安装重要软件包。在每台服务器上发出以下命令以启动所有空白。

sudo apt update
sudo apt upgrade

步骤2:克隆Kubespray Git存储库并添加配置

在此步骤中,您在本地计算机(安装程序计算机)上获取Kubespray文件,选择容器化作为容器运行时,在所需文件中输入服务器(主服务器等)详细信息,并配置所需的配置。 ,工人)。

$ cd ~
$ git clone https://github.com/kubernetes-sigs/kubespray.git
Cloning into 'kubespray'...

转到项目目录。

$ cd kubespray

该目录包含用于部署Kubernetes的清单文件和剧本。

步骤3:准备本地计算机

您需要在要执行部署的本地计算机上安装pipPython软件包管理器。

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --user

步骤4:创建一个Kubernetes集群清单文件并安装依赖项

清单分为三组。

  • kube-node:在其上运行pod的kubernetes节点的列表。
  • kube-master:运行kubernetes主组件(apiserver,调度程序,控制器)的服务器列表。
  • etcd:组成etcd服务器的服务器列表。您至少需要三台服务器来进行故障转移。

还有两个特殊的小组。

  • calico-rr:介绍高级Calico网络的情况
  • 要塞:如果无法直接访问节点,请配置堡垒主机

创建一个清单文件。

cp -rfp inventory/sample inventory/mycluster

使用服务器的IP地址定义清单并进行映射以修改节点的用途。

$ vim inventory/mycluster/inventory.ini
master0   ansible_host=172.20.193.154 ip=172.20.193.154
worker1   ansible_host=172.20.198.157 ip=172.20.198.157
worker2   ansible_host=172.20.202.161 ip=172.20.202.161

# ## configure a bastion host if your nodes are not directly reachable
# bastion ansible_host=x.x.x.x ansible_user=some_user
[kube-master]
master0

[etcd]
master0

[kube-node]
worker1
worker2

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

将A记录添加到工作站上的/ etc / hosts。

$ sudo vim /etc/hosts
172.20.193.154 master0
172.20.198.157 worker1
172.20.202.161 worker2

如果您的ssh私钥包含密码,请在开始部署之前保存密码。

$ eval `ssh-agent -s` && ssh-add
Agent pid 4516
Enter passphrase for /home/centos/.ssh/id_rsa: 
Identity added: /home/centos/.ssh/id_rsa (/home/centos/.ssh/id_rsa)

从需求.txt安装依赖项

# Python 2.x
sudo pip install --user -r requirements.txt

# Python 3.x
sudo pip3 install -r requirements.txt

检查Ansible安装。

$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/tech/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0]

检查并更改Inventory / mycluster / group_vars下的参数

检查并更改ventory / mycluster / group_vars下的参数,以确保Kubespray使用的是容器化的。

##Change from docker to containerd at around line 176 and add the two lines below

$ vim inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml

container_manager: containerd
etcd_deployment_type: host
kubelet_deployment_type: host

步骤5:使用Kubernetes Ansible Playbook部署Kubernetes集群

然后运行剧本并使用Ansible为您的生产环境部署Kubernetes。请注意,目标服务器必须具有Internet访问权限才能拉取映像。

通过运行以下命令来启动部署:

ansible-playbook -i inventory/mycluster/inventory.ini --become 
--user=tech --become-user=root cluster.yml

用远程用户替换“ tech”。 ansible连接到该节点。您不应获得运行期间失败的任务。

安装进度如下kubespray的进展

最终消息应类似于以下共享的屏幕截图。kubespray摘要

当剧本运行到最后时,登录到主节点以检查集群的状态。

$ sudo kubectl cluster-info
Kubernetes master is running at https://172.20.193.154:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

您还可以检查节点

$ sudo kubectl get nodes

NAME      STATUS   ROLES    AGE   VERSION
master0   Ready    master   11m   v1.19.5
worker1   Ready    <none>   10m   v1.19.5
worker2   Ready    <none>   10m   v1.19.5

$ sudo kubectl get endpoints -n kube-system

NAME                      ENDPOINTS                                                     AGE
coredns                   10.233.101.1:53,10.233.103.1:53,10.233.101.1:53 + 3 more...   23m
kube-controller-manager   <none>                                                        27m
kube-scheduler            <none>                                                        27m

步骤6:安装Kubernetes仪表板和访问

如果您没有其他选择可以通过诸如Lens或VMware Octant之类的凉爽界面访问Kubernetes集群,则这是一个可选步骤。请按照下面的详细指南安装仪表板。

如何使用NodePort安装Kubernetes仪表板

并且一旦工作,您需要创建一个管理员用户来访问集群。请使用以下指南对其进行修复。

创建一个管理员用户以访问Kubernetes仪表板

如果愿意,还可以使用Active Directory通过对Active Directory进行Kubernetes仪表板用户身份验证的方法来对用户进行身份验证。

步骤7:安装Nginx-Ingress控制器

此步骤包括一个输入控制器,可帮助您从群集外部访问服务。启用对服务的外部访问的最简单方法是使用NodePort服务类型。 NodePort的缺点是该服务必须使用有限范围的端口(默认范围是30000-32767),并且只能将一个端口映射到一个服务。

输入资源使您可以使用单个外部端点,负载均衡器或同时使用这两者来发布多个服务。这种方法允许团队建立主机,前缀和其他规则,以将流量路由到预定义的服务资源。

因此,安装并配置Nginx Ingress控制器以访问要设置的一个示例应用程序。 要安装Nginx Ingress控制器,请下载以下清单并将其应用于您的集群

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/baremetal/deploy.yaml

然后使用kubectl安装

sudo kubectl apply -f deploy.yaml

片刻后,请确保输入控制器Pod正在运行

$ sudo kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-f7d8c        0/1     Completed   0          109m
ingress-nginx-admission-patch-4fxtb         0/1     Completed   0          109m
ingress-nginx-controller-85df779996-b9c2k   1/1     Running     0          109m

然后部署httpbin应用程序,并使用输入控制器进行访问。如下获取httpbin

wget https://github.com/istio/istio/raw/master/samples/httpbin/httpbin.yaml

然后使用kubectl安装

sudo kubectl apply -f httpbin.yaml

如果要部署到其他名称空间,请在应用前编辑文件。

步骤8:添加验证规则以访问服务

到目前为止,我有一个可以正常工作的输入控制器和一个用于测试其工作方式的示例部署(httpbin)。 创建以下针对httpbin的Ingress资源。如果您阅读先前获得的清单,则可以看到已经创建了一个名为“”的服务。httpbin与一起听 8000端口..以这些信息为武器,让我们如下创建Ingress。

$ vim httpbin-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpbin-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: master.computingforgeeks.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 8000

保存文件,然后将其应用于群集。请注意,“ master.computingforgeeks.com”必须解析为输入IP,如下所示。

$ sudo kubectl apply -f httpbin-ingress.yaml
ingress.networking.k8s.io/httpbin-ingress configured

然后验证输入是否已成功创建

$ sudo kubectl get ing
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME              CLASS    HOSTS                           ADDRESS          PORTS   AGE
approot           <none>   master1.computingforgeeks.com   172.20.202.161   80      168m
httpbin-ingress   <none>   master.computingforgeeks.com    172.20.202.161   80      108m

这里发生的是,来自“ master.computingforgeeks.com”根URL的所有流量都会自动路由到httpbin服务。不好看!

除了测试服务是否可以访问之外,我还需要做什么?首先,让我们看看IngressController服务的外观。

$ sudo kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.233.8.37    <none>        80:30242/TCP,443:31635/TCP   123m       
ingress-nginx-controller-admission   ClusterIP   10.233.51.71   <none>        443/TCP                      123m 

您可能已经注意到,“ ingress-nginx-controller”是通过NodePort公开的。这是非常好的信息,因为当以其他方式访问应用程序时,它可能会令人沮丧。考虑到这一点,请打开浏览器并指向// // master.computingforgeeks.com:30242上的应用程序。另外,请确保在“ master.computingforgeeks.com”节点的防火墙中打开了端口30242。您会看到一些令人惊叹的东西,如下所示。kubespray httpbin入口

结论

Kubespray使部署Kubernetes变得容易。多亏开发了参与实现这种复杂部署的手册的团队,我们现在有了一个现成的平台,可以等待对世界有用的应用程序。

如果您要设置一个大型集群,只需将各种组件(etcd,master,worker等)放在部署脚本中,其余的将由Kubespray处理。愿您的一年繁荣,努力取得成果,投资回报。尽力而为,笑着,勤奋地,优雅地面对。

您可能会喜欢的其他指南:

如何在Windows Server 2019上安装Active Directory域服务

使用WeaveScope监视Docker容器和Kubernetes

Kubernetes管理员和Kubectl速查表准备CKA考试

使用SplunkForwarder将日志发送到Kubernetes中的Splunk

如何将Kubernetes日志发送到外部Elasticsearch

使用CephRBD持久存储Kubernetes

Sidebar