下面介紹使用Kubeasz部署K8s集群環境。
https://github.com/easzlab/kubeasz
在需要使用kubeeasz項目安裝的k8s時,需要將所有需要它來部署的節點上,都安裝python2.7,最新的kubeeasz可能已經支持python3了,這個要具體查看說明。
另外 ,0.6.x的版本中bin目錄下的二進制文件,以前是打包好放在網盤上的,但在最新版中都改為直接在線下載了。
#需要注意的是, 此項目在0.6.x以上版本中,將其中一些添加新master,node等節點的功能去掉了,因此在下載項目時,一定要仔細看看其example/目錄下支持的hosts,看看hosts模板中是否有需要的功能。
git clone -b 0.6.1 https://github.com/easzlab/kubeasz.git
這是我測試K8s的邏輯拓撲圖:
建議,測試K8s,OpenStack等環境時,先將拓撲圖畫出來,然后,根據拓撲圖來部署環境,這樣便於理清思路,深入學習。
使用Kubeasz部署K8s集群注意事項:
1. 最小化安裝一台ubuntu 或 centos
#以ubuntu18.10為例:
2. 卸載如下包:
1) apt remove ufw #ufw是Ubuntu上默認安裝的防火牆.
2) snap remove lxd && apt remove snapd
3. 關閉雲服務工具: cloud-init
systemctl disable cloud-init-local cloud-init cloud-config cloud-final
4. 修改系統時區
timedatectl set-timezone Asia/Shanghai
5. 安裝chronyd
apt-get install chronyd && chronyc sources -v
6. 安裝docker-ce,已經python2.7環境
# step 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
apt-get install apt-transport-https ca-certificates curl software-properties-common chrony \
nfs-common conntrack jq socat bash-completion rsync ipset ipvsadm
# step 2: 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce python2.7
ln -s /usr/bin/pyton2.7 /usr/bin/python
7. 創建SSH證書
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
ssh-copy-id 192.168.10.130 #注意:這是我制作用於克隆其它VM的基礎主機的IP.
這樣制作出來的VM,啟動后,就會自動做好SSH無密鑰認證.
通過上面的操作,就制作好一台通用的K8s基礎環境的主機。
接着就可以使用VMware將該主機克隆出多個連接克隆,做如下操作。
1. 至少做2台鏈接克隆的Ubuntu做為Master節點。
2. 至少做3台鏈接克隆的Ubuntu作為Node節點
3. 至少在做一台作為LB節點,實現Master的高可用。另外它也可以再兼職Harbor.
4.分別依次啟動每個VM,並修改其IP地址.可按上面拓撲圖的方案來配置,也可自行設計.
5.確保每個節點都能互相通信,並且都能聯網。
6. 在其中一個Master節點上安裝ansible.
git clone -b 0.6.1 https://github.com/easzlab/kubeasz.git
cd kubeasz/ && cp -rf ./* /etc/ansible/
到我的網盤地址去下載所需的K8s集群所需的二進制打包文件:
https://pan.baidu.com/s/1njpwNdNEkVnuuXy029gXjw
下載完成后,解壓到/etc/ansible/bin/下面,然后就可以做之后的操作了。
然后進入 /etc/ansible/ 執行以下命令.
1. 將git克隆的kubeasz項目整體拷貝文件到/etc/ansible中,這是ansible默認執行目錄,所以放這里可避免手動指定hosts文件.
1) cp example/hosts.m-masters.example /etc/ansible/hosts
2) vim /etc/ansible/hosts
#deploy段,是指定克隆Kubeasz項目的那台主機,因為我將kubeasz克隆到Master1上了,因此我這里寫Master1的IP
#另外我已經事先配置好Chrony-Server,並且將所有節點和它同步了時間,因此我將NTP_ENABLED設置為no,若你沒有配置時間同步,可設為yes.
#但一定要保障你的所有節點都能聯網。
[deploy]
192.168.111.84 NTP_ENABLED=no
# ETCD數據庫我是將其安裝到Node節點上了,這樣做可節省VM的數量
[etcd]
192.168.111.80 NODE_NAME=etcd1
192.168.111.81 NODE_NAME=etcd2
192.168.111.82 NODE_NAME=etcd3
#這里設置K8sMaster有哪些,這里我是兩台做高可用.因此寫兩個
[kube-master]
192.168.111.84 NEW_MASTER=yes
192.168.111.85 NEW_MASTER=yes
#這里配置K8s的Node節點.
[kube-node]
192.168.111.80 NEW_NODE=yes
192.168.111.81 NEW_NODE=yes
192.168.111.82 NEW_NODE=yes
[all:vars]
# ---------集群主要參數---------------
#集群部署模式:allinone, single-master, multi-master
#這里配置為多master,因為這里要做Master的高可用
DEPLOY_MODE=multi-master
#集群主版本號,目前支持: v1.8, v1.9, v1.10,v1.11, v1.12, v1.13
#安裝的版本是K8s的v1.13.5,因此這里選擇v1.13
K8S_VER="v1.13"
# 這里設置LB(負載均衡)上的VIP,也就是192.168.111.100,它是一個HAProxy+keepalived,
#我配置是HAProxy反向代理兩台Master.
MASTER_IP="192.168.111.100"
KUBE_APISERVER="https://{{ MASTER_IP }}:6443"
# 集群網絡插件,目前支持calico, flannel, kube-router, cilium
#這里我使用calico來部署K8s的網絡,這是為了方便后面配置網絡策略,使用flannel的話,也可以,不過這就要參考官網資料,
#將calico集成到flannel網絡中,讓flannel提供網絡,calico提供網絡策略.
CLUSTER_NETWORK="calico"
#Services網段,每個Service都是一組Pod的前端LB
SERVICE_CIDR="172.30.0.0/16"
# POD 網段 (Cluster CIDR),注意不要與內網已有網段沖突
CLUSTER_CIDR="10.10.0.0/16"
#這些預留的端口是為外網用戶訪問K8s集群時使用的,即K8s集群的Node節點要選出幾個節點,
#暴露這些端口,然后,在前端入口LB上,配置調度時,指定轉發給這些節點的那些端口。
NODE_PORT_RANGE="30000-60000"
#這個是為CoreDNS或其它K8s內部DNS預留的IP
CLUSTER_DNS_SVC_IP="172.30.254.254"
# 集群 DNS 域名
CLUSTER_DNS_DOMAIN="zcf.local."
#這是當部署完K8s的Dashboard后,登錄時,使用的用戶名和密碼。
BASIC_AUTH_USER="admin"
BASIC_AUTH_PASS="zhangcf"
2. 確保所有需要kubeeasz來部署服務端節點上,都安裝了python2.7,並可直接執行 python 命令.
for i in {80..85}; do ssh 192.168.10.$i "apt-get install python2.7 -y"; done
for i in {80..85}; do ssh 192.168.10.$i "hostname; ln -s /usr/bin/python2.7 /usr/bin/python; python --version"; done
3. 在node 和 master檢查docker是否能正常工作
systemctl start docker
docker ps -a
4. 以上檢查和配置完成后,就可以做以下操作了.
4.1.下載必須的鏡像文件:
從阿里雲的谷歌鏡像倉庫中下載:
#下載啟動K8s各系統Pod所需要的基礎鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64
修改 roles/kube-node/defaults/main.yml
# 默認使用kube-proxy的 'iptables' 模式,可選 'ipvs' 模式(experimental)
PROXY_MODE: "iptables"
# 基礎容器鏡像
SANDBOX_IMAGE: "harbor.zcf.com/k8s/pause-amd64:3.1" #這里我是將其下載后,上傳到我的harbor上了.
#接着去下載Calico3.3.6的版本,因為K8sv1.13.5官方changlog中說明了,對此版本的Calico是測試穩定的.
https://github.com/projectcalico/calico/releases?after=v3.5.5 到這里去找Calico3.3.6的版本去下載.
下載完成后,解壓后,其中會包含Calico的鏡像和客戶端工具,只需要將Calico鏡像上傳到自己的Harbor上,然后修改以下內容:
vim roles/calico/defaults/main.yml
# 更新支持calico 版本: [v3.2.x] [v3.3.x] [v3.4.x]
calico_ver: "v3.3.6"
CALICO_NODE: "harbor.zcf.com/k8s/calico/node:{{ calico_ver }}"
CALICO_CNI: "harbor.zcf.com/k8s/calico/cni:{{ calico_ver }}"
CALICO_CTRL: "harbor.zcf.com/k8s/calico/kube-controllers:{{ calico_ver }}"
vim roles/calico/templates/calico-v3.3.yaml.j2
#修改calico的DaemonSet控制器中三個Pod模板使用的鏡像
- name: calico-node
image: {{ CALICO_NODE }}
。。。
- name: install-cni
image: {{ CALICO_CNI }}
。。。。
- name: calico-kube-controllers
image: {{ CALICO_CTRL }}
4.2 以上配置修改完成后,就可以繼續下面的步驟了.
順序執行下面幾個playbook,若遇到報錯,第一次可忽略,然后再次運行,若兩次都失敗,就需要具體查原因了:
ansible-playbook 01.prepare.yml
02.etcd.yml
03.docker.yml #若在初始化環境時,安裝了docker,這一步可不做!!
04.kube-master.yml
05.kube-node.yml
06.network.yml
5. 以上若全部執行完成,你就已經部署了一個最基本的K8s高可用的運行環境。
#注意:我上面沒有對HAProxy+Keepalived+Harbor的配置,這些建議參考其它文章來自行學習,因為這些都不難.
6. 需要配置Kube-DNS,這里我還有些問題,沒有完全弄明白,僅提供思路.
6.1 首先從kubernetes官方github上下載kube-dns這個Addons(附件)的配置清單
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kube-dns/kube-dns.yaml.in
#下載可能會失敗,多試幾次即可。注意:kubernetes的各種Addons都在不斷更新,所以一定要注意,下面提供的參數可能會有變!
下載完成,做以下修改:
#從阿里雲的谷歌鏡像倉庫下載鏡像:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns:1.14.13
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny:1.14.13
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar:1.14.13
spec:
selector:
k8s-app: kube-dns
clusterIP: {{ pillar['dns_server']}}
#將{{ pillar['dns_server']}} 修改為 CLUSTER_DNS_SVC_IP它的值,因為我在hosts設置其為"172.30.254.254"
clusterIP: 172.30.254.254
.。。。。。
- name: kubedns
image: k8s.gcr.io/k8s-dns-kube-dns:1.14.13
#注意:我是提前下載好鏡像,並上傳到harbor上后,修改為image為:
image: harbor.zcf.com/k8s/k8s-dns-kube-dns:1.14.13
.....
- name: dnsmasq
# image: k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:v1.14.13
image: harbor.zcf.com/k8s/k8s-dns-dnsmasq-nanny-amd64:v1.14.13
......
- name: sidecar
# image: k8s.gcr.io/k8s-dns-sidecar:1.14.13
image: harbor.zcf.com/k8s/k8s-dns-sidecar:1.14.13
。。。。。
limits:
memory: {{ pillar['dns_memory_limit'] }}
#將其修改Pod可使用內存硬限制大小,如我設置為: 100Mi
。。。。。
- --domain={{ pillar['dns_domain'] }}.
#修改所有類似 “{{ pillar['dns_domain'] }}” 為 CLUSTER_DNS_DOMAIN的值。
#注意:此yaml文件中多處都引用了它,我並沒有全部列出來.
#我這里在Hosts文件配置為: CLUSTER_DNS_DOMAIN="zcf.local."
#因此我的是修改為 - --domain=zcf.local. #注意域名最后是有一個點的.
.......
#- --server=/{{ pillar['dns_domain'] }}/127.0.0.1#10053
#修改上面pillar為你的集群域名。如,我的修改為:
- --server=/zcf.local/127.0.0.1#10053
#然后添加以下內容,注意:這可能不是必須的,因此測試中,發現Pod不能訪問公網,所以才添加了以下內容。
#但這並沒有解決根本問題,根本問題還是需要讓kube-dns能讀取node節點上的/etc/resolv.conf文件,來獲取公網DNS的地址.
#我測試沒有通過,因此才有了下面的方式.
- --server=/.com/114.114.114.114#53
- --server=/.cn/114.114.114.114#53
- --server=/.org/114.114.114.114#53
- --server=/.net/114.114.114.114#53
6.2. 以上kube-dns的yaml文件都修改好,接着就可以執行:
mv kube-dns.yaml.in kube-dns.yaml
kubectl apply -f kube-dns.yaml
7. 以上步驟全部做完后,一個基本意義上的K8s已經部署完成。
至於Dashboard如何部署,這里就不說明了。后面有時間在補充吧,或者也可參考其它文章來部署。