iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 17

day17_k8s03_利用ansible建k8s cluster

今天來跑看看 Kyle Bai 大大的 kube-ansible 專案

在完成 Kyle Bai 大大的「利用 kubeadm 部署 Kubernetes v1.11.x HA 叢集」之後,

Kyle Bai 大大在2018/8/12又發表了一篇「開發 Ansible Playbooks 部署 Kubernetes v1.11.x HA 叢集」
https://kairen.github.io/2018/08/12/kubernetes/deploy/k8s-ansible-ha/
偶立馬變成小粉絲啦,我們先來跑看看,
再來學習Kyle Bai 大大是如何把 kubeadm 的諸多步驟寫到 Ansible Playbooks吧~

步驟的部分請直接看Kyle Bai 大大的文章,
我只列出執行的過程中遇到的問題,及排除方式

事前準備

本來用一個ubuntu的vm跑,但cpu溫度會升很高
後來直接在 macOS 跑 vagrant up

有關ansible的安裝,之前就介紹過了,這邊要檢查的項目如下:

  • 1.所有Node都要有python,ubuntu預設應該就符合了
  • 2.因為我們沒另外架DNS,所以…
    理論上,各Node的/etc/hosts都要列舉所有的Node,k8s-m1 172.22.132.8....
    但這個 ansible都幫我們作了,若成功跑完 kube-ansible 專案 再到各virtualbox裡 nslookup k8s-m1 看看
  • 3.mac 要裝 sshpass,brew前面有介紹安裝方式了
$ brew install http://git.io/sshpass.rb

只有 控制主機 (Control Machine) 需要裝ansible
在我們的實作中…
控制主機 (Control Machine) 是VM(各Node)的Host(媽媽)喔

  • Ansible安裝Ubuntu
$ sudo apt-get install -y software-properties-common git cowsay
$ sudo apt-add-repository -y ppa:ansible/ansible
$ sudo apt-get update && sudo apt-get install -y ansible
  • Ansible安裝macOS
$ brew install ansible

以下操作都是在 控制主機 (Control Machine)

  • 先clone kube-ansible 專案
$ git clone https://github.com/kairen/kube-ansible.git

=====

重要設定

我只跑1個master、2個worker node喔

我大概只改ip而已吧
大家可以直接跑看看,不work再來改ip

  • inventory/group_vars/all.yml
kube_version: 1.11.2 # 版本可以設新一點
  • inventory/hosts.ini
[etcds]
172.16.35.[10:10] ansible_user=vagrant ansible_password=vagrant

[masters] # 你也可以嘗試2個master,試HA,這個專案應該沒問題
172.16.35.[10:10] ansible_user=vagrant ansible_password=vagrant

[nodes] # 如果你的電腦不太好,可以改成[11:11] 只開1台就好
172.16.35.[11:12] ansible_user=vagrant ansible_password=vagrant

[kube-cluster:children]
masters
nodes
  • Vagrantfile
def set_vbox(vb, config)
  vb.gui = false
  vb.memory = $system_memory
  vb.cpus = $system_vcpus

  case $os_image
  when :ubuntu16
    config.vm.box = "bento/ubuntu-18.04" # 改成18.04是ok的,18.10還沒試過
  end
end

註:很多參數寫在roles裡面

首先要用vagrant建vm
專案抓下來是用Ubuntu 16.04,如果你要試Ubunt 18.04,要編輯Vagrantfile
建議用root帳號跑

$ sudo su
  • 在 kube-ansible 目錄執行
$ ./hack/setup-vms >> 16-1.log # 通常會跑蠻久的,而且有很多fail,輸出到 log 慢慢看

用2013年的mbp i7跑,溫度大概70~90度,風扇切強一點嘿

$ vagrant halt # 停掉 3台 virtualbox vm
$ vagrant up 
$ vagrant ssh k8s-m1 # 連到 k8s-m1
vagrant@k8s-m1:~$ cat /etc/hosts
172.16.35.10 k8s-m1

IP address for eth0:  10.0.2.15
IP address for eth1:  172.16.35.10
IP address for docker0: 172.17.0.1
IP address for tunl0:  10.244.0.1

172.16.35.11 k8s-n1
172.16.35.12 k8s-n2
vagrant@k8s-m1:~$ ping k8s-n1
PING k8s-n1 (172.16.35.11) 56(84) bytes of data.
64 bytes from k8s-n1 (172.16.35.11): icmp_seq=1 ttl=64 time=0.648 ms
  • 在host,利用ansible,叫一聲來聽聽
$ ~/16kube-ansible$ ansible -i inventory/hosts.ini all -m ping
172.16.35.10 | SUCCESS => {
  "changed": false, 
  "ping": "pong"
}

172.16.35.11 | SUCCESS => {
  "changed": false, 
  "ping": "pong"
}

172.16.35.12 | SUCCESS => {
  "changed": false, 
  "ping": "pong"
}

  • 失敗就清掉重來
$ ./hack/clear-vms 

# 參考文章裡的設定,修改下面2個檔案
inventory/hosts.ini
group_vars/all.yml

[etcds] # 網路
k8s-m[1:1] ansible_user=ubuntu

[masters]
k8s-m[1:1] ansible_user=ubuntu

[nodes] # Worker Node
k8s-n1 ansible_user=ubuntu
k8s-n2 ansible_user=ubuntu

[kube-cluster:children]  
masters # 上面定義的
nodes # 上面定義的
  • 透過 Ansible 來檢查每個hosts(Node)的狀態
$ ansible -i inventory/hosts.ini all -m ping # 確認網路狀態
$ ansible-playbook -i inventory/hosts.ini cluster.yml # 部署 Kubernetes 叢集

問題排除

如果下

$ kubectl version
或
$ kubectl get nodes
這到下面這個訊息
The connection to the server localhost:8080 was refused - did you specify the right host or port?

試試看

$ export KUBECONFIG=/etc/kubernetes/admin.conf

進Master Node (k8s-m1)

  • 試玩一下
# 查看元件狀態
$ kubectl get cs

# 查看節點狀態
$ kubectl get no

# 使用Master Node命令Worker Node建Pod
# 測試是否可以建立 Pod
$ kubectl run nginx --image nginx --restart=Never --port 80
$ kubectl expose pod nginx --port 80 --type NodePort
$ kubectl get po,svc
$ curl 172.22.132.8:xxxxx # 測試服務
  • Addons 部署
$ ansible-playbook -i inventory/hosts.ini addons.yml # 透過addons.yml來部署 Kubernetes extra addons

# 透過 kubectl 來檢查服務,如 kubernetes-dashboard
$ kubectl get po,svc -n kube-system -l k8s-app=kubernetes-dashboard

# 清cluster
$ ansible-playbook -i inventory/hosts.ini reset-cluster.yml

===

結語

本來想解析kube-ansible/roles
因為這個專案的role我只看得懂3成
所以就不寫啦

明天開始會介紹k8s的各項主題(混混天數)

最後幾天會再重新介紹ansible的各種基礎,
相信到時回來看就可以看懂5成了吧?

ansible真的值得花時間學!!


上一篇
day16_k8s02_用kubeadm建k8s cluster
下一篇
day18_k8s04_kubectl,pod state,deployment,label&selector,health checks
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

尚未有邦友留言

立即登入留言