kubernetes入門之構建單機集羣

1.kubernetes簡介

kubernetes簡稱k8s,它是一個全新的基於容器技術的分佈式架構方案,它是谷歌十幾年來大規模應用容器技術的經驗累積和昇華的一個重要成果。若是咱們的系統設計遵循了k8s的設計思想,那麼傳統系統架構中哪些和業務沒有多大關係的底層代碼或功能模塊,均可以從咱們的實現中消失。咱們沒必要費心與負載均衡的選型,沒必要考慮引入或本身開發一個複雜的服務治理框架,沒必要再頭疼於服務監控和故障處理模塊的開發,所以系統後期運維難度和運維成本難度大大下降。node

在k8s中,服務(Service)是核心,一個服務對象擁有以下關鍵特徵:python

  • 擁有一個惟一指定的名字
  • 擁有一個虛擬ip
  • 可以提供某種遠程服務能力
  • 被映射到了提供這種服務能力的一組應用上

經過使用服務,咱們沒必要擔憂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 工做負載,若是須要,替換出現故障的容器。

二、安裝步驟

2.一、環境準備

阿里雲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沒法進行有效的轉發問題

2.二、 安裝

最簡單的方式是經過yum來進行安裝,命令以下:

$ yum install -y etcd kubernetes

安裝好軟件後,修改兩個配置文件

  • Docker配置文件目錄爲/etc/sysconfig/docker,在這個文件中作以下修改
# 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'
  • Kubernetes apiServer配置文件位置:/etc/kubernetes/apiserver
    • —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

至此一個單機版的集羣就構建完畢

三、快速上手

3.一、建立RC

接下來我構建一個最簡單的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的定義主要包含以下幾個部分

  • Pod期待的副本數
  • 用於篩選目標的Label Selector
  • 當Pod的副本數量小於預期值的時候,用於建立新pod的模板

接着咱們運行以下命令來建立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相關容器的建立操做,咱們只須要統一按照既定的排版規範就能編寫咱們所需的容器

3.二、建立Service

容器建立好了,其實咱們還有一位角色要粉墨登場,有了它的幫助。才叫一個合理的‘微服務’。其實k8s中service是一個很是很是核心的概念,它相似於代理門戶,同時它屏蔽了pod與外界訪問。咱們來看一下模板示例:

apiVersion: v1
    kind: Service
    metadata:
      name: tomcat
    spec:
      type: NodePort
      ports:
        - port: 8080
          protocol: tcp
          nodePort: 30001
      selector:
        app: tomcat
  • 默認狀況下NodePort是外界訪問k8s集羣的一種方式,nodePort的值是外界訪問的端口它會被映射到容器的8080端口上
  • selector.app的做用是將咱們的Service與後臺運行的pod相關聯

而後運行以下命令建立服務:

$ 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便可得到對應的結果

相關文章
相關標籤/搜索