容器編排之Kubernetes1.6.1安裝與配置_Kubernetes中文社群
在經歷了幾年混亂的職業生涯之後,初步把未來延伸領域定位在容器雲方向。區塊鏈系列我還會繼續寫下去,且可能只會關注Hyperledger。
雲端計算是最近幾年來火熱的技術領域,不同於其他,他沒有固定的行業領域限制,他只是基礎設施。任何基建於計算機上的服務,在達到一定規模後,都可應用雲端計算解決方案使硬體資源高效利用,統一開發運維,提高服務可靠性,降低企業支出等等。近兩年火熱的大資料、人工智慧等都離不開背後計算叢集的支援。擁抱雲端計算,擁抱未來。且說到雲端計算,外行人都會覺得很高大上,其實我覺得更多的是拿來主義,就是將一系列開源軟體按照公司的業務架構搭配起來,大部分的工作其實是熟悉開源軟體,解決他們的坑,順便反饋開源社群,促進其發展。
雲端計算也是有領域劃分的,從物理機–>虛擬機器–>容器技術的發展,孵化出了openstack、docker,kubernetes等這樣的開源專案,openstack使得物理機到虛擬機器的轉變變的簡單,而docker的出現,更是將這種簡單極致化,將雲端計算推向容器雲階段。而如何將docker的容器在叢集的規模上高效的管理,則是kubernetes出現的源動力。
廢話不多說,本文主要是手動安裝配置kubernetes叢集,一個master節點(10.1.2.146)和兩個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/Linux H/W path Device Class Description ================================================== system OpenStack Nova /0 bus Motherboard /0/0 memory 96KiB BIOS /0/400 processor Intel Core Processor (Haswell) /0/1000 memory 1GiB System Memory /0/1000/0 memory 1GiB DIMM RAM /0/100 bridge 440FX - 82441FX PMC [Natoma] /0/100/1 bridge 82371SB PIIX3 ISA [Natoma/Triton II] /0/100/1.1 storage 82371SB PIIX3 IDE [Natoma/Triton II] /0/100/1.2 bus 82371SB PIIX3 USB [Natoma/Triton II] /0/100/1.2/1 usb1 bus UHCI Host Controller /0/100/1.2/1/1 input QEMU USB Tablet /0/100/1.3 bridge 82371AB/EB/MB PIIX4 ACPI /0/100/2 display GD 5446 /0/100/3 eth0 network Virtio network device /0/100/4 communication Virtio console /0/100/5 storage Virtio block device /0/100/6 generic Virtio memory balloon
先決條件
- 在node節點必須有docker,docker的安裝請參考官方文件
- etcd 3:因為kubernetes1.6版本切換到了etcd 3,所以不要安裝錯了,安裝文件參考官方文件
- flannel:此處我們採用flannel作為kubernetes的網路增強元件,現在有很多第三方開源軟體支援kubernetes的叢集pod互通,flannel只是其中的一種。安裝文件參考官方文件
自定義安裝
kubernetes官方提供了各種各樣的安裝方式,基於雲提供商的,基於juju的,基於homebrew的,基於原始碼編譯的,此處我們選擇已經編譯好的二進位制檔案安裝。
注:下載下來的並不是kubernetes的可執行檔案,而是一系列的指令碼,可以理解為kubernetes 的下載器
下載下來後,解壓縮
tar xzvf kubernetes.tar.gz
cd kubernetes
執行get-kube-binaries.sh下載server和client的可執行檔案
$ ./cluster/get-kube-binaries.sh
Kubernetes release: v1.6.1
Server: linux/amd64 (to override, set KUBERNETES_SERVER_ARCH)
Client: linux/amd64 (autodetected)
Will download kubernetes-server-linux-amd64.tar.gz from https://storage.googleapis.com/kubernetes-release/release/v1.6.1
Will download and extract kubernetes-client-linux-amd64.tar.gz from https://storage.googleapis.com/kubernetes-release/release/v1.6.1
Is this ok? [Y]/n
y
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
1 346M 1 3598k 0 0 398k 0 0:14:52 0:00:09 0:14:43 464k
md5sum(kubernetes-server-linux-amd64.tar.gz)=c4c1e770789b5017df9f0ab0e945320a
sha1sum(kubernetes-server-linux-amd64.tar.gz)=34066d8230a276650ad65ca459ac28dd2901e1c0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
63 29.0M 63 18.3M 0 0 367k 0 0:01:20 0:00:51 0:00:29 396k
md5sum(kubernetes-client-linux-amd64.tar.gz)=c2acf197ee6d9b56d3ee790b9aee789d
sha1sum(kubernetes-client-linux-amd64.tar.gz)=10466d24f9e11f749b2b20747b4f096c664b05f3
Extracting /root/kubernetes/client/kubernetes-client-linux-amd64.tar.gz into /root/kubernetes/platforms/linux/amd64
Add '/root/kubernetes/client/bin' to your PATH to use newly-installed binaries.
執行該shell會自動下載kube的server和client可執行檔案,其中客戶端檔案會自動安裝在kubernetes目錄下的client資料夾下,只需將bin新增到PATH下就可以了。
可以不用管這裡的bin,server的可執行包裡也包含了客戶端命令列工具
服務端可執行檔案下載到了server資料夾,沒有被自動展開
cd server
tar xzvf kubernetes-server-linux-amd64.tar.gz
ll kubernetes/server/bin
total 1.6G
-rwxr-x--- 1 root root 115M Apr 4 04:54 cloud-controller-manager
-rwxr-x--- 1 root root 182M Apr 4 04:54 hyperkube
-rwxr-x--- 1 root root 53M Apr 4 04:54 kube-aggregator
-rw-r----- 1 root root 33 Apr 4 04:54 kube-aggregator.docker_tag
-rw-r----- 1 root root 54M Apr 4 04:54 kube-aggregator.tar
-rwxr-x--- 1 root root 143M Apr 4 04:54 kube-apiserver
-rw-r----- 1 root root 33 Apr 4 04:54 kube-apiserver.docker_tag
-rw-r----- 1 root root 144M Apr 4 04:54 kube-apiserver.tar
-rwxr-x--- 1 root root 126M Apr 4 04:54 kube-controller-manager
-rw-r----- 1 root root 33 Apr 4 04:54 kube-controller-manager.docker_tag
-rw-r----- 1 root root 127M Apr 4 04:54 kube-controller-manager.tar
-rwxr-x--- 1 root root 62M Apr 4 04:54 kube-proxy
-rw-r----- 1 root root 33 Apr 4 04:54 kube-proxy.docker_tag
-rw-r----- 1 root root 106M Apr 4 04:54 kube-proxy.tar
-rwxr-x--- 1 root root 73M Apr 4 04:54 kube-scheduler
-rw-r----- 1 root root 33 Apr 4 04:54 kube-scheduler.docker_tag
-rw-r----- 1 root root 74M Apr 4 04:54 kube-scheduler.tar
-rwxr-x--- 1 root root 67M Apr 4 04:54 kubeadm
-rwxr-x--- 1 root root 68M Apr 4 04:54 kubectl
-rwxr-x--- 1 root root 65M Apr 4 04:54 kubefed
-rwxr-x--- 1 root root 133M Apr 4 04:54 kubelet
這裡就是最新版本的kubernetes可執行檔案列表。要構建kubernetes叢集,需要在master節點啟動kube-apiserver, kube-controller-manager, kube-scheduler,在每個節點啟動kubelet和kube-proxy。這裡我們不直接執行,採用systemctl管理。
注:需要根據個人伺服器檔案路徑自由定義,不可照抄
kube-apiserver.service
[Unit]
Description=Kube-apiserver Service
After=network.target
[Service]
Type=notify
ExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-apiserver \
--admission-control=NamespaceAutoProvision,LimitRanger,SecurityContextDeny \
--apiserver-count=1 \
--cors-allowed-origins=.* \
--enable-garbage-collector=false \
--etcd-servers=http://10.1.2.154:2379 \
--insecure-bind-address=0.0.0.0 \
--insecure-port=8080 \
--log-dir=/root/kubernetes/kube-apiserver \
--logtostderr=false \
--service-cluster-ip-range=192.168.2.0/24 \
--v=5 \
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
kube-controller-manager.service
[Unit]
Description=Kube-controller-manager Service
After=network.target
[Service]
Type=simple
ExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-controller-manager \
--enable-garbage-collector=false \
--logtostderr=false \
--log-dir=/root/kubernetes/log/kube-controller-manager \
--pod-eviction-timeout=5m0s \
--master=http://0.0.0.0:8080 \
--node-monitor-grace-period=40s \
--terminated-pod-gc-threshold=12500 \
--leader-elect=true \
--v=4 \
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
kube-scheduler.service
[Unit]
Description=Kube-scheduler Service
After=network.target
[Service]
Type=simple
ExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-scheduler \
--log-dir=/root/kubernetes/log/kube-scheduler \
--logtostderr=false \
--master=http://0.0.0.0:8080 \
--leader-elect=true \
--v=5 \
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
接著執行命令:
systemctl --system daemon-reload
systemctl start kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service
如果想隨伺服器自動啟動,請參考systemctl相關命令
這樣,master上的kubernetes元件就全部跑起來了,可以使用kubectl檢查是否執行正常:
╭─[email protected] in ~/kubernetes/server/kubernetes/server/bin
╰$ ./kubectl cluster-info
Kubernetes master is running at http://localhost:8080
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
接著,搭建兩個Node節點,可以只將kube-proxy和kubelet拷貝到Node節點。
kubelet.service
[Unit]
Description=Kubelet Service
After=network.target
[Service]
Type=simple
ExecStart=/root/kubernetes/kubelet \
--api-servers=http://10.1.2.154:8080 \
--hostname-override=10.1.2.147 \
--image-gc-high-threshold=80 \
--image-gc-low-threshold=50 \
--log-dir=/root/kubernetes/log/kubelet \
--logtostderr=false \
--pod-infra-container-image=docker.cloudin.com/google_containers/pause-amd64:3.0 \
--system-reserved cpu=2000m,memory=4G \
--v=5 \
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
kube-proxy.service
[Unit]
Description=Kube-proxy Service
After=network.target
[Service]
Type=simple
ExecStart=/root/kubernetes/kube-proxy \
--log-dir=/root/kubernetes/log/kube-proxy \
--logtostderr=false \
--master=http://10.1.2.154:8080 \
--v=5 \
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
systemctl --system daemon-reload
systemctl start kubelet.service
systemctl start kube-proxy.service
檢查叢集搭建情況:
i-pyv2wj89 :: ~ » ./kubernetes/client/bin/kubectl get node
NAME STATUS AGE VERSION
10.1.2.147 Ready 24m v1.6.1
10.1.2.148 Ready 1m v1.6.1
自此,kubernetes叢集就搭建起來了,供大家參考。當然,這是最簡單的叢集配置,用於學習夠了,但是生產環境還是要自定義更多的配置項。
下一篇文章我會寫kubernetes的認證與授權,敬請期待!
注:flannel其實跟kubernetes的叢集是沒有關聯在一起的,flannel的主要作用是配置Node節點的docker IP範圍,具體做法請另行查閱。