kubernetes1.9.6墻內(nèi)離線部署(附資源)

簡(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

image.png

按照上面提示,此時(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

顯示如下表示正常:


image.png
  • 部署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):
image.png

從上圖中看目前所有節(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

image.png

對(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)是這樣子滴:

image.png

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和上面的一樣,需要自行修改。
image.png

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


image.png
  • 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這行注釋掉。
如下圖:


image.png

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=>選擇口令=>輸入上面的口令即可:

image.png

image.png

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ò)


basic.png

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


basic-login.png

參考:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 安裝k8s Master高可用集群 主機(jī) 角色 組件 172.18.6.101 K8S Master Kubele...
    jony456123閱讀 8,171評(píng)論 0 9
  • 版權(quán)聲明:原創(chuàng)作品,謝絕轉(zhuǎn)載!否則將追究法律責(zé)任。 前言 最近中國(guó)和印度的局勢(shì)也是愈演愈烈。作為一個(gè)愛(ài)國(guó)青年我有些...
    李偉銘MIng閱讀 2,248評(píng)論 0 5
  • Kubernetes部屬說(shuō)明 環(huán)境準(zhǔn)備 資料準(zhǔn)備 開(kāi)始部屬 編寫(xiě)yaml文件,用于部屬Kubenetes基礎(chǔ)容器e...
    俊逸之光閱讀 2,781評(píng)論 2 0
  • docker實(shí)現(xiàn)了更便捷的單機(jī)容器虛擬化的管理, docker的位置處于操作系統(tǒng)層與應(yīng)用層之間; 相對(duì)傳統(tǒng)虛擬化(...
    Harvey_L閱讀 20,159評(píng)論 3 44
  • 每次打開(kāi)手機(jī),想找一本好書(shū),好的電影,好的學(xué)習(xí)軟件,但是打開(kāi)這個(gè),關(guān)掉那個(gè)把時(shí)間都耗費(fèi)在找的時(shí)間上了,問(wèn)題是最后也...
    道路曲折而挑戰(zhàn)閱讀 265評(píng)論 0 0

友情鏈接更多精彩內(nèi)容