安裝包地址 如非高可用安裝請忽略此教程,直接看產品頁的三步安裝。html
單個master流程: 單master視頻教程
高可用以下
假設構建一個3master+2node的k8s集羣,須要5臺節點共同的條件以下:node
(yum install -y docker是1.12.6版本須要改cg
)
17.06安裝教程:linux
#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直接修改下面數字便可 $ yum install docker-ce-17.06.1.ce # 主意版本填寫包名的格式. #5.開啓docker服務,和開機啓動 $ systemctl start docker && systemctl enable docker
hostnamectl set-hostname masterX
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
解壓完以後看到以下目錄:git
├── 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 root@ip:/root
的方式分發解壓後的包到其餘節點github
集羣中全部節點都須要執行cd shell && sh init.sh
(若是隻跑單個master那麼還須要執行 sh master.sh
,多master勿跑 )chrome
有如下須要注意的事項:
chmod +x /usr/bin/kube*
systemd
(修改位置/etc/systemd/system/kubelet.service.d
) 與 docker info|grep Cg一致sysctl -w net.ipv4.ip_forward=1
否則第七行報錯執行完成後經過命令查看kubectl get pod -n kube-system
,狀態全爲Running正常docker
etcd集羣安裝使用docker-compose方式部署shell
A.使用docker-compose啓動,若是沒裝:json
$ pip install docker-compose
B.使用二進制包啓動docker-compose(離線可選)centos
$ 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
修改配置 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命令存在文件裏,那東西不能丟了
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
第一個master咱們稱之爲master0 (假設其餘master已經init.sh過),如今把第一個master的/etc/kubernetes/pki目錄拷貝到別的master節點上
$ mkdir -p /etc/kubernetes $ scp -r /etc/kubernetes/pki root@10.1.245.93:/etc/kubernetes/pki
刪除pki目錄下的apiserver.crt 和 apiserver.key文件rm -rf apiserver.crt apiserver.key
,注意若是不刪除會只能看到一個master,是不正常的。
一樣使用master0上的out/kube/config文件,複製內容,拷貝到master1上,scp out/kube/config root@10.230.204.151:/root/
執行kubeadm init --config ~/config
master2節點同master1
我比較推薦使用四層代理 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
$ 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
仍是在node節點執行第一個master輸出的命令
$ kubeadm join --token <token> 10.1.245.94:6443 --discovery-token-ca-cert-hash sha256:<hash>
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
修改~/.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
$ kubectl edit deploy coredns -n kube-system
replicas: 3
[root@master1 ~]$ 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是否正常