天天看點

部署k8s叢集(親測無坑)

kubernetes 簡介 kubernetes,簡稱K8s,是一個開源的,用于管理雲平台中多個主機上的容器化的應用,Kubernetes的目标是讓部署容器化的應用簡單并且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。
優勢: 傳統的應用部署方式是通過插件或腳本來安裝應用。這樣做的缺點是應用的運作、配置、管理、所有生存周期将與目前作業系統綁定,這樣做并不利于應用的更新更新/復原等操作,當然也可以通過建立虛拟機的方式來實作某些功能,但是虛拟機非常重,并不利于可移植性。 新的方式是通過部署容器方式實作,每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程序不會互相影響,能區分計算資源。相對于虛拟機,容器能快速部署,由于容器與底層設施、機器檔案系統解耦的,是以它能在不同雲、不同版本作業系統間進行遷移。 容器占用資源少、部署快,每個應用可以被打包成一個容器鏡像,每個應用與容器間成一對一關系也使容器有更大優勢,使用容器可以在build或release 的階段,為應用建立容器鏡像,因為每個應用不需要與其餘的應用堆棧組合,也不依賴于生産環境基礎結構,這使得從研發到測試、生産能提供一緻環境。類似地,容器比虛拟機輕量、更“透明”,這更便于監控和管理。
▪ Master 元件 ▪ 節點(Node)元件 Kubernetes是Google開源的一個容器編排引擎,它支援自動化部署、大規模可伸縮、應用容器化管理。在生産環境中部署一個應用程式時,通常要部署該應用的多個執行個體以便對應用請求進行負載均衡。 在Kubernetes中,我們可以建立多個容器,每個容器裡面運作一個應用執行個體,然後通過内置的負載均衡政策,實作對這一組應用執行個體的管理、發現、通路,而這些細節都不需要運維人員去進行複雜的手工配置和處理。
Kubernetes 特點 可移植: 支援公有雲,私有雲,混合雲,多重雲(multi-cloud) 可擴充: 子產品化,插件化,可挂載,可組合 自動化: 自動部署,自動重新開機,自動複制,自動伸縮/擴充
Master 元件 1.1kube-apiserver 1.2ETCD 1.3kube-controller-manager 1.4cloud-controller-manager 1.5kube-scheduler 1.6插件 addons 1.6.1DNS 1.6.2使用者界面 1.6.3容器資源監測 1.6.4Cluster-level Logging
節點(Node)元件 2.1kubelet 2.2kube-proxy 2.3docker 2.4RKT 2.5supervisord 2.6fluentd
Master元件提供叢集的管理控制中心。Master元件可以在叢集中任何節點上運作。但是為了簡單起見,通常在一台VM/機器上啟動所有Master元件,并且不會在此VM/機器上運作使用者容器。請參考建構高可用群集以來建構multi-master-VM。
kube-apiserver kube-apiserver用于暴露Kubernetes API。任何的資源請求/調用操作都是通過kube-apiserver提供的接口進行。請參閱建構高可用群集。
ETCD etcd是Kubernetes提供預設的存儲系統,儲存所有叢集資料,使用時需要為etcd資料提供備份計劃。
kube-controller-manager kube-controller-manager運作管理控制器,它們是叢集中處理正常任務的背景線程。邏輯上,每個控制器是一個單獨的程序,但為了降低複雜性,它們都被編譯成單個二進制檔案,并在單個程序中運作。
這些控制器包括: 節點(Node)控制器。 副本(Replication)控制器:負責維護系統中每個副本中的pod。 端點(Endpoints)控制器:填充Endpoints對象(即連接配接Services&Pods)。 Service Account和Token控制器:為新的Namespace建立預設帳戶通路API Token。
cloud-controller-manager 雲控制器管理器負責與底層雲提供商的平台互動。雲控制器管理器是Kubernetes版本1.6中引入的,目前還是Alpha的功能。 雲控制器管理器僅運作雲提供商特定的(controller loops)控制器循環。可以通過将--cloud-providerflag設定為external啟動kube-controller-manager ,來禁用控制器循環。
cloud-controller-manager 具體功能: 節點(Node)控制器 路由(Route)控制器 Service控制器 卷(Volume)控制器
kube-scheduler kube-scheduler監視新建立沒有配置設定到Node的Pod,為Pod選擇一個Node。 插件 addons 插件(addon)是實作叢集pod和Services功能的。Pod由Deployments,ReplicationController等進行管理。Namespace 插件對象是在kube-system Namespace中建立。 DNS 雖然不嚴格要求使用插件,但Kubernetes叢集都應該具有叢集 DNS。 群集 DNS是一個DNS伺服器,能夠為 Kubernetes services提供 DNS記錄。 由Kubernetes啟動的容器自動将這個DNS伺服器包含在他們的DNS searches中。 使用者界面 kube-ui提供叢集狀态基礎資訊檢視。 容器資源監測 容器資源監控提供一個UI浏覽監控資料。
Cluster-level Logging Cluster-level logging,負責儲存容器日志,搜尋/檢視日志。 節點元件運作在Node,提供Kubernetes運作時環境,以及維護Pod。 kubelet kubelet是主要的節點代理,它會監視已配置設定給節點的pod,具體功能: 安裝Pod所需的volume。 下載下傳Pod的Secrets。 Pod中運作的 docker(或experimentally,rkt)容器。 定期執行容器健康檢查。 Reports the status of the pod back to the rest of the system, by creating amirror podif necessary. Reports the status of the node back to the rest of the system.
kube-proxy kube-proxy通過在主機上維護網絡規則并執行連接配接轉發來實作Kubernetes服務抽象。 docker docker用于運作容器。 RKT rkt運作容器,作為docker工具的替代方案。
supervisord supervisord是一個輕量級的監控系統,用于保障kubelet和docker運作。 fluentd fluentd是一個守護程序,可提供cluster-level logging.。

叢集環境:

系統centos7

master、node

----------------(前期調試在每台進行操作)----------------

設定三台機器的主機名:

修改每台hosts檔案互解:

關閉防火牆和selinux

開啟linux路由轉發功能

設定ssh使伺服器之間互信

kubernetes叢集元件(需要配置的) -etcd :一個高可用的K/V鍵值對存儲和服務發現系統 -flannel:實作跨主機的容器網絡的通信 -kube-apiserver:提供kubernetes叢集的api調用 -kube-controller-manager:確定叢集服務 -kube-scheduler排程容器:配置設定到node -kubelet:在node節點上按照配置檔案中定義的容器規格啟動容器 -kube-proxy提供網絡代理服務

下載下傳依賴包-lvm2-docker等

添加官方yum庫

安裝docker

或者使用腳本一鍵安裝

修改docker cgroup驅動,與k8s一緻,使用systemd 修改docker cgroup驅動:

所有節點安裝/kubeadm/kubelet/kubectl

添加YUM源

-------------------阿裡雲YUM-------------------

-------------------Google YUM-------------------

安裝kubelet kubeadm kubectl

----------------(master操作)--------------

部署Kubernetes Master

在(Master)執行。

--apiserver-advertise-address 指定與其它節點通信的接口 --pod-network-cidr 指定pod網絡子網,使用fannel網絡必須使用這個CIDR --image-repository=registry.aliyuncs.com/google_containers初始化時可以添加下載下傳鏡像的源位址。因為預設是google的,國内無法通路。這樣前面就不要提前下載下傳好鏡像了。

使用者設定權限(root使用者也需要執行)

master 執行

安裝Pod網絡插件(CNI)

----------------(node操作)--------------

node節點加入到master

結果檢查

node節點加入master輸出資訊如下:

master 節點執行kubectl get nodes

測試kubernetes叢集

在Kubernetes叢集中建立一個pod,驗證是否正常運作:

《《 初始化 Kubernetes (端口被占用的問題) 報錯資訊 [root@k8s-master01 ~]# kubeadm init --config config.yaml [init] Using Kubernetes version: v1.10.0 [init] Using Authorization modes: [Node RBAC] [preflight] Running pre-flight checks. [preflight] Some fatal errors occurred: [ERROR Port-6443]: Port 6443 is in use [ERROR Port-10250]: Port 10250 is in use [ERROR Port-10251]: Port 10251 is in use [ERROR Port-10252]: Port 10252 is in use [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists [preflight] If you know what you are doing, you can make a check non-fatal with <code>--ignore-preflight-errors=...</code> 解決方案:發現殺死程序都沒有用,最終重新開機一下kubeadm就可以了,如下: [root@k8s-master01 ~]# kubeadm reset 》》

部署 Dashboard

預設鏡像國内無法通路,修改鏡像位址為: lizhenliang/kubernetes-dashboard-amd64:v1.10.1

預設Dashboard隻能叢集内部通路,修改Service為NodePort類型,暴露到外部:

注意:安裝v1.10.1之前先将配置檔案中版本資訊v1.5.1修改為v1.10.1

建立service account并綁定預設cluster-admin管理者叢集角色:

使用輸出的token登入Dashboard。

使用apiserver方式通路平台

注:自行修改ip以及端口

打開浏覽器通路 https://192.168.255.140:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

報錯如下:

通過message和code,我們使用的是system:anonymous這樣的使用者來通路位于kube-system命名空間中的名為https:kubernetes-dashboard的service資源。然後這個使用者沒有權限通路,是以被拒絕了。

k8s中的使用者和認證及授權機制。 k8s中的使用者、認證及授權機制簡介,k8s中的使用者有兩種 真實使用者 :如kubelet 服務賬戶: 即service account(簡寫為sa) k8s中的認證機制 k8s通過ClusterRoleBinding或者RoleBinding資源來實作對使用者權限的賦予。 ClusterRole或者Role:意思是叢集角色或角色,他們是規定了一組對叢集内資源的權限規則。 roles和clusterroles的差別在于: roles隻能對某個指令空間内的資源定義權限。而叢集角色定義的權限都是針對整個叢集的命名空間的。

将使用者和role綁定起來就實作了對使用者權限的授予。

部署k8s叢集(親測無坑)

建立并導入認證證書

建立證書

首先需要确認kubectl指令的配置檔案,預設情況下為/etc/kubernetes/admin.conf,而且已經自動建立在$HOME/.kube/config中,如果沒有建立則需要手動指派。

如果确認有叢集的配置,則運作以下指令來生成一個p12格式的浏覽器證書

先生成kubecfg-crt

生成kubecfg-key

生成p12證書,按要求輸入密碼直接回車即可,密碼不要胡亂輸,後面給浏覽器導入的時候要用。

運作完後在目前目錄會有個kubecfg.p12證書檔案,将這個kubecfg.p12證書檔案傳到桌面上,可以通過安裝yum install lrzsz,将檔案發送到桌面上

将證書導入chrome浏覽器

點選浏覽器:菜單-設定-進階-管理證書 選擇“個人”這一欄(适用于chrome71以上版本,71以下不确定行不行),然後點選導入kubecfg.p12。 剩下的步驟全部預設,完成後如下:
部署k8s叢集(親測無坑)
部署k8s叢集(親測無坑)

導入成功後,重新開機浏覽器

注:使用如下連結,更改ip和端口通路再次通路

此時會彈出類似如下的證書資訊對話框,點選确定即可。

部署k8s叢集(親測無坑)
部署k8s叢集(親測無坑)

點選确定之後,會出現下面的界面

選擇登入方式 kubeconfig、令牌、使用者名和密碼,直接通路,不使用任何登入,使用令牌方式登入,全部資源通路權限,先建立一個賬号,再建立一個有全部權限的clusterroles,将二者用clusterrolebinding綁定起來。

安裝yaml檔案時,已建立了一個名為kubernetes-dashboard的服務賬戶,檢視詳情

而kubernetes叢集安裝好後,他會自動生成一些clusterroles叢集權限對象,你可以用下面的指令檢視都有哪些

比如叢集管理者,我們詳細的看一下,*号表示對所有資源有所有權限。

使用者和權限都有了,将他們綁定起來

将kubernetes-dashboard這個服務賬戶和cluster-admin這個叢集管理者權限對象綁定起來。

##13. 建立一個yaml檔案, vim dashboard.yaml,内容如下

執行

檢視是否建立成功

找到kubernetes-dashboard賬戶的token,記下這串token,登入的時候會使用,這個token預設是永久的。

再次通路dashboard,輸入token登入後界面如下;

此時通路dashboard的主體是kubernetes-dashboard這個服務賬戶,它擁有對叢集所有資源的所有使用權限。

部署k8s叢集(親測無坑)

通過web方式操作很友善,如下:進行擴縮容

部署k8s叢集(親測無坑)

生産環境要對不同的人賦予不同的權限,自定義資源通路權限,用kubeconfig方式登入,每次都要複制token,會比較麻煩

1、先把config檔案複制到别的地方

然後把一個具有全部通路權限的token追加到最後一行。先找出token

追加到config中,如下

上傳到桌面,選擇登入

部署k8s叢集(親測無坑)
使用使用者名密碼方式登入,預設情況下使用者名密碼登入沒有啟用。 如果沒有該參數,預設使用的是匿名使用者,并且無法檢查提供的憑據是否有效。 原因是Kubernetes 需要有配置 如果要啟用使用者名和密碼驗證,必須在apiserver的部署檔案中配置參數 --authorization-mode=ABAC和and --basic-auth-file。 然後在dashboard的部署檔案中設定authentication-mode = basic。預設情況下,它的設定是--authentication-mode = token。
部署k8s叢集(親測無坑)

跳過登入過程,直接通路

添加參數- --enable-skip-login

部署k8s叢集(親測無坑)

官方文檔:

https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard—1.7.X-and-above

https://github.com/kubernetes/dashboard/wiki/Creating-sample-user