使用kubeadm安裝安全高可用kubernetes叢集
安裝包地址 如非高可用安裝請忽略此教程,直接看產品頁的三步安裝。
單個master流程: 單master視訊教程
- 解壓後在master 上 cd shell && sh init.sh ,然後sh master.sh(注意因為指令碼用的相對路徑所以不再當前目錄會找不到檔案)
- 在node上 cd shell && sh init.sh 。然後在node上執行master輸出的join命令即可
高可用如下
提前準備
假設構建一個3master+2node的k8s叢集,需要5臺節點共同的條件如下:
(
yum install -y docker是1.12.6版本需要改cg
17.06安裝教程:#0.刪除老舊的 $ yum remove -y docker* #如果預設之前yum安裝的1.12版本,可以這樣刪沒裝可以跳過此步 #1.安裝需要的包 $ yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 #2.新增源,不然預設的找不到 $ yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #3.根據實際查詢當前版本 (可選) $ yum list docker-ce --showduplicates | sort -r #4.如果確定了版本,直接安裝,如果要裝17。03直接修改下面數字即可
- 建議二進位制方法提前部署好docker-compose,步驟參考後文
- 建議永久關閉selinux和swap以免後續問題
- 建議停止並關閉firewalld/iptables等防火牆
- 新的節點啟動後記得改網路名
hostnamectl set-hostname masterX
- 節點之間要能互通內網環境穩定
- 安裝中出了問題要看日誌journalctl -n 10 ,執行中的日誌檢視
tail -f 10 /var/log/messages
系統架構圖
kubectl dashboard
|
V
+------------------------+ join
| LB 10.1.245.94 | <--- Nodes
+------------------------+
|
|--master1 manager1 schedule1 10.1.245.93
|--master2 manager2 schedule2 10.1.245.95 =============> etcd cluster http://10.1.245.93:2379,http://10.1.245.94:2379,http://10.1.245.95:2379
|--master3 manager3 schedule3 10.1.245.94
安裝包介紹
解壓完之後看到如下目錄:
├── bin 所需要的k8s相關的bin檔案
│ ├── kubeadm
│ ├── kubectl
│ └── kubelet
├── image 依賴的所有映象包
│ └── images.tar
├── out 所有的配置檔案
│ ├── dashboard dashboard相關配置
│ │ ├── dashboard-admin.yaml
│ │ └── kubernetes-dashboard.yaml
│ ├── etcd etcd相關配置
│ │ ├── etcd-docker-compose-0.yml
│ │ ├── etcd-docker-compose-1.yml
│ │ └── etcd-docker-compose-2.yml
│ ├── haproxy haproxy相關配置
│ │ └── haproxy.cfg
│ ├── heapster heapster相關yaml配置
│ │ ├── influxdb
│ │ │ ├── grafana.yaml
│ │ │ ├── heapster.yaml
│ │ │ └── influxdb.yaml
│ │ └── rbac
│ │ └── heapster-rbac.yaml
│ ├── kube k8s自身配置
│ │ ├── 10-kubeadm.conf
│ │ ├── config kubeadm配置
│ │ └── kubelet.service
│ ├── kubeinit.json 忽略
│ └── net 網路相關配置
│ ├── calico.yaml
│ └── calicoctl.yaml
└── shell 初始化指令碼
├── init.sh 初始化節點,安裝bin檔案,systemd配置等
└── master.sh 執行kubeadm init和其它元件
初始化節點
因為解壓後包,然後scp -r xxx [email protected]:/root
的方式分發解壓後的包到其他節點
叢集中所有節點都需要執行cd shell && sh init.sh
(如果只跑單個master那麼還需要執行 sh master.sh
,多master勿跑 )
有以下需要注意的事項:
- 修改init.sh指令碼在後面新增,如果二進位制程式沒可執行許可權
chmod +x /usr/bin/kube*
- cgroups驅動需要選擇docker17.0x版本,就不需要去調整了,如果是1.1x版本的docker需要手動修改kubelet的啟動檔案裡面的cgroups配置為
systemd
(修改位置/etc/systemd/system/kubelet.service.d
) 與 docker info|grep Cg一致 - 提前修改預設的init 或者手動執行
sysctl -w net.ipv4.ip_forward=1
不然第七行報錯
執行完成後通過命令檢視kubectl get pod -n kube-system
,狀態全為Running正常
起動etcd叢集
etcd叢集安裝使用docker-compose方式部署
A.使用docker-compose啟動,如果沒裝:
$ pip install docker-compose
B.使用二進位制包啟動docker-compose(離線可選)
$ wget https://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64 #官方推薦是用curl,不建議
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose #也有寫+x的.
#這樣就完成了,測試
$ docker-compose version #下面是正常輸出
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
在out/etcd目錄下有相關模板etcd-docker-compose-x.yam
,啟動多個節點時修改成自己的ip地址 其它兩個節點照抄,修改ip即可, image那行 應改為 gcr.io/google_containers/etcd-amd64:3.1.11
,實際就是版本號改一下即可。
#需要修改所有含有ip的地方,下面的9,10,11,12行改為當前節點ip,15行三個ip順序改為etcd叢集部署的三臺節點ip
version: '2.1'
services:
etcd0:
container_name: etcd_infra0
image: gcr.io/google_containers/etcd-amd64:3.0.17 #這裡最後改為3.1.11
command: |
etcd --name infra0
--initial-advertisie-peer-urls http://10.230.204.160:2380
--listen-peer-urls http://10.230.204.160:2380
--listen-client-urls http://10.230.204.160:2379,http://127.0.0.1:2379
--advertise-client-urls http://10.230.204.160:2379
--data-dir /etcd-data.etcd
--initial-cluster-token etcd-cluster-1
--initial-cluster infra0=http://10.230.204.160:2380,infra1=http://10.230.204.165:2380,infra2=http://10.230.204.151:2380
--initial-cluster-state new
restart: always
volumes:
- /data/etcd-data.etcd:/etcd-data.etcd
network_mode: "host"
三個節點分別啟動:
$ docker-compose -f out/etcd/etcd-docker-compose-x.yml up -d
#正常輸出Creating etcd_infrax ... done x為每個etcd編號
檢查是不是安裝成功:
$ docker exec etcd_infra0 etcdctl member list #master1上可能執行報錯容易提示容器正在重啟。。原因暫時未知,其他master上可以
#成功應該是類似顯示
5ded6dd284b89d31: name=infra1 peerURLs=http://10.230.204.153:2380 clientURLs=http://10.230.204.153:2379 isLeader=true
6d4b5eee32c1497a: name=infra0 peerURLs=http://10.230.204.150:2380 clientURLs=http://10.230.204.150:2379 isLeader=false
729d9cd56debb1a1: name=infra2 peerURLs=http://10.230.204.154:2380 clientURLs=http://10.230.204.154:2379 isLeader=false
#如果出現有peerURL不顯示說明沒有成功,嘗試remove重新建立
$ docker-compose -f out/etcd/etcd-docker-compose-x.yml down -v
kubeadm配置
修改配置 out/kube/config
檔案
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
apiServerCertSANs: #此處填所有的masterip和lbip和其它你可能需要通過它訪問apiserver的地址和域名或者主機名等,如阿里fip,證書中會允許這些ip
- 172.31.244.231
- 172.31.244.232
- 172.31.244.233
- 172.31.244.234
- master1
- master2
- master3
- node1
- 47.75.1.72
etcd:
endpoints: #這裡填之前安裝的etcd叢集地址列表,修改IP地址
- http://172.31.244.232:2379
- http://172.31.244.233:2379
- http://172.31.244.234:2379
apiServerExtraArgs:
endpoint-reconciler-type: lease
networking:
podSubnet: 192.168.0.0/16 #不用改
kubernetesVersion: v1.9.2 #不用改
featureGates: #不用改
CoreDNS: true
然後執行:
$ kubeadm init --config out/kube/config
把成功後的kubeadm join命令存在檔案裡,那東西不能丟了
啟動calico等
mkdir ~/.kube && cp /etc/kubernetes/admin.conf ~/.kube/config
(如果已經存在請校驗一下是否相同,不確定建議刪掉重新cp過去)
修改calico配置,把etcd地址換成你安裝好的叢集地址:
out/net/calico.yaml:
kind: ConfigMap
apiVersion: v1
metadata:
name: calico-config
namespace: kube-system
data:
# The location of your etcd cluster. This uses the Service clusterIP
# defined below.
etcd_endpoints: "http://10.96.232.136:6666" # 這裡改成etcd叢集地址如 "http://172.31.244.232:2379,http://172.31.244.233:2379,http://172.31.244.234:2379"
$ kubectl apply -f out/net/calico.yaml
$ kubectl apply -f out/heapster/influxdb
$ kubectl apply -f out/heapster/rbac
$ kubectl apply -f out/dashboard
#上面命令可整合為
$ kubectl apply -f out/net/calico.yaml -f out/heapster/influxdb -f out/heapster/rbac -f out/dashboard
- 然後訪問https://master1IP:32000埠即可,在chrome下無法進入提示證書有誤,更換firefox可以,提示說證書日期不對(待修復)
啟動多個master
第一個master我們稱之為master0 (假設其他master已經init.sh過),現在把第一個master的/etc/kubernetes/pki目錄拷貝到別的master節點上
$ mkdir -p /etc/kubernetes
$ scp -r /etc/kubernetes/pki [email protected]:/etc/kubernetes/pki
刪除pki目錄下的apiserver.crt 和 apiserver.key檔案rm -rf apiserver.crt apiserver.key
,注意如果不刪除會只能看到一個master,是不正常的。
同樣使用master0上的out/kube/config檔案,複製內容,拷貝到master1上,scp out/kube/config [email protected]:/root/
執行kubeadm init --config ~/config
master2節點同master1
啟動loadbalance
我比較推薦使用四層代理 HAproxy配置out/haproxy目錄:
vi out/haproxy/haproxy.cfg
global
daemon
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
defaults
log global
retries 3
maxconn 2000
timeout connect 5s
timeout client 50s
timeout server 50s
frontend k8s
bind *:6444
mode tcp
default_backend k8s-backend
backend k8s-backend
balance roundrobin
mode tcp
#下面三個ip替換成三個你自己master的地址
server k8s-1 10.1.245.93:6443 check
server k8s-1 10.1.245.94:6443 check
server k8s-2 10.1.245.95:6443 check
先 mkdir /etc/haproxy
然後把這個檔案拷貝在cp out/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
$ docker run --net=host -v /etc/haproxy:/usr/local/etc/haproxy --name ha -d haproxy:1.7
修改kubeproxy配置
$ kubectl -n kube-system edit configmap kube-proxy
找到master地址,修改成LB地址,6444埠 (這裡關鍵在於怎麼知道LB的地址到底是哪一個呀?上面配置之後三個masterIP 輪詢並不知道哪個是LB地址)
#找到檔案的這一塊,第七行server 有個ip地址
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server: https://10.230.204.151:6443 #修改為 LoadBalanceIP:6444
name: default
contexts:
- context:
cluster: default
namespace: default
user: default
name: default
current-context: default
users:
- name: default
user:
tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
join node節點
還是在node節點執行第一個master輸出的命令
$ kubeadm join --token <token> 10.1.245.94:6443 --discovery-token-ca-cert-hash sha256:<hash>
修改node節點kubelet配置
vi /etc/kubernetes/kubelet.conf
同樣把地址修改成LB地址,如:10.1.245.94:6444
,修改如下第五行(展示的例子已經修改過)
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxxxxx #此處省略幾百字元
server: https://10.230.204.160:6444 #修改這裡為LB:6444,原本是另外的ip:6443
name: default-cluster
contexts:
- context:
cluster: default-cluster
namespace: default
user: default-auth
name: default-context
current-context: default-context
kubectl配置
修改~/.kube/config
檔案,server的ip改成LB的ip 10.1.245.94:6444
或者通過命令修改:
$ kubectl config set-cluster kubernetes --server=https://47.52.227.242:6444 --kubeconfig=$HOME/.kube/config
啟動多DNS副本
$ kubectl edit deploy coredns -n kube-system
replicas: 3
[[email protected] ~]$ kubectl get pod -n kube-system -o wide|grep core
coredns-65dcdb4cf-4j5s8 1/1 Running 0 39m 192.168.137.65 master1
coredns-65dcdb4cf-ngx4h 1/1 Running 0 38s 192.168.180.1 master2
coredns-65dcdb4cf-qbsr6 1/1 Running 0 38s 192.168.166.132 node1
這樣,啟動了三個dns
驗證與測試
$ kubectl run test --image busybox sleep 10000
$ kubectl exec your-busybox-pod-name nslookup kubernetes
殺非LB的master,多次測試看建立pod與dns是否正常,還可以telnet 10.96.0.1 443 去驗證clusterip是否正常