K8S踩坑篇-master節點做爲node節點加入集羣

前面咱們二進制部署K8S集羣時,三臺master節點僅僅做爲集羣管理節點,因此master節點上中並未部署docker、kubelet、kube-proxy等服務。後來我在部署mertics-server、istio組件服務時,發現沒法正常運行,後來嘗試把master節點也加入集羣進行調度,這些組件纔可以正常部署,並能夠正確獲取集羣資源。因此本篇文章主要介紹如何在已經部署好集羣的master節點部署docker、kubelet、kube-proxy等服務。html

注意:本篇文章操做是基於我以前部署集羣時,沒有在master節點部署kubele、kube-proxy、docker等組件,若你的集羣是kubeadm方式部署(默認已經部署這些組件),能夠不關注此文章。node

master節點部署與node節點部署方式基本一致,因此文章中涉及的證書及各配置文件均可以通用,詳情能夠參考前面三個章節部署;linux

K8S從入門到放棄系列-(8)kube-apiserver 高可用配置
K8S從入門到放棄系列-(9)kubernetes集羣之kubelet部署
K8S從入門到放棄系列-(10)kubernetes集羣之kube-proxy部署nginx

一、部署dockerdocker

## 設置存儲庫
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum install -y yum-utils device-mapper-persistent-data lvm2'
## 添加yum源
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo'
## 安裝指定版本docker
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum install docker-ce-18.09.5-3.el7 -y'
## 啓動
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable docker'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start docker'

二、部署kubeletshell

對於在 master 節點啓動 kubelet 來講,不須要 nginx 作負載均衡;能夠跳過nginx-proxy部署,直接進行kubelet、kube-proxy的安裝,並修改 kubelet.kubeconfig、kube-proxy.kubeconfig 中的 apiserver 地址爲當前 master ip 6443 端口便可,我配置文件中是127.0.0.1:6443,無需修改。bootstrap

## 把配置文件分發至各master節點
### bootstrap.kubeconfig
[root@k8s
-master01 ~]# ansible k8s-master -m copy -a 'src=/root/bootstrap.kubeconfig dest=/etc/kubernetes/config/'

###
kubelet.conf(別忘了修改參數中對應的主機名、IP地址、--node-labels選項)
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/cfg/kubelet.conf dest=/etc/kubernetes/config/'

### master節點設置taint 
[root@k8s-master01 ~]# kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:NoSchedule
[root@k8s-master02 ~]# kubectl taint nodes k8s-master02 node-role.kubernetes.io/master=:NoSchedule
[root@k8s-master03 ~]# kubectl taint nodes k8s-master03 node-role.kubernetes.io/master=:NoSchedule

注意:kubelet.conf配置文件中--node-labels=node-role.kubernetes.io/k8s-node=true 這個選項,它的做用只是在 kubectl get node 時 ROLES 欄顯示是什麼節點;
     對於master節點須要修改成--node-labels=node-role.kubernetes.io/k8s-master=true,後面這個 node-role.kubernetes.io/master 是 kubeadm 用的,這個 label 會告訴 k8s 調度器當前節點爲 master節點;
   若是不想讓master節點參與到正常的pod調度,則須要對master進行打污點標籤,這樣master就不會有pod建立(pod建立時能夠進行容忍度設置,這樣master仍是能夠進行pod調度)
### kubelet.service  
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/unit/kubelet.service dest=/usr/lib/systemd/system/'

## 建立kubelet數據目錄
[root@k8s-master01 ~]# ansible k8s-master -m file -a 'path=/var/lib/kubelet state=directory'

## 啓動服務
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl daemon-reload'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable kubelet'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start kubelet

## 查看未受權的csr請求
[root@k8s-master01 ~]# kubectl get csr

## 批准kubelet 的 TLS 證書請求
[root@k8s-master01 ~]# kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve

## 查看各節點就緒狀態
### 須要等待一段時間,由於須要下載安裝網絡組件鏡像
[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    <none>   25h   v1.14.1
k8s-master02   Ready    <none>   25h   v1.14.1
k8s-master03   Ready    <none>   25h   v1.14.1
k8s-node01     Ready    <none>   10d   v1.14.1
k8s-node02     Ready    <none>   10d   v1.14.1
 

二、kube-proxy部署centos

## 開啓ipvs
[root@k8s-master01 ~]# ansible k8s-master -m shell -a "yum install -y ipvsadm ipset conntrack"
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_rr'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_wrr'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_sh'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- nf_conntrack_ipv4'

## 分發kube-proxy證書文件
[root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/kube-proxy-key.pem dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/kube-proxy.pem dest=/etc/kubernetes/ssl/'

## kubeconfig
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/root/kube-proxy.kubeconfig dest=/etc/kubernetes/config/'

## kube-proxy.conf配置文件(修改hostname-override字段所屬主機名)
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/cfg/kube-proxy.conf dest=/etc/kubernetes/config/'

## kube-proxy.service啓動腳本
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/unit/kube-proxy.service dest=/usr/lib/systemd/system/'

## 啓動
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl daemon-reload'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable kube-proxy'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start kube-proxy'

總結:以上就是master節點部署kubelet、kube-proxy組件過程,以上有幾個關鍵點從新整理:api

  一、對於新安裝集羣來講,建議在部署集羣時就安裝三個服務,而不是集羣部署後,遇到問題再進行部署。 網絡

  二、master節點上kubelet.conf中--node-labels=node-role.kubernetes.io/k8s-node=true修改成--node-labels=node-role.kubernetes.io/k8s-master=true

  三、master節點上,kubelet、kube-proxy直接與本地kube-apiserver通訊便可,無需進行nginx負載均衡配置,及不須要部署nginx-proxy

相關文章
相關標籤/搜索