kubernetes
簡稱k8s,它是一個全新的基於容器技術的分佈式架構方案,它是谷歌十幾年來大規模應用容器技術的經驗累積和昇華的一個重要成果。若是咱們的系統設計遵循了k8s的設計思想,那麼傳統系統架構中哪些和業務沒有多大關係的底層代碼或功能模塊,均可以從咱們的實現中消失。咱們沒必要費心與負載均衡的選型,沒必要考慮引入或本身開發一個複雜的服務治理框架,沒必要再頭疼於服務監控和故障處理模塊的開發,所以系統後期運維難度和運維成本難度大大下降。node
在k8s中,服務(Service)是核心,一個服務對象擁有以下關鍵特徵:python
經過使用服務,咱們沒必要擔憂IP的變更性,由於服務一旦建立就再也不變化,另外咱們沒必要關心後臺有多少個服務進程,也沒必要擔憂這些進程因爲服務故障而部署到其餘機器,後臺這些進程都是由相互獨立的容器(默認使用的是docker)所支持。k8s所以提供了pod對象來包裝這些容器,而pod運行在Node節點上,Node節點能夠爲一個物理機或者雲端機器,虛擬機等。一樣在集羣管理上,k8s設計了Master節點和一羣工做節點Node,而Master節點至關於k8s的首腦,咱們的全部操做都先要發給master,然後經過Master來調配各個節點的工做。linux
k8s具有如下特徵:docker
根據資源需求和其餘約束自動放置容器,同時不會犧牲可用性,混合關鍵和最大努力的工做負載,以提升資源利用率並節省更多資源。centos
從新啓動失敗的容器,在節點不可用時,替換和從新調度節點上的容器,對用戶定義的健康檢查不響應的容器會被停止,而且在容器準備好服務以前不會把其向客戶端廣播。api
使用簡單的命令或 UI,或者根據 CPU 的使用狀況自動調整應用程序副本數。tomcat
不須要修改您的應用程序來使用不熟悉的服務發現機制,Kubernetes 爲容器提供了本身的 IP 地址和一組容器的單個 DNS 名稱,並能夠在它們之間進行負載均衡。安全
Kubernetes 逐漸部署對應用程序或其配置的更改,同時監視應用程序運行情況,以確保它不會同時終止全部實例。 若是出現問題,Kubernetes會爲您恢復更改,利用日益增加的部署解決方案的生態系統。bash
部署和更新密鑰和應用程序配置,不會從新編譯您的鏡像,不會在堆棧配置中暴露密鑰(secrets)。網絡
自動安裝您所選擇的存儲系統,不管是本地存儲,如公有云提供商 GCP 或 AWS, 仍是網絡存儲系統 NFS, iSCSI, Gluster, Ceph, Cinder, 或 Flocker。
除了服務以外,Kubernetes還能夠管理您的批處理和 CI 工做負載,若是須要,替換出現故障的容器。
阿里雲centos7.6 64位系統,經過安全組配置開放8080,2379,2378及30000-31000端口。首先咱們運行以下命令:
$ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm $ rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
運行如上命令爲了解決以下問題,該問題最本質的表現爲pod一值爲ContainerCreating狀態
FailedSynError syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 13m 11s 56 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image "registry.access.redhat.com/rhel7/pod-infrastructure:latest"
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
緊接着須要運行以下命令:
$ iptables -P FORWARD ACCEPT
這樣解決了外網訪問kube-proxy沒法進行有效的轉發問題
最簡單的方式是經過yum來進行安裝,命令以下:
$ yum install -y etcd kubernetes
安裝好軟件後,修改兩個配置文件
# Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false'
—adminssion_control
參數中的ServiceAccount
刪除# The address on the local server to listen to. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
更改好後,咱們依次啓動以下服務
$ systemctl start docker $ systemctl start etcd $ systemctl start kube-apiserver $ systemctl start kube-controller-manager $ systemctl start kube-scheduler $ systemctl start kubelet $ systemctl start kube-proxy
至此一個單機版的集羣就構建完畢
接下來我構建一個最簡單的tomcat應用爲例,來帶你們體驗一下kubernetes的魔力。首先咱們能夠在Idea環境裏安裝一個kubernetes的插件,這個插件可以友好的對配置文件進行提示。首先咱們建立一個tomcat-rc.yaml的配置文件,代碼以下:
apiVersion: v1 kind: ReplicationController metadata: name: tomcat spec: replicas: 2 selector: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080
ReplicationController
(簡稱RC)是k8s的核心概念之一,簡單來講它定義了一個指望的場景,即聲明某種Pod的副本數量在任意時刻都符合某個預期的值,因此RC的定義主要包含以下幾個部分
接着咱們運行以下命令來建立RC:
$ kubectl create -f tomcat-rc.yaml
咱們能夠經過以下命令來查看狀態:
$ kubectl get rc
此時咱們能夠看到咱們剛纔建立的RC已經在運行了:
NAME DESIRED CURRENT READY AGE tomcat 2 2 2 31s
咱們能夠運行:docker ps的命令來看看:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 960183da4c2b tomcat "catalina.sh run" 2 minutes ago Up 2 minutes k8s_tomcat_tomcat-mt8b5_default_14ff9d6d-2cdd-11e9-bd6b-025000000001_0 97c563415280 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes k8s_tomcat_tomcat-kfmdj_default_14fe9e52-2cdd-11e9-bd6b-025000000001_0
頗有趣的狀況咱們能夠看到,當咱們建立RC時,k8s會建立對應副本數的docker容器,這也從側面反映了經過k8s能屏蔽docker相關容器的建立操做,咱們只須要統一按照既定的排版規範就能編寫咱們所需的容器
容器建立好了,其實咱們還有一位角色要粉墨登場,有了它的幫助。才叫一個合理的‘微服務’。其實k8s中service是一個很是很是核心的概念,它相似於代理門戶,同時它屏蔽了pod與外界訪問。咱們來看一下模板示例:
apiVersion: v1 kind: Service metadata: name: tomcat spec: type: NodePort ports: - port: 8080 protocol: tcp nodePort: 30001 selector: app: tomcat
而後運行以下命令建立服務:
$ kubectl create -f tomcat-svc.yaml
建立完畢後咱們能夠運行以下命令來查看服務的狀況
$ kubectl get svc
運行完畢會獲得以下信息:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE tomcat 10.254.145.222 <nodes> 8080:30001/TCP 9d
緊接着咱們能夠運行curl http://localhost:30001
便可得到對應的結果