當前位置:
首頁 > 知識 > 本機搭建三節點 k8s 集群

本機搭建三節點 k8s 集群

(點擊

上方公眾號

,可快速關注)




來源:Rainstorm ,


github.com/c-rainstorm/blog/blob/master/devops/本機搭建三節點k8s集群.md




畢業設計題目是寫一個基於微服務的高可用應用系統。微服務的部署使用 docker + k8s,所以前提是要有一個 k8s 集群。搭建過程中遇到了一些坑,把整個流程 記錄下來一是回顧搭建過程,二是希望能儘可能的幫助後來的 k8s beginners 少走些彎路。




本文的側重點在實際操作,k8s 組件基本概念相關的信息請參考

k8s 官方文檔

Kubernetes 指南 – by feiskyer





https://kubernetes.io/docs/concepts/


https://github.com/feiskyer/kubernetes-handbook




如果對於本文有什麼建議、意見及疑問,歡迎提 issue,或直接發郵件交流(郵箱很容易能找到,不再提供)。



環境依賴




本文假設讀者會使用 Linux 命令行。




k8s 的鏡像源在牆外,所以需要讀者掌握科學上網的技能。這個部分不屬於本文的描述範圍,我使用的方案是 Shadowsocks + Privoxy,有需要可以跟我交流。





- Docker    : 1.13.1


- kube*     : 1.10


- flannel   : 0.10.0


- virtualBox: 5.2.8


- OS        : ubuntu-16.04.4-server-amd64.iso



virtualBox 的版本不太重要,Docker 和 kube* 的版本最好使用 k8s 推薦的版本,否則可能會有問題,推薦的 Docker 版本可以在版本的 release 文檔中查看。OS 的版本不同,後面的一些配置的方法會略有不同。




搭建目標







flannel.1 是 每台機器上的一個 VNI,通過 ifconfig 命令可以查看該介面的信息。



從任意一台機器 ping 另外兩台機器 flanel.1 的 IP 能通就算集群搭建成功。





# from master


$ ping 10.244.1.0


PING 10.244.1.0 (10.244.1.0) 56(84) bytes of data.


64 bytes from 10.244.1.0: icmp_seq=1 ttl=64 time=0.659 ms


64 bytes from 10.244.1.0: icmp_seq=2 ttl=64 time=0.478 ms


64 bytes from 10.244.1.0: icmp_seq=3 ttl=64 time=0.613 ms


^C


--- 10.244.1.0 ping statistics ---


3 packets transmitted, 3 received, 0% packet loss, time 1999ms


rtt min/avg/max/mdev = 0.478/0.583/0.659/0.079 ms


 


$ ping 10.244.2.0


PING 10.244.2.0 (10.244.2.0) 56(84) bytes of data.


64 bytes from 10.244.2.0: icmp_seq=1 ttl=64 time=0.459 ms


64 bytes from 10.244.2.0: icmp_seq=2 ttl=64 time=0.504 ms


64 bytes from 10.244.2.0: icmp_seq=3 ttl=64 time=0.553 ms


^C


--- 10.244.2.0 ping statistics ---


3 packets transmitted, 3 received, 0% packet loss, time 2058ms


rtt min/avg/max/mdev = 0.459/0.505/0.553/0.042 ms




k8s 個組件之間的關係







其實這個沒必要多說,

Kubernetes Components

Kubernetes 核心組件 – by feiskyer

講的已經非常好了,這裡提到只是強調一下這部分的重要性。





https://kubernetes.io/docs/concepts/overview/components/


https://kubernetes.feisky.xyz/zh/components/




k8s Pod 網路模型簡介







圖片來源:

一次Flannel和Docker網路不通定位問題





http://www.cnblogs.com/ericnie/p/8028681.html




為了省事,我直接引用了別人畫的模型圖。對於本次搭建的集群模型簡單描述如下:









  • cni0 和 flannel.1 都是 VNI,由 flannel 組件創建,集群搭建完成後可以通過 ifconfig 進行查看。



  • flannel 組件 在每台機器上運行了一個 flanneld,它是用來轉發流量,解決主機間通信的問題。



  • enp0s8 是 virtualBox 的 Host-Only 適配器。




配置流程




使用 virtualBox 創建三台虛擬機




virtualBox 安裝比較簡單,不再介紹,GUI 工具用起來也很方便,這部分只介紹我認為需要提示的部分。






  1. 內存推薦 2048M, CPU 推薦 2個



  2. 默認只有一個 NAT 適配器,添加一個 Host-Only Adapter。NAT 適配器是虛擬機用來訪問互聯網的,Host-Only 適配器是用來虛擬機之間通信的。



  3. 以 Normal Start 方式啟動虛擬機安裝完系統以後,因為是 server 版鏡像,所以沒有圖形界面,直接使用用戶名密碼登錄即可。



  4. 修改配置,enp0s8 使用靜態 IP。配置請參考

    SSH between Mac OS X host and Virtual Box guest

    。注意配置時將其中的網路介面名改成你自己的 Host-Only Adapter 對應的介面。



  5. 一台虛擬機創建完成以後可以使用 clone 方法複製出兩台節點出來,注意 clone 時為新機器的網卡重新初始化 MAC 地址。



  6. 三台虛擬機的靜態 IP 都配置好以後就可以使用 ssh 在本地主機的終端上操作三台虛機了。虛機使用 Headless Start 模式啟動





https://gist.github.com/c-rainstorm/1bbd44b388acd35ca6eaf07d1fbd9bc7




安裝 Docker




三台都裝




當前 Ubuntu 的 docker 版本剛好合適,所以可以直接安裝,但是有必要提前查看一下 docker 版本,以免裝錯。





# apt search docker.io


apt-get update


apt-get install -y docker.io


systemctl enable docker


systemctl start docker




docker 配置代理

。鏡像源在牆外,docker pull image 需要代理





mkdir -p /etc/systemd/system/docker.service.d


 


cat <<EOF >/etc/systemd/system/docker.service.d/http-proxy.conf


[Service]


Environment="HTTP_PROXY=https://192.168.99.1:8118/"


Environment="HTTPS_PROXY=https://192.168.99.1:8118/"



Environment="NO_PROXY=localhost,127.0.0.1,localaddress,.localdomain.com"


EOF


 


systemctl daemon-reload


systemctl restart docker




測試配置





docker info | grep Proxy  # 有輸出說明配置成功


 


docker pull gcr.io/google-containers/busybox:1.27 # pull 成功代表工作正常。




Google 鏡像庫





https://console.cloud.google.com/gcr/images/google-containers/GLOBAL?project=google-containers




安裝 kube* 組件




三台都裝





apt-get update && apt-get install -y apt-transport-https


curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -


cat <<EOF >/etc/apt/sources.list.d/kubernetes.list


deb http://apt.kubernetes.io/ kubernetes-xenial main


EOF


apt-get update


apt-get install -y kubelet kubeadm kubectl


systemctl enable kubelet


systemctl start kubelet




Master 節點配置 cgroup driver





docker info | grep -i cgroup  # 一般是 cgroupfs


cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  # --cgroup-driver 對應值默認是 systemd


 


#兩個值不一致的話使用以下命令修改


sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf


 


#重啟 kubelet


systemctl daemon-reload


systemctl restart kubelet




curl 訪問的是牆外的網站,無法訪問的話可以配置系統代理。


http://192.168.99.1:8118/ 是我本地使用的 HTTP 代理,Privoxy 監聽 8118 埠,按照實際情況修改該地址。





# 全局代理,不推薦


cat <<EOF >>/etc/environment


http_proxy="http://192.168.99.1:8118/"


https_proxy="http://192.168.99.1:8118/"


no_proxy="master, node1, node2, 192.168.99.1"


EOF


source /etc/environment


 


#當前 shell,推薦


export http_proxy="http://192.168.99.1:8118/"


export https_proxy="http://192.168.99.1:8118/"


export no_proxy="master, node1, node2, 192.168.99.1"




apt 使用代理





cat <<EOF >>/etc/apt/apt.conf


Acquire::http::Proxy "http://192.168.99.1:8118/";


Acquire::https::Proxy "https://192.168.99.1:8118/";


EOF




搭建集群




禁用交換區




k8s 文檔明確要求的。




三台都禁用





swapoff -a




初始化 master 節點




初始化過程會訪問牆外網站,如果 init 不能順利執行,請配置全局代理





kubeadm init --apiserver-advertise-address=192.168.99.200 --pod-network-cidr=10.244.0.0/16






  1. --apiserver-advertise-address=192.168.99.200 綁定 apiserver 到 master 節點的 Host-Only 適配器的地址,默認是綁到 NAT 的地址上,這樣其他機器是永遠也訪問不到的。



  2. --pod-network-cidr=10.244.0.0/16 指定 pod 網路地址空間,我們使用 flannel 組件必須使用這個空間。



  3. kubeadm 的完整參考手冊 kubeadm reference guide



  4. 推薦保存最後輸出的 join 命令到文件(以免忘記或找不到了),方便添加節點到集群。如果忘了也找不到輸出了,網上有方法生成哈希值,請自行查找。




配置 kubectl 訪問集群





# root user


export KUBECONFIG=/etc/kubernetes/admin.conf


 


# non-root user


mkdir -p $HOME/.kube


sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config


sudo chown $(id -u):$(id -g) $HOME/.kube/config


 


# 從本地主機操作,需要在本地安裝 kubectl 客戶端


mkdir -p ~/.kube


 


scp <username>@192.168.99.200:/home/<username>/.kube/config ~/.kube/config # 從 master 複製配置文件到本地




測試配置





kubectl cluster-info #有正常輸出即可




安裝 flannel 網路




flannel 默認的監聽介面是 NAT 適配器的介面,我們需要的是 Host-Only 適配器的介面,所以需要修改 kube-flannel.yml 文件





wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


 


給 /opt/bin/flanneld 命令添加 --iface="enp0s8" 參數 # enp0s8 是 Host-Only 適配器對應的介面


 


kubectl apply -f kube-flannel.yml




測試配置





kubectl get pods --all-namespaces -o wide # 稍等一會,下載鏡像需要一定時間,最後應該顯示 flannel pods 是 Running 狀態, kube-dns 也是 Running 狀態




消除 master 隔離。默認 master 上不調度 pods,要允許另外的 pods 在 master 上運行請執行該命令





kubectl taint nodes --all node-role.kubernetes.io/master-




添加節點到集群




在節點上執行 kubeadm init 最後輸出的 join 命令





kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>




最後




feiskyer 為該搭建過程寫了

自動化腳本

,有興趣可以嘗試一下。





https://github.com/feiskyer/ops




參考






  1. k8s 官方文檔


    https://kubernetes.io/docs/concepts/



  2. Kubernetes 指南 – by feiskyer


    https://github.com/feiskyer/kubernetes-handbook



  3. 一次Flannel和Docker網路不通定位問題


    http://www.cnblogs.com/ericnie/p/8028681.html



  4. coreos/flannel – README


    https://github.com/coreos/flannel/blob/master/README.md



  5. Installing kubeadm


    https://kubernetes.io/docs/setup/independent/install-kubeadm/



  6. Docker Ubuntu Behind Proxy


    https://stackoverflow.com/questions/26550360/docker-ubuntu-behind-proxy?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa



  7. Using kubeadm to Create a Cluster


    https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/




看完本文有收穫?請轉發分享給更多人


關注「ImportNew」,提升Java技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ImportNew 的精彩文章:

如果非得了解下 git 系統… – 實踐篇
關於 JVM 內存的 N 個問題

TAG:ImportNew |