使用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