使用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