1、Kubernetes 概述
Kubernetes 是 Google 開源的容器集群管理系統,基於 Docker 構建一個容器的調度服務,提供資源調度、均衡容災、服務注冊、勱態擴縮容等功能套件。 基於容器的雲平台
Kubernetes 基於 docker 容器的雲平台,簡寫成: k8s 。
openstack 基於 kvm 虛擬機雲平台
官網:https://kubernetes.io/
Kubernetes 的架構設計圖:
2、Kubernetes 常見組件介紹
1、master: kubernetes 管理結點
2、apiserver : 提供接口服務,用戶通過 apiserver 來管理整個容器集群平台。API Server 負責和 etcd 交互(其他組件丌會直接操作 etcd,只有 API Server 這么做),整個 kubernetes 集群的所有的交互都是以 API Server 為核心的。
如:A、所有對集群迚行的查詢和管理都要通過 API 來進行 2、所有模塊之間並不會互相調用,而是通過和 API Server 打交道來完成自己那部分的工作 、API Server提供的驗證和授權保證了整個集群的安全
3、scheduler kubernetes:調度服務
4、Replication Controllers:復制,保證 pod 的高可用。
Replication Controller 是 Kubernetes 系統中最有用的功能,實現復制多個 Pod 副本,往往一個應用需要多個 Pod 來支撐,並且可以保證其復制的副本數,即使副本所調度分配的宿主機出現異常,通過 Replication Controller 可以保證在其它宿主機吭用同等數量的 Pod。Replication Controller 可以通過 repcon 模板來創建多個 Pod 副本,同樣也可以直接復制已存在 Pod,需要通過 Label selector 來
關聯。
接下介紹,從下往上說,從你最熟悉的知識開始
5、minion : 真正運行容器 container 的物理機。 kubernets 中需要很多 minion 機器,來提供運算。
6、container : 容器 ,可以運行服務和程序
7、Pod :在 Kubernetes 系統中,調度的最小顆粒丌是單純的容器,而是抽象成一個 Pod,Pod是一個可以被創建、銷毀、調度、管理的最小的部署單元。pod 中可以包括一個戒一組容器。
8、Kube_proxy 代理 做端口轉發,相當於 LVS-NAT 模式中的負載調度器器
Proxy 解決了同一宿主機,相同服務端口沖突的問題,還提供了對外服務的能力,Proxy 后端使用了隨機、輪循負載均衡算法。
8、etcd etcd 存儲 kubernetes 的配置信息,可以理解為是 k8s 的數據庫,存儲着 k8s 容器雲平台中所有節點、pods、網絡等信息。
互動: linux 系統中/etc 目錄作用什么,存配置文件。 所以 etcd(daemon)是一個存儲配置文件的后台服務。
接下幾個名詞不在圖片中
9、Services : Services 是 Kubernetes 最外圍的單元,通過虛擬一個訪問 IP 及服務端口,可以訪問我們定義好的 Pod 資源,目前的版本是通過 iptables 的 nat 轉發來實現,轉發的目標端口為Kube_proxy 生成的隨機端口。
10、Labels 標簽
Labels 是用於區分 Pod、Service、Replication Controller 的 key/value 鍵值對,僅使用在Pod、Service、 Replication Controller 之間的關系識別,但對這些單元本身迚行操作時得使用 name標簽。
11、Deployment Deployment [dɪ ɪ'pl ɔɪmə ənt] 部署
Kubernetes Deployment 用於更新 Pod 和 Replica Set(下一代的 Replication Controller)的方法,你可以在 Deployment 對象中只描述你所期望的理想狀態(預期的運行狀態),Deployment 控制器會將現在的實際狀態轉換成期望的狀態。例如,將所有的 webapp:v1.0.9 升級成 webapp:v1.1.0,只需創建一個 Deployment,Kubernetes 會按照 Deployment 自勱迚行升級。通過 Deployment 可以用來創建新的資源。如:pod,替換已經存在的資源等。
Deployment 可以幫我們實現無人值守的上線,大大降低我們的上線過程的復雜溝通、操作風險。
12、Kubelet : Kubelet 和 Kube-proxy 都運行在 minion 節點上。
Kube-proxy 實現 Kubernetes 網絡相關內容。
Kubelet 組件管理 Pod、Pod 中容器及容器的鏡像和卷等信息。
總結: 總結各組件之間的關系
1、Kubernetes的架構由一個master和多個minion組成,master通過api提供服務,接受kubectl的請求來調度管理整個集群。 kubectl: 是 k8s 平台的一個管理命令。
2、Replication controller 定義了多個 pod 戒者容器需要運行,如果當前集群中運行的 pod 或容器達不到配置的數量,replication controller 會調度容器在多個 minion 上運行,保證集群中的 pod 數量。
3、service 則定義真實對外提供的服務,一個 service 會對應后端運行的多個 container。
4、Kubernetes 是個管理平台,minion 上的 proxy 擁有提供真實服務公網 IP。客戶端訪問kubernetes 中提供的服務,是直接訪問到 kube-proxy 上的。
5、在 Kubernetes 中 pod 是一個基本單元,一個 pod 可以是提供相同功能的多個 container,這些容器會被部署在同一個 minion 上。minion 是運行 Kubelet 中容器的物理機。minion 接受 master的指令創建 pod 或者容器。
3、搭建 Kubernetes 容器集群管理系統
1.平台版本說明:
節點角色 IP 地址 CPU 內存
master 192.168.10.71 4 核 1GB
node1(minion1) 192.168.10.72 4 核 1GB
node2(minion2) 192.168.10.73 4 核 1GB
etcd 192.168.10.74 4 核 1GB
注: 正常需要 4 台機器,如果你內存不夠,master 和 etcd 可以運行在同一台機器上。
2.系統的配置(所有機器)
關閉selinux
# 臨時關閉 $ setenforce 0 # 永久關閉 $ vim /etc/selinux/config SELINUX=disabled
關閉且禁用防火牆
$ systemctl stop firewalld $ systemctl disable firewalld
修改hostname
vi /ect/hostname # 四台機器分別修改為 master node1 node2 etcd
修改hosts文件
$ vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.71 master 192.168.10.72 node1 192.168.10.73 node2 192.168.10.74 etcd
更新yum
$ yum update -y
安裝相關組件
$ yum install -y etcd kubernetes ntp flannel
3.etcd服務器
# 修改配置文件 $ vim /etc/etcd/etcd.conf ETCD_NAME=default ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.10.74:2379" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.74:2379" # 啟動服務 $ systemctl start etcd $ systemctl enable etcd #檢查etcd cluster狀態 $ etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://192.168.10.74:2379 cluster is healthy # 設置一個key,下面會用到 etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'
4.master服務器
# 配置kube-apiserver配置文件 $ vim /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.10.71:8080" $ vim /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.10.74:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit" KUBE_API_ARGS="" #配置kube-scheduler配置文件,此處可以不需要配置 vim /etc/kubernetes/scheduler KUBE_SCHEDULER_ARGS="--address=0.0.0.0" # 啟動服務 systemctl start kube-apiserver kube-controller-manager kube-scheduler systemctl enable kube-apiserver kube-controller-manager kube-scheduler systemctl status kube-apiserver kube-controller-manager kube-scheduler
5.node1節點
# 配置node1網絡 $ vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://192.168.10.74:2379" FLANNEL_ETCD_PREFIX="/k8s/network" FLANNEL_OPTIONS="--iface=ens33" # ens是當前可用上網的網卡名稱,此處是多個網卡時需要指定,不然不需要指定 # 配置node1 kube-proxy $ vim /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.10.71:8080" # 配置node1 kubelet $ vim /etc/kubernetes/kubelet KUBELET_ADDRESS="--address=127.0.0.1" KUBELET_HOSTNAME="--hostname-override=node1" KUBELET_API_SERVER="--api-servers=http://192.168.10.71:8080" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="" # 啟動node1服務 systemctl start flanneld kube-proxy kubelet systemctl enable flanneld kube-proxy kubelet systemctl status flanneld kube-proxy kubelet
6.node2節點
# 配置node2網絡 $ vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://192.168.10.74:2379" FLANNEL_ETCD_PREFIX="/k8s/network" FLANNEL_OPTIONS="--iface=ens33" # ens是當前可用上網的網卡名稱,此處是多個網卡時需要指定,不然不需要指定 # 配置node2 kube-proxy $ vim /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.10.71:8080" # 配置node2 kubelet $ vim /etc/kubernetes/kubelet KUBELET_ADDRESS="--address=127.0.0.1" KUBELET_HOSTNAME="--hostname-override=node1" KUBELET_API_SERVER="--api-servers=http://192.168.10.71:8080" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="" # 啟動node1服務 systemctl start flanneld kube-proxy kubelet systemctl enable flanneld kube-proxy kubelet systemctl status flanneld kube-proxy kubelet
7.測試
[root@xuegod71 ~]# kubectl get nodes NAME STATUS AGE node1 Ready 19s node2 Ready 18s
詳細可以參考:https://www.cnblogs.com/byron0918/p/8728876.html