1. 程式人生 > >kubernetes(k8s) 基礎概念

kubernetes(k8s) 基礎概念

-type out 查詢 客戶 配置 節點和 索引 post pri

K8S基礎概念1、NodeNode作為集群中的工作節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行著Kubernetes的Kubelet、kube-proxy服務進程,這些服務進程負責Pod的創建、啟動、監控、重啟、銷毀、以及實現軟件模式的負載均衡。Node包含的信息:
  • Node地址:主機的IP地址,或Node ID。
  • Node的運行狀態:Pending、Running、Terminated三種狀態。
  • Node Condition:…
  • Node系統容量:描述Node可用的系統資源,包括CPU、內存、最大可調度Pod數量等。
  • 其他:內核版本號、Kubernetes版本等。
查看Node信息:kubectl describe node 2、PodPod是Kubernetes最基本的操作單元,包含一個或多個緊密相關的容器,一個Pod可以被一個容器化的環境看作應用層的“邏輯宿主機”;一個Pod中的多個容器應用通常是緊密耦合的,Pod在Node上被創建、啟動或者銷毀;每個Pod裏運行著一個特殊的被稱之為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此他們之間通信和數據交換更為高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。同一個Pod裏的容器之間僅需通過localhost就能互相通信。
一個Pod中的應用容器共享同一組資源:
  • PID命名空間:Pod中的不同應用程序可以看到其他應用程序的進程ID;
  • 網絡命名空間:Pod中的多個容器能夠訪問同一個IP和端口範圍;
  • IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信;
  • UTS命名空間:Pod中的多個容器共享一個主機名;
  • Volumes(共享存儲卷):Pod中的各個容器可以訪問在Pod級別定義的Volumes;
Pod的生命周期通過Replication Controller來管理;通過模板進行定義,然後分配到一個Node上運行,在Pod所包含容器運行結束後,Pod結束。Kubernetes為Pod設計了一套獨特的網絡配置,包括:為每個Pod分配一個IP地址,使用Pod名作為容器間通信的主機名等。
3、Service在Kubernetes的世界裏,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨著Pod的銷毀而消失,這就引出一個問題:如果有一組Pod組成一個集群來提供服務,那麽如何來訪問它呢?Service!一個Service可以看作一組提供相同服務的Pod的對外訪問接口,Service作用於哪些Pod是通過Label Selector來定義的。
  • 擁有一個指定的名字(比如my-mysql-server);
  • 擁有一個虛擬IP(Cluster IP、Service IP或VIP)和端口號,銷毀之前不會改變,只能內網訪問;
  • 能夠提供某種遠程服務能力;
  • 被映射到了提供這種服務能力的一組容器應用上;
如果Service要提供外網服務,需指定公共IP和NodePort,或外部負載均衡器;二、Kubernetes總體架構Master和NodeKubernetes將集群中的機器劃分為一個Master節點和一群工作節點(Node)。其中,Master節點上運行著集群管理相關的一組進程etcd、API Server、Controller Manager、Scheduler,後三個組件構成了Kubernetes的總控中心,這些進程實現了整個集群的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能,並且全都是自動完成。在每個Node上運行Kubelet、Proxy、Docker daemon三個組件,負責對本節點上的Pod的生命周期進行管理,以及實現服務代理的功能。流程 通過Kubectl提交一個創建RC的請求,該請求通過API Server被寫入etcd中,此時Controller Manager通過API Server的監聽資源變化的接口監聽到這個RC事件,分析之後,發現當前集群中還沒有它所對應的Pod實例,於是根據RC裏的Pod模板定義生成一個Pod對象,通過API Server寫入etcd,接下來,此事件被Scheduler發現,它立即執行一個復雜的調度流程,為這個新Pod選定一個落戶的Node,然後通過API Server講這一結果寫入到etcd中,隨後,目標Node上運行的Kubelet進程通過API Server監測到這個“新生的”Pod,並按照它的定義,啟動該Pod並任勞任怨地負責它的下半生,直到Pod的生命結束。隨後,我們通過Kubectl提交一個新的映射到該Pod的Service的創建請求,Controller Manager會通過Label標簽查詢到相關聯的Pod實例,然後生成Service的Endpoints信息,並通過API Server寫入到etcd中,接下來,所有Node上運行的Proxy進程通過API Server查詢並監聽Service對象與其對應的Endpoints信息,建立一個軟件方式的負載均衡器來實現Service訪問到後端Pod的流量轉發功能。
  • etcd
用於持久化存儲集群中所有的資源對象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封裝接口API,這些API基本上都是集群中資源對象的增刪改查及監聽資源變化的接口。etcd是一個鍵值存儲倉庫,用於配置共享和服務發現。etcd受Zookeeper與doozer啟發而催生的項目。etcd存儲 etcd的存儲分為內部存儲和持久化(硬盤)存儲兩部分。內存中的存儲除了順序化地記錄所有用戶對節點數據變更的記錄外,還會對用戶數據進行索引、建堆等方便查詢的操作。而持久化則使用WAL進行記錄存儲。在k8s中,所有數據的存儲以及操作記錄都在etcd中進行存儲,所以對於k8s集群來說,etcd是相當重要的,一旦故障,可能導致整個集群的癱瘓或者數據丟失。 在WAL體系中,所有的數據在提交之前都會進行日誌記錄。持久化存儲的目錄分為兩個:snap和wal。snapshot相當於數據壓縮,默認會將10000條wal操作記錄merge成snapshot,節省存儲,又保證數據不會丟失。 WAL:存儲所有事務的變化記錄 Snapshot:用於存放某一時刻etcd所有目錄的數據
  • API Server
提供了資源對象的唯一操作入口,其他所有組件都必須通過它提供的API來操作資源數據,通過對相關的資源數據“全量查詢”+“變化監聽”,這些組件可以很“實時”地完成相關的業務功能。
  • Controller Manager
集群內部的管理控制中心,其主要目的是實現Kubernetes集群的故障檢測和恢復的自動化工作,比如根據RC的定義完成Pod的復制或移除,以確保Pod實例數符合RC副本的定義;根據Service與Pod的管理關系,完成服務的Endpoints對象的創建和更新;其他諸如Node的發現、管理和狀態監控、死亡容器所占磁盤空間及本地緩存的鏡像文件的清理等工作也是由Controller Manager完成的。
  • Scheduler
集群中的調度器,負責Pod在集群節點中的調度分配。
  • Kubelet
負責本Node節點上的Pod的創建、修改、監控、刪除等全生命周期管理,同時Kubelet定時“上報”本Node的狀態信息到API Server裏。
  • Proxy
實現了Service的代理與軟件模式的負載均衡器。客戶端通過Kubectl命令行工具或Kubectl Proxy來訪問Kubernetes系統,在Kubernetes集群內部的客戶端可以直接使用Kuberctl命令管理集群。Kubectl Proxy是API Server的一個反向代理,在Kubernetes集群外部的客戶端可以通過Kubernetes Proxy來訪問API Server。API Server內部有一套完備的安全機制,包括認證、授權和準入控制等相關模塊。###################################安裝kubernetesmaster:192.168.1.50node:192.168.1.117Master1、在Master上安裝kubernetes etcd flannelyum install kubernetes etcd flannel -y2、修改配置文件/etc/kubernetes/controller-manager#指定key文件,key文件可以通過命令生成:openssl genrsa -out /etc/kubernetes/service.key 2048KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/service.key"3 修改配置文件/etc/kubernetes/apiserver# The address on the local server to listen to. 設為全部監聽KUBE_API_ADDRESS="--address=0.0.0.0"# Comma separated list of nodes in the etcd cluster . 指定etcd節點的地址KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.50:2379"# Address range to use for services. 這個是設置今後運行Service所在的ip網段KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.100.0/24"# Add your own! 指定key文件KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/service.key"4 修改配置文件/etc/kubernetes/config# How the controller-manager, scheduler, and proxy find the apiserverKUBE_MASTER="--master=http://192.168.1.50:8080"5 修改配置文件/etc/etcd/etcd.confETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.50:2379"6 啟動etcd和kubernetes的服務systemctl start etcd kube-apiserver kube-controller-manager kube-schedulersystemctl enable etcd kube-apiserver kube-controller-manager kube-scheduler7 修改配置文件/etc/sysconfig/flanneld# etcd url location. Point this to the server where etcd runsFLANNEL_ETCD="http://192.168.1.50:2379"8 設置etcd config的值# 創建一個文件內容如下,Network指定的IP將為以後容器運行的網段:cat /etc/sysconfig/flannel-config.json{ "Network":"172.16.0.0/16", "SubnetLen":24, "Backend":{ "Type":"vxlan", "VNI":1 }}# 通過文件內容來設置etc的configetcdctl set atomic.io/network/config < flannel-config.json9 啟動flannel服務 systemctl start flanneldsystemctl enable flanneld到這裏Master就安裝配置完畢,查看master信息:kubectl cluster-info----------------------------node1 安裝kubernetes和flannelyum -y install kubernetes flannel2 修改/etc/kubernetes/configKUBE_MASTER="--master=http://192.168.1.50:8080"3 修改/etc/kubernetes/kubelet# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)KUBELET_ADDRESS="--address=0.0.0.0"# You may leave this blank to use the actual hostnameKUBELET_HOSTNAME="--hostname-override=vm7.cluster.com"# location of the api-serverKUBELET_API_SERVER="--api-servers=http://192.168.1.50:8080"4 修改/etc/sysconfig/flanneld# etcd url location. Point this to the server where etcd runsFLANNEL_ETCD="http://192.168.1.50:2379"5 啟動flannel和kube相關服務# 註意Node和Master上啟動的kube的服務是不一樣的systemctl start flanneld kube-proxy kubeletsystemctl enable flanneld kube-proxy kubelet# 重啟docker服務systemctl restart docker到此,Node節點配置完畢,可以在Master上執行下面命令查看節點信息kubectl get nodes###########################################實例利用 Kubernetes 部署個容器1) 創建一個 web_server 的鏡像---在任意 node 節點# vim Dockfile# create newFROM centosMAINTAINER user1 <[email protected]># Update Yum RepostoryRUN curl -s -L http://mirrors.aliyun.com/repo/Centos-7.repo -o \ /etc/yum.repos.d/CentOS7-Base.repo && \ curl -s -L http://mirrors.aliyun.com/repo/epel-7.repo -o \ /etc/yum.repos.d/epel7.repoRUN yum clean all && \ yum makecache fast && \ yum -y update yum -y install httpdRUN yum clean allEXPOSE 80CMD ["-D","FOREGROUND"]ENTRYPOINT ["/usr/sbin/httpd"]# docker build -t web_server .# docker images REPOSITORY TAG IMAGE ID CREATED SIZEweb_server latest 875ba006f185 9 seconds ago 337 MBdocker.io/centos latest e934aafc2206 12 hours ago 199 MB【將此鏡像導出來,在另一節點導入,當然也可以直接使用 docker build】[# http://mirrors.aliyun.com/repo/Centos-7.repo]2)在 master 創建一個 pod cat pod-webserver.yaml apiVersion: v1 kind: Pod metadata: name: httpd spec: containers: - name: httpd image: web_server ports: - containerPort: 80 volumeMounts: # 定義一個掛載目錄 /var/www/html - name: httpd-storage # mount point inside Container mountPath: /var/www/html volumes: - name: httpd-storage hostPath: # 把/var/docker/disk01 目錄 掛載到窗口中的 /var/www/html path: /var/docker/disk01 創建:# kubectl create -f pod-webserver.yaml 使用命令查看創建的狀態,狀態為Pending[準備中],Running 狀態[已經創建成功]# kubectl get pods查看該容器在哪個節點# kubectl get pods -o wide查看該容器的所有狀態# kubectl get pods httpd -o yaml測試---在node節點# echo ${HOSTNAME} > /var/docker/disk01/index.html# curl http://10.1.15.2刪除 Pod # kubectl delete pod httpd

kubernetes(k8s) 基礎概念