kubernetes1.13.X實踐-部署

小布神話發表於2018-12-27

原文地址:junyao.tech/2018/12/04/…

最近沉迷在 Kubernetes部署中不能自拔,作為初學者,基本上把可能踩的坑都踩了一遍,先分享一下怎麼部署 Kubernetes 叢集 首先,我們要知道 Kubernetes 是什麼:

Kubernetes簡稱為k8s,它是 Google 開源的容器叢集管理系統。在 Docker 技術的基礎上,為容器化的應用提供部署執行、資源排程、服務發現和動態伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。

K8s 是一個完備的分散式系統支撐平臺,具有完備的叢集管理能力,多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和線上擴容能力、可擴充套件的資源自動排程機制以及多粒度的資源配額管理能力。同時 K8s 提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。

安裝 Docker

新增使用 HTTPS 傳輸的軟體包以及 CA 證書

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
複製程式碼

新增軟體源的 GPG 金鑰

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
複製程式碼

向 source.list 中新增 Docker 軟體源

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
複製程式碼

安裝指定版本

$ apt-cache madison docker-ce
$ sudo apt-get install docker-ce=<VERSION>
複製程式碼

在測試或開發環境中 Docker 官方為了簡化安裝流程,提供了一套便捷的安裝指令碼,Ubuntu 系統上可以使用這套指令碼安裝:

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
複製程式碼
安裝 kubeadm, kubelet 和 kubectl

官方源

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
複製程式碼

因為某些你懂的原因,要更換阿里源,並安裝kubelet kubeadm kubectl:

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF  
apt-get update
apt-get install -y kubelet kubeadm kubectl
複製程式碼
關閉swap
$ sudo swapoff -a
複製程式碼
使用kubeadm建立一個叢集

使用 kubeadm 建立 k8s 叢集其實還蠻簡單,最大的困難是那堵牆,當我費了一整天把那堵牆問題解決後,發現 1.13.0 版本居然提供了中國特供的一個功能,所以把兩種方法都寫出來,供大家參考。

1.13.0 版本之前

檢視kubeadm 會用到哪幾個映象:

$ kubeadm config images list
複製程式碼

把得到的

k8s.gcr.io/kube-apiserver:v1.13.0
k8s.gcr.io/kube-controller-manager:v1.13.0
k8s.gcr.io/kube-scheduler:v1.13.0
k8s.gcr.io/kube-proxy:v1.13.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6
複製程式碼

寫個批量指令碼獲取替換成阿里雲映象地址拉取images並打回標籤

images=(
kube-apiserver:v1.13.0
kube-controller-manager:v1.13.0
kube-scheduler:v1.13.0
kube-proxy:v1.13.0
pause:3.1
etcd:3.2.24
coredns:1.2.6
)
//pull映象重新標記tag
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
複製程式碼

拉取完後
kubeadm init 就可以完成 Kubernetes Master 的部署了

1.13.0版本之後

Kubenetes預設Registries地址是k8s.gcr.io,很明顯,在國內並不能訪問gcr.io,因此在kubeadm v1.13之前的版本,安裝起來非常麻煩,但是在1.13版本中終於解決了國內的痛點,其增加了一個--image-repository引數,預設值是k8s.gcr.io,我們將其指定為國內映象地址:registry.aliyuncs.com/google_containers,其它的就可以完全按照官方文件來愉快的玩耍了。

$ kubeadm init \
	--image-repository registry.aliyuncs.com/google_containers \
    --pod-network-cidr=192.168.0.0/16 \
    --ignore-preflight-errors=cri \
    --kubernetes-version=1.13.1
複製程式碼

kubeadm 會生成一行指令:

kubeadm join 10.168.0.2:6443 --token 00bwbx.uvnaa2ewjflwu1ry --discovery-token-ca-cert-hash sha256:00eb62a2a6020f94132e3fe1ab721349bbcd3e9b94da9654cfe15f2985ebd711
複製程式碼

並提示如下命令執行確保授權配置

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

複製程式碼

安裝完後, kubectl get 命令來檢視當前唯一一個節點的狀態了

$ kubectl get nodes

NAME           STATUS   ROLES    AGE   VERSION
iz94t4csjq4z   NotReady    master   82m   v1.13.0
複製程式碼

其中STATUS 是NotReady 我們通過kubectl describe 來檢視這個節點(Node)物件的詳細資訊、狀態和事件(Event)資訊

kubectl describe node {NAME}
//$ kubectl describe node iz94t4csjq4z

...
Conditions:
...

Ready   False ... KubeletNotReady  runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

複製程式碼

通過 kubectl describe 指令的輸出,我們可以看到 NodeNotReady 的原因在於,我們尚未部署任何網路外掛。 後面我們將專門講關於部署外掛。

另外,我們還可以通過 kubectl 檢查這個節點上各個系統 Pod 的狀態,其中,kube-system 是 Kubernetes 專案預留的系統 Pod 的工作空間(Namepsace,注意它並不是 Linux Namespace,它只是 Kubernetes 劃分 不同工作空間的單位):

$ kubectl get pods -n kube-system

NAME               READY   STATUS   RESTARTS  AGE
coredns-78fcdf6894-j9s52     0/1    Pending  0     1h
coredns-78fcdf6894-jm4wf     0/1    Pending  0     1h
etcd-master           1/1    Running  0     2s
kube-apiserver-master      1/1    Running  0     1s
kube-controller-manager-master  0/1    Pending  0     1s
kube-proxy-xbd47         1/1    NodeLost  0     1h
kube-scheduler-master      1/1    Running  0     1s

複製程式碼

可以看到,CoreDNS、kube-controller-manager 等依賴於網路的 Pod 都處於 Pending 狀態,即排程失敗。這當然是符合預期的:因為這個 Master 節點的網路尚未就緒。

命令

獲取端部節點

$ kubectl get nodes

NAME           STATUS   ROLES    AGE     VERSION
iz94t4csjq4z   Ready    master   3h57m   v1.13.0
複製程式碼

檢視node詳細

$ kubectl describe node iz94t4csjq4z
複製程式碼

檢視全部pod

$ kubectl get pods --all-namespaces
複製程式碼

通過namespaces獲取pod

$ kubectl get pods -n kube-system

NAME                                    READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-qqddh                1/1     Running   0          3h58m
coredns-86c58d9df4-xxccw                1/1     Running   0          3h58m
etcd-iz94t4csjq4z                       1/1     Running   0          3h57m
kube-apiserver-iz94t4csjq4z             1/1     Running   0          3h57m
kube-controller-manager-iz94t4csjq4z    1/1     Running   1          3h57m
kube-proxy-k4zkp                        1/1     Running   0          3h58m
kube-scheduler-iz94t4csjq4z             1/1     Running   1          3h57m
kubernetes-dashboard-79ff88449c-dxbsb   1/1     Running   0          3h27m
weave-net-c7dvl                         2/2     Running   0          3h49m
複製程式碼

檢視pod

$ kubectl describe pod -n kube-system
複製程式碼

檢視pod具體詳情

$ kubectl describe pod kubernetes-dashboard-767dc7d4d-mg5gw -n kube-system
複製程式碼
$ kubectl edit cm coredns -n kube-system
$ kubectl -n kube-system edit configmap coredns
複製程式碼

單節點配置( Master 隔離)

預設情況下 Master 節點是不允許執行使用者 Pod 的,而 Kubernetes 做到這一點,依靠的是 是 Kubernetes 的 Taint/Toleration 機制。一旦某個節點被加上了一個 Taint,即被“打上了汙點”那麼所有 Pod 就都不能在這個節點上執行,因為 Kubernetes 的 Pod 都有“潔癖”。 如果你通過 kubectl describe 檢查一下 Master 節點的 Taint 欄位,就會有所發現了:

$ kubectl describe node master

Name:               master
Roles:              master
Taints:             node-role.kubernetes.io/master:NoSchedule

複製程式碼

可以看到,Master 節點預設被加上了node-role.kubernetes.io/master:NoSchedule這樣一個“汙點”,其中“鍵”是node-role.kubernetes.io/master,而沒有提供“值”。

如果你就是想要一個單節點的 Kubernetes,刪除個 Taint 才是正確的選擇:

$ kubectl taint nodes --all node-role.kubernetes.io/master-
複製程式碼

如上所示,我們在“node-role.io/master”這個鍵後… Taint。

這個步驟的配置最終使Master節點能允許執行使用者pod,也是確保下面外掛部署能正確執行。

到了這一步,一個基本完整的 Kubernetes 叢集就完畢了。

部署外掛

部署 Dashboard 視覺化外掛

kubernetes-dashboard先從國內映象拉下來:

$ docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.0
$ docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
$ docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.0
複製程式碼

打上kis.gcr.io的tag,這樣執行Dashboard拉取的時候就直接本地拿pull下來的直接安裝。

安裝
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
刪除
$ kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
複製程式碼

安裝後

$ kubectl describe pod kubernetes-dashboard -n kube-system 
複製程式碼

可檢視Dashboard狀態

部署網路外掛

部署網路外掛非常簡單 因為這裡的映象來源不是kis.gcr.io,所以我們就不先拉取映象下來.

安裝
$ kubectl apply -f https://git.io/weave-kube-1.6
刪除
$ kubectl delete -f https://git.io/weave-kube-1.6
複製程式碼

部署完成後,我們可以通過 kubectl get 重新檢查Pod的狀態:

$ kubectl get pods -n kube-system

NAME                             READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-j9s52         1/1       Running   0          1d
coredns-78fcdf6894-jm4wf         1/1       Running   0          1d
etcd-master                      1/1       Running   0          9s
kube-apiserver-master            1/1       Running   0          9s
kube-controller-manager-master   1/1       Running   0          9s
kube-proxy-xbd47                 1/1       Running   0          1d
kube-scheduler-master            1/1       Running   0          9s
weave-net-cmk27                  2/2       Running   0          19s

複製程式碼
部署容器儲存外掛
安裝
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml


刪除
$ kubectl delete -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
$ kubectl delete -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml

檢視安裝情況
$ kubectl get pods -n rook-ceph-system
$ kubectl get pods -n rook-ceph
複製程式碼

加入工作節點

SSH到其他機器上,成為 root 使用者(如:sudo su -),安裝 kubeadm, kubelet and kubectl。

然後複製上面的執行kubeadm init命令時最後一句輸出,並執行它的:

$ kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
複製程式碼

這時候回到master 節點伺服器,執行下面命令檢視節點狀態:

$ kubectl get nodes
複製程式碼

NAME STATUS ROLES AGE VERSION izuf6e4bl8eavupeu7q9a0z Ready 98s v1.13.0 izuf6e4bl8eavupeu7q9a1z Ready master 75m v1.13.0 如果我們忘記了Master節點的加入token,可以使用如下命令來檢視:

$ kubeadm token list
複製程式碼

預設情況下,token的有效期是24小時,如果我們的token已經過期的話,可以使用以下命令重新生成:

$ kubeadm token create
複製程式碼

如果我們也沒有--discovery-token-ca-cert-hash的值,可以使用以下命令生成:

$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
複製程式碼

至此一個簡單的 k8s 叢集部署就差不多了。

常見問題

2018/11/05 04:04:18 [INFO] plugin/reload: Running configuration MD5 = f65c4821c8a9b7b5eb30fa4fbc167769
2018/11/05 04:04:24 [FATAL] plugin/loop: Seen "HINFO IN 6900627972087569316.7905576541070882081." more than twice, loop detected
複製程式碼
配置:--resolv-conf
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
複製程式碼

stackoverflow.com/questions/5… stackoverflow.com/questions/5… www.jianshu.com/p/e4dcd56fa…

systemctl daemon-reload && systemctl restart kubelet
複製程式碼

相關文章