簡(jiǎn)介:
k8s新的版本與之前1.5的部署方式發(fā)生改變,官方將kubernetes大組件中的服務(wù)例如(kube-proxy、kube-api等服務(wù))剝離出來(lái)封裝成容器的形式來(lái)簡(jiǎn)化部署的方式。以下為三個(gè)必裝的服務(wù):
kubelet #----運(yùn)行在 Cluster 所有節(jié)點(diǎn)上,主要負(fù)責(zé)啟動(dòng) Pod 和容器。新版的的k8s默認(rèn)將cadvisor集成到kubelet中了,我們只需要開(kāi)放相應(yīng)的端口(4194)即可。
kubeadm #--用于初始化和引導(dǎo)Cluster(是官方推出快速部署k8s集群,其本質(zhì)是將k8s的相關(guān)服務(wù)容器化)
kubectl #----是 Kubernetes 命令行工具與api交互。通過(guò) kubectl 可以部署和管理應(yīng)用,查看各種資源,創(chuàng)建、刪除和更新各種組件
1. 部署環(huán)境:
centos7.3、docker-ce-17-03.0、kubelet-1.9.6-0、kubeadm-1.9.6-0、kubectl-1.9.6-0
ka8-master:192.168.100.135
k8s-node:192.168.100.134
注意:兩臺(tái)機(jī)器的時(shí)間一定要一致,并且docker-ce的版本不能大于17.03,docker可以使用官方的源進(jìn)行安裝,安裝的時(shí)候指定需要安裝的版本,或者使用rpm包安裝即可。
k8s需要用到的鏡像已經(jīng)打包好上傳到云盤(pán):
鏈接: https://pan.baidu.com/s/1CVuCwX3Fl-VcUxftXPEN1g 密碼: 56a3
2. 安裝部署:
1)、前期環(huán)境配置:
按照官方的方式安裝會(huì)失敗因?yàn)槭褂胟8s源在Google上,這里我們可以使用阿里云的源來(lái)進(jìn)行yum安裝必要的三個(gè)組件。
- Master和Node上操作如下:
##關(guān)閉防火墻:
$systemctl stop firewalld
$systemctl disable firewalld
##關(guān)閉swap:
$swapoff -a
$sed -i 's/.*swap.*/#&/' /etc/fstab
##關(guān)閉selinux:
$setenforce 0
##添加kubernetes源
$cat:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
## 安裝iptables
$ yum install iptables-services -y
## 將/etc/sysconfig/iptables規(guī)則改成如下:
# Generated by iptables-save v1.4.21 on Fri Apr 13 17:36:35 2018
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Fri Apr 13 17:36:35 2018
# Generated by iptables-save v1.4.21 on Fri Apr 13 17:36:35 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 1:65535 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1:65535 -j ACCEPT
COMMIT
## 啟用iptables
$ systemctl start iptables && iptables -P FORWARD ACCEPT &&systemctl enable iptables
注意:這里這樣操作是為了不讓iptables攔截我們需要開(kāi)放的端口,以及將FORWARD表設(shè)置為默認(rèn)轉(zhuǎn)發(fā),
用于跨主機(jī)pod之間的通信。
2)、Master和Node上安裝docker-ce并導(dǎo)入鏡像:
##安裝docker-ce:
$rpm -ihv docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
$rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
##啟動(dòng)docker-ce
$systemctl start docker
$systemctl enable docker
##解壓下載的鏡像包:
$tar -jvxf k8s-1.9.6-images.tar.bz2
$cd k8s-1.9.6-images
##導(dǎo)入所需要的鏡像包:
$docker load <etcd-amd64_3.1.11.tar
$docker load < flannel_v0.10.0-amd64.tar
$docker load < k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
$docker load < k8s-dns-kube-dns-amd64_1.14.7.tar
$docker load < k8s-dns-sidecar-amd64_1.14.7.tar
$docker load < kube-apiserver-amd64_v1.9.6.tar
$docker load < kube-controller-manager-amd64_v1.9.6.tar
$docker load < kube-proxy-amd64_v1.9.6.tar
$docker load < kubernetes-dashboard-amd64_v1.8.3.tar
$docker load < kube-scheduler-amd64_v1.9.6.tar
$docker load < pause-amd64_3.0.tar
為了加快(toulan)導(dǎo)入鏡像的效率,寫(xiě)了一個(gè)簡(jiǎn)單的腳本來(lái)一鍵導(dǎo)入,需要在上文解壓的鏡像包目錄(k8s-1.9.6-images)下創(chuàng)建腳本并且執(zhí)行,例如在master上執(zhí)行/root/k8s-1.9.6-images/dockerload-images.sh選擇1即可。
#!/bin/bash
declare serial
PS3="Enter a Number:"
serial=(1 2)
script_path=$(cd $(dirname $0) && pwd)
select var in "master" "node"
do
if ! echo ${serial[@]} | grep -q $REPLY;then
echo "Error Number,Please Enter[1-2]"
continue
fi
case $var in
master)
echo "this is master"
docker load < ${script_path}/etcd-amd64_3.1.11.tar
docker load < ${script_path}/flannel_v0.10.0-amd64.tar
docker load < ${script_path}/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load < ${script_path}/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load < ${script_path}/k8s-dns-sidecar-amd64_1.14.7.tar
docker load < ${script_path}/kube-apiserver-amd64_v1.9.6.tar
docker load < ${script_path}/kube-controller-manager-amd64_v1.9.6.tar
docker load < ${script_path}/kube-proxy-amd64_v1.9.6.tar
docker load < ${script_path}/kubernetes-dashboard-amd64_v1.8.3.tar
docker load < ${script_path}/kube-scheduler-amd64_v1.9.6.tar
docker load < ${script_path}/pause-amd64_3.0.tar
break
;;
node)
docker load < ${script_path}/etcd-amd64_3.1.11.tar
docker load < ${script_path}/flannel_v0.10.0-amd64.tar
docker load < ${script_path}/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load < ${script_path}/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load < ${script_path}/k8s-dns-sidecar-amd64_1.14.7.tar
docker load < ${script_path}/kube-apiserver-amd64_v1.9.6.tar
docker load < ${script_path}/kube-proxy-amd64_v1.9.6.tar
docker load < ${script_path}/kubernetes-dashboard-amd64_v1.8.3.tar
docker load < ${script_path}/pause-amd64_3.0.tar
break
;;
*)
break
;;
esac
done
3)、Master和Node節(jié)點(diǎn)安裝k8s:
- Master和Node節(jié)點(diǎn)修改參數(shù)
##修改內(nèi)核兩個(gè)參數(shù)(這兩個(gè)是參數(shù)是防止應(yīng)用部署在centos系統(tǒng)情況下由于iptables被繞過(guò)而導(dǎo)致的路由錯(cuò)誤)
簡(jiǎn)單的說(shuō)就是使流過(guò)網(wǎng)橋的流量也進(jìn)入iptables/netfilter框架中:
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$sysctl --system
##yum安裝必要的三個(gè)組件:
yum install -y kubelet-1.9.6-0 kubectl-1.9.6-0 kubeadm-1.9.6-0
##確保kubelets使用的cgroup-driver和docker使用的cgroup-driver一樣:
$sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
##開(kāi)啟k8s默認(rèn)的cAdvisor服務(wù),開(kāi)放kubelet 4194端口:
編輯:vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 修改如下:
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=4194"
##啟動(dòng)kubelet服務(wù):
$systemctl daemon-reload
$systemctl start kubelet
$systemctl enable kubelet
4)、集群初始化:
- master上執(zhí)行如下進(jìn)行初始化:
$kubeadm init --apiserver-advertise-address 192.168.100.135 --pod-network-cidr=10.244.0.0/16 --kubernetes-version 1.9.6
--apiserver-advertise-address #--指明用Master的哪個(gè)interface與Cluster 的其他節(jié)點(diǎn)通信
--pod-network-cidr #---指定Pod網(wǎng)絡(luò)的范圍k8s支持多種網(wǎng)絡(luò)方案不同的網(wǎng)絡(luò)方案對(duì)這個(gè)配置有不同的要求,這里設(shè)置為 10.244.0.0/16是因?yàn)槲覀儗⑹褂胒lanne 網(wǎng)絡(luò)方案,所以設(shè)置成這個(gè) CIDR。
--kubernetes-version #--指定k8s版本
## 要是初始化失敗的話執(zhí)行如下命令后再重新開(kāi)始初始化
$ kubeadm reset

按照上面提示,此時(shí)root用戶還不能使用kubelet控制集群,需要配置下環(huán)境變量:
##對(duì)于非root用戶:
$mkdir -p $HOME/.kube
$cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$chown $(id -u):$(id -g) $HOME/.kube/config
##對(duì)于root用戶:
$echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
$source ~/.bash_profile
##測(cè)試下:
$kubectl version
顯示如下表示正常:

- 部署pod網(wǎng)絡(luò):
#Master上執(zhí)行:
$kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- Node節(jié)點(diǎn)上執(zhí)行如下加入:
#node節(jié)點(diǎn)注冊(cè)加入:
$kubeadm join --token 0428e2.35a3db294493bfdb 192.168.100.135:6443 --discovery-token-ca-cert-hash sha256:d598c1b5229bc1e3b118bed424a5f369cbbb61c03072dcd126f209ca7b5efbba
##這里的token為我們?cè)趍aste初始化時(shí)候給出的token,若是忘記或者關(guān)閉了master窗口沒(méi)記錄下來(lái)可以在master上執(zhí)行如下來(lái)獲取token加入:
$kubeadm token list
- Master上查看各節(jié)點(diǎn)狀態(tài):

從上圖中看目前所有節(jié)點(diǎn)都是 NotReady,這是因?yàn)槊總€(gè)節(jié)點(diǎn)都需要啟動(dòng)若干組件,這些組件都是在 Pod 中運(yùn)行,
都需要先從google下載鏡像,這里由于我們已經(jīng)將需要的鏡像導(dǎo)入到本地,所以可以正常運(yùn)行這些pod。
若遇到過(guò)了一段時(shí)間還處于NotReady我們可以通過(guò)如下命令查看 Pod 的狀態(tài):
kubectl get pod --all-namespaces

對(duì)于存在問(wèn)題的pod可以執(zhí)行如下命令來(lái)查看具體的詳細(xì)原因:
kubectl describe pod kube-flannel-ds-snfxj --namespace=kube-system
這里就不貼出來(lái)我的pod問(wèn)題圖片(因?yàn)槲襫ode節(jié)點(diǎn)忘記導(dǎo)入需要的鏡像了............-_-!)
集群正常的健康狀態(tài)是這樣子滴:

3.kubernetes-dashboard部署:
- Master上執(zhí)行如下:
#給master主機(jī)設(shè)置一個(gè)label用來(lái)后面部署dashborad的時(shí)候指定部署到master主機(jī)上,防止部署到node節(jié)點(diǎn)上
$kubectl label nodes k8s-master master=node1
#用于部署kubernetes-dashboard的yaml文件也在剛剛下載的壓縮包里面,所以一樣進(jìn)入k8s-1.9.6-images目錄
$kubectl create -f kubernetes-dashboard.yaml
注意:設(shè)置label是因?yàn)槲倚薷牧薻ubernetes-dashboard.yaml,防止部署到node節(jié)點(diǎn)上去,到時(shí)候還得修改其他配置,麻煩
(-_-),壓縮包中的該配置文件我已經(jīng)改成如下,若不想設(shè)置label和上面的一樣,需要自行修改。

訪問(wèn):https://192.168.100.135:32666

- kubernetes-dashboard的認(rèn)證:
dashboard的認(rèn)證可以基于kubeconfig文件、口令、基本(用戶名和密碼)這三種方式的認(rèn)證。根據(jù)官網(wǎng)說(shuō)是可以支持basic的認(rèn)證,但是我在這個(gè)版本下試了下沒(méi)成功,所以這里我就使用了基于口令的方式來(lái)認(rèn)證。
3.1、基于口令的方式部署:
## 我們先刪除前面創(chuàng)建的dashboard:
kubectl delete -f kubernetes-dashboard.yaml
從官網(wǎng)下載的1.8.3的dashboard的yaml配置文件默認(rèn)是開(kāi)啟basic的認(rèn)證,沒(méi)有基于口令
的方式,我們使用基于口令認(rèn)證的方式前提需要將kubernetes-dashboard.yaml文件中
的basic這行注釋掉。
如下圖:

1)、## 這里創(chuàng)建一個(gè)dashboard的資源:
$ kubectl create -f kubernetes-dashboard.yaml
2)、## 創(chuàng)建一個(gè)基于RBAC認(rèn)證的角色綁定資源:
$ vim Dashboard-ServiceAccount-ClusterRoleBind.yaml
添加如下內(nèi)容:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
## 創(chuàng)建該資源
$ kubectl create -f Dashboard-ServiceAccount-ClusterRoleBind.yaml
3)、 ## 獲取上面創(chuàng)建的用戶(admin-user)的Token
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
4)、## 打開(kāi)https://ip:32666=>選擇口令=>輸入上面的口令即可:


3.2、基于賬戶信息的方式部署:
1)、## 創(chuàng)建靜態(tài)密碼文件,密碼文件格式為csv格式:
$ vim /etc/kubernetes/pki/basic_auth_file
admin,admin,2004
注意:格式為 密碼,賬戶,id
這里將靜態(tài)文件放在/etc/kubernetes/pki/目錄下的原因是,apiserver通過(guò)容器啟動(dòng),這個(gè)路徑已經(jīng)掛載容器中了,可以被訪問(wèn)到。放在其他路徑需要額外配置掛載路徑。apiserver只會(huì)啟動(dòng)在master節(jié)點(diǎn)上,故僅需要在master節(jié)點(diǎn)上配置即可。
2)、###開(kāi)啟api server的basic認(rèn)證:
$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
添加如下一行參數(shù)配置
- --basic-auth-file=/etc/kubernetes/pki/basic_auth_file
注意1:
在修改完apiserver后執(zhí)行相關(guān)的命令kubectl get node,多半是執(zhí)行不成功的,因?yàn)樾薷腶piserver配置文件后,apiserver自動(dòng)重啟,然后啟動(dòng)失敗,所以就無(wú)法訪問(wèn)集群了。這里我們可以手動(dòng)來(lái)重啟apiserver的容器,使用docker命令來(lái)重啟apiserver的容器,最后在將kubelet服務(wù)重啟下既可。
注意2:
要是修改了賬戶的密碼后不重啟apiserver新修改的密碼將不會(huì)生效。
3)、###創(chuàng)建賬戶映射:
這里是為了進(jìn)行權(quán)限的授權(quán),這里暫時(shí)不多講,后期會(huì)對(duì)認(rèn)證機(jī)制進(jìn)行詳細(xì)的講解。
$ vim basic-auth-admin-clusterrolebinding.yaml
添加如下內(nèi)容:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: ClusterRoleBinding-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
$ kubectl create -f basic-auth-admin-clusterrolebinding.yaml
4)、###修改dashboard認(rèn)證配置:
開(kāi)啟dashboard的兩個(gè)驗(yàn)證,若只開(kāi)一個(gè)basic會(huì)導(dǎo)致訪問(wèn)出錯(cuò)

刪除之前的dashboard然后在重新創(chuàng)建一個(gè)dashboard既可:

參考:
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-password-file