kubernetes集羣構建

使用ansable(以二進制的方式)自動的去安裝集羣html

 

kubernetes集羣構建 - newnode

筆記本: 新課程筆記python

建立時間: 2018/9/5 星期三 上午 9:58 更新時間: 2018/10/12 星期五 下午 6:35linux

做者: 306798658@qq.comnginx

URL: https://github.com/gjmzj/kubeasz/blob/master/docs/00-%E9%9B%86%E7%BE%A4%E8%A7%84%E5%88%9…git

 

本文檔參考 https://github.com/gjmzj/kubeaszgithub

擴展(官方kubeadm安裝,也是自動化的): 使用kubeadm部署集羣 https://blog.frognew.com/2018/08/kubeadm-install-kubernetes-1.11.htmldocker

軟硬件限制:json

1)cpu和內存 master:至少1c2g,推薦2c4g;node:至少1c2gbash

2)linux系統 內核版本至少3.10,推薦CentOS7/RHEL7

3)docker 至少1.9版本,推薦1.12+

4)etcd 至少2.0版本,推薦3.0+

kubernetes官方github地址 https://github.com/kubernetes/kubernetes/releases

高可用集羣所需節點規劃:

部署節點------x1 : 運行這份 ansible 腳本的節點

etcd節點------x3 : 注意etcd集羣必須是1,3,5,7...奇數個節點(一個或3個或5個或7個)

master節點----x2 : 根據實際集羣規模能夠增長節點數,須要額外規劃一個master VIP(虛地址)

lb節點--------x2 : 負載均衡節點兩個,安裝 haproxy+keepalived

node節點------x3 : 真正應用負載的節點,根據須要提高機器配置和增長節點數

機器規劃:

ip 主機名 角色

192.168.208.133(134) aming-master deploy、master一、lb一、etcd

192.168.208.134(135) aming-node1 etcd、node

192.168.208.135(136) aming-node2 etcd、node

192.168.208.136(128) aming-master2 master二、lb2

172.7.15.118(150) vip

準備工做

四臺機器,所有執行:

yum install -y epel-release #安裝epel擴展源

yum update

yum install -y python #安裝python

deploy節點安裝和準備ansible

yum install -y python-pip git #這裏使用的pip來安裝ansible,也能夠用以前學過的yum安裝

pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com #升級pip源

pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com #安裝ansible

deploy節點配置免密碼登陸

1)ssh-keygen 生產密鑰 #由於使用ansible傳文件或使用命令,要登陸到機器上去。因此要作祕鑰認證

2)for ip in 128 134 136; do ssh-copy-id 192.168.208.$ip; done #注意實際IP

deploy上編排k8s

git clone https://github.com/gjmzj/kubeasz.git #把k8s這個項目克隆下來

mkdir -p /etc/ansible

mv kubeasz/* /etc/ansible/ #把項目放在新建的文件夾裏

從百度雲網盤下載二進制文件 https://pan.baidu.com/s/1c4RFaA#list/path=%2F #到這裏下載二進制文件的tar包

能夠根據本身所需版本,下載對應的tar包,這裏我下載1.11

通過一番折騰,最終把k8s.1-11-2.tar.gz的tar包放到了depoly上

tar zxvf k8s.1-11-2.tar.gz #解壓後就是一個bin目錄

mv bin/* /etc/ansible/bin/ #裏面都是可執行的文件(直接拿來用的)

配置集羣參數

cd /etc/ansible/

cp example/hosts.m-masters.example hosts //根據實際狀況修改IP地址

[deploy]

172.7.15.113 NTP_ENABLED=no

[etcd]

172.7.15.113 NODE_NAME=etcd1

172.7.15.114 NODE_NAME=etcd2

172.7.15.115 NODE_NAME=etcd3

[kube-master]

172.7.15.113

172.7.15.116

[lb]

172.7.15.113 LB_IF="eno16777736" LB_ROLE=backup # 注意根據實際使用網卡設置 LB_IF變量

172.7.15.116 LB_IF="ens33" LB_ROLE=master

[kube-node]

172.7.15.114

172.7.15.115

 

 

 

修改完hosts,測試

ansible all -m ping

分步驟安裝:

1)建立證書和安裝準備

ansible-playbook 01.prepare.yml #這一步就是建立證書,由於他的通訊走的是https

2)安裝etcd集羣

ansible-playbook 02.etcd.yml

檢查etcd節點健康情況:

for ip in 128 129 130 ; do ETCDCTL_API=3 etcdctl --endpoints=https://192.168.111.$ip:2379 --

cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem endpoint healt; done #若是顯示etcdctl命令未找到,要執行一下bash,由於在拷貝的時候雖然已通過去了,但還沒生效。只有出現以下圖,才證實你的etcd集羣正常:

 

3)安裝docker

ansible-playbook 03.docker.yml

4)安裝master節點

ansible-playbook 04.kube-master.yml

kubectl get componentstatus //查看集羣狀態 #顯示一下結果爲沒問題

NAME STATUS MESSAGE ERROR

scheduler Healthy ok

controller-manager Healthy ok

etcd-1 Healthy {"health":"true"}

etcd-2 Healthy {"health":"true"}

etcd-0 Healthy {"health":"true"}

5)安裝node節點

ansible-playbook 05.kube-node.yml

查看node節點

kubectl get nodes

6)部署集羣網絡

ansible-playbook 06.network.yml

kubectl get pod -n kube-system //查看kube-system namespace上的pod,從中能夠看到flannel相關的pod

7)安裝集羣插件(dns, dashboard)

ansible-playbook 07.cluster-addon.yml

查看kube-system namespace下的服務

kubectl get svc -n kube-system

# 一步安裝 #可把上面7個步驟一次性安裝執行

ansible-playbook 90.setup.yml

查看集羣信息:

kubectl cluster-info

查看node/pod使用資源狀況:

kubectl top node

kubectl top pod --all-namespaces

測試DNS

a)建立nginx service

kubectl run nginx --image=nginx --expose --port=80 #用這個命令快速的跑一個nginx的service

b)建立busybox 測試pod

kubectl run busybox --rm -it --image=busybox /bin/sh //進入到busybox內部 #加rm的目的是當咱們退出他的時候,直接把這個容器銷燬

nslookup nginx.default.svc.cluster.local //結果以下

Server: 10.68.0.2

Address: 10.68.0.2:53

Name: nginx.default.svc.cluster.local

Address: 10.68.9.156

增長node節點

1)deploy節點免密碼登陸node

ssh-copy-id 新node ip

2)修改/etc/ansible/hosts

[new-node]

172.7.15.117

3)執行安裝腳本

ansible-playbook /etc/ansible/20.addnode.yml

4)驗證

kubectl get node

kubectl get pod -n kube-system -o wide

5)後續工做

修改/etc/ansible/hosts,將new-node裏面的全部ip所有移動到kube-node組裏去

增長master節點(略)

https://github.com/gjmzj/kubeasz/blob/master/docs/op/AddMaster.md

升級集羣

1)備份etcd

ETCDCTL_API=3 etcdctl snapshot save backup.db

查看備份文件信息

ETCDCTL_API=3 etcdctl --write-out=table snapshot status backup.db

2)到本項目的根目錄kubeasz

cd /dir/to/kubeasz

拉取最新的代碼

git pull origin master

3)下載升級目標版本的kubernetes二進制包(百度網盤https://pan.baidu.com/s/1c4RFaA#list/path=%2F)

解壓,並替換/etc/ansible/bin/下的二進制文件

4)docker升級(略),除非特別須要,不然不建議頻繁升級docker

5)若是接受業務中斷,執行:

ansible-playbook -t upgrade_k8s,restart_dockerd 22.upgrade.yml

6)不能接受短暫中斷,須要這樣作:

a)ansible-playbook -t upgrade_k8s 22.upgrade.yml

b)到全部node上逐一:

kubectl cordon和kubectl drain //遷移業務pod

systemctl restart docker

kubectl uncordon //恢復pod

備份和恢復

備份的思路最主要的是備份他的配置,好比有哪些service,有哪些deployment,有哪些pod

恢復就是把相關的各類資源給他恢復回去,固然前提是要搭建一個這樣的集羣,恢復的也是配置,會從新去下載相應的鏡像

1)備份恢復原理:

備份,從運行的etcd集羣中備份數據到磁盤文件

恢復,把etcd的備份文件恢復到etcd集羣中,而後據此重建整個集羣

2)若是使用kubeasz項目建立的集羣,除了備份etcd數據外,還須要備份CA證書文件,以及ansible的hosts文件

3)手動操做步驟:

mkdir -p /backup/k8s //建立備份目錄

ETCDCTL_API=3 etcdctl snapshot save /backup/k8s/snapshot.db //備份etcd數據

cp /etc/kubernetes/ssl/ca* /backup/k8s/ //備份ca證書

deploy節點執行 ansible-playbook /etc/ansible/99.clean.yml //模擬集羣崩潰 #此處注意,模擬崩潰的時候會將備份的backup目錄一併刪除,須要另外在備份(cp)一份

恢復步驟以下(在deploy節點):

a)恢復ca證書

mkdir -p /etc/kubernetes/ssl

cp /backup/k8s/ca* /etc/kubernetes/ssl/

b)重建集羣

cd /etc/ansible

ansible-playbook 01.prepare.yml

ansible-playbook 02.etcd.yml

ansible-playbook 03.docker.yml

ansible-playbook 04.kube-master.yml

ansible-playbook 05.kube-node.yml

c)恢復etcd數據

中止服務

ansible etcd -m service -a 'name=etcd state=stopped'

清空文件

ansible etcd -m file -a 'name=/var/lib/etcd/member/ state=absent'

登陸全部的etcd節點,參照本etcd節點/etc/systemd/system/etcd.service的服務文件,替換以下{{}}中變量後執行 #每一個節點都要去執行

cd /backup/k8s/

ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \

--name etcd1 \

--initialcluster etcd1=https://192.168.111.128:2380,etcd2=https://192.168.111.129:2380,etcd3=https://192.168.111.130:2380

\ #後面的這些https是從/etc/systemd/system/etcd.service這個文件裏拷貝的

--initial-cluster-token etcd-cluster-0 \

--initial-advertise-peer-urls https://192.168.111.128:2380

執行上面的步驟後,會生成{{ NODE_NAME }}.etcd目錄

cp -r etcd1.etcd/member /var/lib/etcd/

systemctl restart etcd

d)在deploy節點重建網絡

ansible-playbook /etc/ansible/tools/change_k8s_network.yml

4)不想手動恢復,能夠用ansible自動恢復

須要一鍵備份:

ansible-playbook /etc/ansible/23.backup.yml

檢查/etc/ansible/roles/cluster-backup/files目錄下是否有文件

tree /etc/ansible/roles/cluster-backup/files/ //以下

├── ca # 集羣CA 相關備份

│ ├── ca-config.json

│ ├── ca.csr

│ ├── ca-csr.json

│ ├── ca-key.pem

│ └── ca.pem

├── hosts # ansible hosts備份

│ ├── hosts # 最近的備份

│ └── hosts-201807231642

├── readme.md

└── snapshot # etcd 數據備份

├── snapshot-201807231642.db

└── snapshot.db # 最近的備份

模擬故障:

ansible-playbook /etc/ansible/99.clean.yml

修改文件/etc/ansible/roles/cluster-restore/defaults/main.yml,指定要恢復的etcd快照備份,若是不修改就是最新的一次

恢復操做:

ansible-playbook /etc/ansible/24.restore.yml

相關文章
相關標籤/搜索