容器編排之Kubernetes安裝與配置

在經歷了幾年混亂的職業生涯之後,初步把未來延伸領域定位在容器雲方向。區塊鏈系列我還會繼續寫下去,且可能只會關注Hyperledger。

雲計算是最近幾年來火熱的技術領域,不同於其他,他沒有固定的行業領域限制,他只是基礎設施。任何基建於計算機上的服務,在達到一定規模後,都可應用雲計算解決方案使硬體資源高效利用,統一開發運維,提高服務可靠性,降低企業支出等等。近兩年火熱的大數據、人工智慧等都離不開背後計算集群的支持。擁抱雲計算,擁抱未來。且說到雲計算,外行人都會覺得很高大上,其實我覺得更多的是拿來主義,就是將一系列開源軟體按照公司的業務架構搭配起來,大部分的工作其實是熟悉開源軟體,解決他們的坑,順便反饋開源社區,促進其發展。

雲計算也是有領域劃分的,從物理機-->虛擬機-->容器技術的發展,孵化出了openstack、docker,kubernetes等這樣的開源項目,openstack使得物理機到虛擬機的轉變變的簡單,而docker的出現,更是將這種簡單極致化,將雲計算推向容器雲階段。而如何將docker的容器在集群的規模上高效的管理,則是kubernetes出現的源動力。

廢話不多說,本文主要是手動安裝配置kubernetes集群,一個master節點(10.1.2.154)和兩個node節點(10.1.2.147、10.1.2.148)。發文的時候,kubernetes的最新版本為1.6.1,我們就安裝這個版本吧。下載地址

系統配置

Linux i-pw3kctun 4.4.0-42-generic #62-Ubuntu SMP Fri Oct 7 23:11:45 UTC 2016 x86_64 x86_64 x86_64 GNU/LinuxnnH/W path Device Class Descriptionn==================================================n system OpenStack Novan/0 bus Motherboardn/0/0 memory 96KiB BIOSn/0/400 processor Intel Core Processor (Haswell)n/0/1000 memory 1GiB System Memoryn/0/1000/0 memory 1GiB DIMM RAMn/0/100 bridge 440FX - 82441FX PMC [Natoma]n/0/100/1 bridge 82371SB PIIX3 ISA [Natoma/Triton II]n/0/100/1.1 storage 82371SB PIIX3 IDE [Natoma/Triton II]n/0/100/1.2 bus 82371SB PIIX3 USB [Natoma/Triton II]n/0/100/1.2/1 usb1 bus UHCI Host Controllern/0/100/1.2/1/1 input QEMU USB Tabletn/0/100/1.3 bridge 82371AB/EB/MB PIIX4 ACPIn/0/100/2 display GD 5446n/0/100/3 eth0 network Virtio network devicen/0/100/4 communication Virtio consolen/0/100/5 storage Virtio block devicen/0/100/6 generic Virtio memory balloonn

先決條件

  1. 在node節點必須有docker,docker的安裝請參考官方文檔
  2. etcd 3:因為kubernetes1.6版本切換到了etcd 3,所以不要安裝錯了,安裝文檔參考官方文檔
  3. flannel:此處我們採用flannel作為kubernetes的網路增強組件,現在有很多第三方開源軟體支持kubernetes的集群pod互通,flannel只是其中的一種。安裝文檔參考官方文檔

自定義安裝

kubernetes官方提供了各種各樣的安裝方式,基於雲提供商的,基於juju的,基於homebrew的,基於源碼編譯的,此處我們選擇已經編譯好的二進位文件安裝。

下載地址

註:下載下來的並不是kubernetes的可執行文件,而是一系列的腳本,可以理解為kubernetes 的下載器

下載下來後,解壓縮

tar xzvf kubernetes.tar.gzncd kubernetesn

執行get-kube-binaries.sh下載server和client的可執行文件

$ ./cluster/get-kube-binaries.shnKubernetes release: v1.6.1nServer: linux/amd64 (to override, set KUBERNETES_SERVER_ARCH)nClient: linux/amd64 (autodetected)nnWill download kubernetes-server-linux-amd64.tar.gz from https://storage.googleapis.com/kubernetes-release/release/v1.6.1nWill download and extract kubernetes-client-linux-amd64.tar.gz from https://storage.googleapis.com/kubernetes-release/release/v1.6.1nIs this ok? [Y]/nnyn % Total % Received % Xferd Average Speed Time Time Time Currentn Dload Upload Total Spent Left Speedn 1 346M 1 3598k 0 0 398k 0 0:14:52 0:00:09 0:14:43 464knnmd5sum(kubernetes-server-linux-amd64.tar.gz)=c4c1e770789b5017df9f0ab0e945320ansha1sum(kubernetes-server-linux-amd64.tar.gz)=34066d8230a276650ad65ca459ac28dd2901e1c0nn % Total % Received % Xferd Average Speed Time Time Time Currentn Dload Upload Total Spent Left Speedn 63 29.0M 63 18.3M 0 0 367k 0 0:01:20 0:00:51 0:00:29 396knnmd5sum(kubernetes-client-linux-amd64.tar.gz)=c2acf197ee6d9b56d3ee790b9aee789dnsha1sum(kubernetes-client-linux-amd64.tar.gz)=10466d24f9e11f749b2b20747b4f096c664b05f3nnExtracting /root/kubernetes/client/kubernetes-client-linux-amd64.tar.gz into /root/kubernetes/platforms/linux/amd64nAdd /root/kubernetes/client/bin to your PATH to use newly-installed binaries.n

執行該shell會自動下載kube的server和client可執行文件,其中客戶端文件會自動安裝在kubernetes目錄下的client文件夾下,只需將bin添加到PATH下就可以了。

可以不用管這裡的bin,server的可執行包里也包含了客戶端命令行工具

服務端可執行文件下載到了server文件夾,沒有被自動展開

cd serverntar xzvf kubernetes-server-linux-amd64.tar.gznll kubernetes/server/binntotal 1.6Gn-rwxr-x--- 1 root root 115M Apr 4 04:54 cloud-controller-managern-rwxr-x--- 1 root root 182M Apr 4 04:54 hyperkuben-rwxr-x--- 1 root root 53M Apr 4 04:54 kube-aggregatorn-rw-r----- 1 root root 33 Apr 4 04:54 kube-aggregator.docker_tagn-rw-r----- 1 root root 54M Apr 4 04:54 kube-aggregator.tarn-rwxr-x--- 1 root root 143M Apr 4 04:54 kube-apiservern-rw-r----- 1 root root 33 Apr 4 04:54 kube-apiserver.docker_tagn-rw-r----- 1 root root 144M Apr 4 04:54 kube-apiserver.tarn-rwxr-x--- 1 root root 126M Apr 4 04:54 kube-controller-managern-rw-r----- 1 root root 33 Apr 4 04:54 kube-controller-manager.docker_tagn-rw-r----- 1 root root 127M Apr 4 04:54 kube-controller-manager.tarn-rwxr-x--- 1 root root 62M Apr 4 04:54 kube-proxyn-rw-r----- 1 root root 33 Apr 4 04:54 kube-proxy.docker_tagn-rw-r----- 1 root root 106M Apr 4 04:54 kube-proxy.tarn-rwxr-x--- 1 root root 73M Apr 4 04:54 kube-schedulern-rw-r----- 1 root root 33 Apr 4 04:54 kube-scheduler.docker_tagn-rw-r----- 1 root root 74M Apr 4 04:54 kube-scheduler.tarn-rwxr-x--- 1 root root 67M Apr 4 04:54 kubeadmn-rwxr-x--- 1 root root 68M Apr 4 04:54 kubectln-rwxr-x--- 1 root root 65M Apr 4 04:54 kubefedn-rwxr-x--- 1 root root 133M Apr 4 04:54 kubeletn

這裡就是最新版本的kubernetes可執行文件列表。要構建kubernetes集群,需要在master節點啟動kube-apiserver, kube-controller-manager, kube-scheduler,在每個Node節點啟動kubelet和kube-proxy。這裡我們不直接執行,採用systemctl管理。

註:需要根據個人伺服器文件路徑自由定義,不可照抄

kube-apiserver.service

[Unit]nDescription=Kube-apiserver ServicenAfter=network.targetnn[Service]nType=notifynExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-apiserver n --admission-control=NamespaceAutoProvision,LimitRanger,SecurityContextDeny n --apiserver-count=1 n --cors-allowed-origins=.* n --enable-garbage-collector=false n --etcd-servers=http://10.1.2.154:2379 n --insecure-bind-address=0.0.0.0 n --insecure-port=8080 n --log-dir=/root/kubernetes/kube-apiserver n --logtostderr=false n --service-cluster-ip-range=192.168.2.0/24 n --v=5 nnRestart=alwaysnLimitNOFILE=65536nn[Install]nWantedBy=default.targetn

kube-controller-manager.service

[Unit]nDescription=Kube-controller-manager ServicenAfter=network.targetnn[Service]nType=simplenExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-controller-manager n --enable-garbage-collector=false n --logtostderr=false n --log-dir=/root/kubernetes/log/kube-controller-manager n --pod-eviction-timeout=5m0s n --master=http://0.0.0.0:8080 n --node-monitor-grace-period=40s n --terminated-pod-gc-threshold=12500 n --leader-elect=true n --v=4 nnRestart=alwaysnLimitNOFILE=65536nn[Install]nWantedBy=default.targetn

kube-scheduler.service

[Unit]nDescription=Kube-scheduler ServicenAfter=network.targetnn[Service]nType=simplenExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-scheduler n --log-dir=/root/kubernetes/log/kube-scheduler n --logtostderr=false n --master=http://0.0.0.0:8080 n --leader-elect=true n --v=5 nnRestart=alwaysnLimitNOFILE=65536nn[Install]nWantedBy=default.targetn

接著執行命令:

systemctl --system daemon-reloadnsystemctl start kube-apiserver.servicensystemctl start kube-controller-manager.servicensystemctl start kube-scheduler.servicen

如果想隨伺服器自動啟動,請參考systemctl相關命令

這樣,master上的kubernetes組件就全部跑起來了,可以使用kubectl檢查是否運行正常:

╭─root@i-pyv2wj89 in ~/kubernetes/server/kubernetes/server/binn╰$ ./kubectl cluster-infonKubernetes master is running at http://localhost:8080nnTo further debug and diagnose cluster problems, use kubectl cluster-info dump.n

接著,搭建兩個Node節點,可以只將kube-proxy和kubelet拷貝到Node節點。

kubelet.service

[Unit]nDescription=Kubelet ServicenAfter=network.targetnn[Service]nType=simplenExecStart=/root/kubernetes/kubelet n --api-servers=http://10.1.2.154:8080 n --hostname-override=10.1.2.147 n --image-gc-high-threshold=80 n --image-gc-low-threshold=50 n --log-dir=/root/kubernetes/log/kubelet n --logtostderr=false n --system-reserved cpu=2000m,memory=4G n --v=5 nnRestart=alwaysnLimitNOFILE=65536nn[Install]nWantedBy=default.targetn

kube-proxy.service

[Unit]nDescription=Kube-proxy ServicenAfter=network.targetnn[Service]nType=simplenExecStart=/root/kubernetes/kube-proxy n --log-dir=/root/kubernetes/log/kube-proxy n --logtostderr=false n --master=http://10.1.2.154:8080 n --v=5 nnRestart=alwaysnLimitNOFILE=65536nn[Install]nWantedBy=default.targetn

systemctl --system daemon-reloadnsystemctl start kubelet.servicensystemctl start kube-proxy.servicen

檢查集群搭建情況:

i-pyv2wj89 :: ~ ? ./kubernetes/client/bin/kubectl get nodenNAME STATUS AGE VERSIONn10.1.2.147 Ready 24m v1.6.1n10.1.2.148 Ready 1m v1.6.1n

自此,kubernetes集群就搭建起來了,供大家參考。當然,這是最簡單的集群配置,用於學習夠了,但是生產環境還是要自定義更多的配置項。

下一篇文章我會寫kubernetes的認證與授權,敬請期待!

註:flannel其實跟kubernetes的集群是沒有關聯在一起的,flannel的主要作用是配置Node節點的docker IP範圍,具體做法請另行查閱。

推薦閱讀:

kubernetes的網路實現
kubernetes1.4.5安裝文檔
編排工具充分發揮了 Linux 容器技術優勢
漫畫:小黃人學 Kubernetes Service

TAG:Kubernetes | 容器云 | Docker |