附003.Kubeadm部署Kubernetes

一 kubeadm介紹

1.1 概述

Kubeadm 是一個工具,它提供了 kubeadm init 以及 kubeadm join 這兩個命令做爲快速建立 kubernetes 集羣的最佳實踐。
kubeadm 經過執行必要的操做來啓動和運行一個最小可用的集羣。kubeadm 只關心啓動集羣,而不關心其餘工做,如部署前的節點準備工做、安裝各類Kubernetes Dashboard、監控解決方案以及特定雲提供商的插件,這些都不屬於 kubeadm 關注範圍。

1.2 kubeadm功能

  • kubeadm init 啓動一個 Kubernetes 主節點;
  • kubeadm join 啓動一個 Kubernetes 工做節點而且將其加入到集羣;
  • kubeadm upgrade 更新一個 Kubernetes 集羣到新版本;
  • kubeadm config 若是使用 v1.7.x 或者更低版本的 kubeadm 初始化集羣,您須要對集羣作一些配置以便使用 kubeadm upgrade 命令;
  • kubeadm token 管理 kubeadm join 使用的令牌;
  • kubeadm reset 還原 kubeadm init 或者 kubeadm join 對主機所作的任何更改;
  • kubeadm version 打印 kubeadm 版本;
  • kubeadm alpha 預覽一組可用的新功能以便從社區蒐集反饋。

二 kubeadm安裝

2.1 前置條件

相應的充足資源的Linux服務器;
建議關閉SELinux及防火牆:sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config && systemctl stop firewalld
Mac及UUID惟一;
若未關閉防火牆則建議放通相應端口,以下:
Master節點——
規則
方向
端口範圍
做用
使用者
TCP
Inbound
6443*
Kubernetes API server
All
TCP
Inbound
2379-2380
etcd server client API
kube-apiserver, etcd
TCP
Inbound
10250
Kubelet API
Self, Control plane
TCP
Inbound
10251
kube-scheduler
Self
TCP
Inbound
10252
kube-controller-manager
Self
Worker 節點
規則
方向
端口範圍
做用
使用者
TCP
Inbound
10250
Kubelet API
Self, Control plane
TCP
Inbound
30000-32767
NodePort Services**
All
其餘更多前置準備見:https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/

2.2 節點規劃

節點
IP
類型
Master
172.24.8.71
Kubernetes master節點
node1
172.24.8.72
Kubernetes node節點1
node2
172.24.8.73
Kubernetes node節點2

提示:本實驗使用單master部署,生產中可部署奇數個master以作高可用。html

2.3 手動添加解析

  1 [root@master ~]# cat <<EOF >> /etc/hosts
  2 172.24.8.71 master
  3 172.24.8.72 node1
  4 172.24.8.73 node2
  5 EOF

提示:全部節點均建議如上操做。

2.4 修正iptables

  1 [root@k8s_master ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf
  2 net.bridge.bridge-nf-call-ip6tables = 1
  3 net.bridge.bridge-nf-call-iptables = 1
  4 net.ipv4.ip_forward = 1
  5 EOF
  6 [root@master ~]# modprobe br_netfilter
  7 [root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf

提示:全部節點均建議如上操做。

2.5 加載IPVS

pod的負載均衡是用kube-proxy來實現的,實現方式有兩種,一種是默認的iptables,一種是ipvs,相對iptables,ipvs有更好的性能。且當前ipvs已經加入到了內核的主幹。
爲kube-proxy開啓ipvs的前提須要加載如下的內核模塊:
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
  1 [root@master ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  2 #!/bin/bash
  3 modprobe -- ip_vs
  4 modprobe -- ip_vs_rr
  5 modprobe -- ip_vs_wrr
  6 modprobe -- ip_vs_sh
  7 modprobe -- nf_conntrack_ipv4
  8 EOF
  9 [root@master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
 10 [root@master ~]# bash /etc/sysconfig/modules/ipvs.modules
 11 [root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
 12 [root@master ~]# yum -y install ipvsadm
001
提示:全部節點均建議如上操做。
爲了更好的管理和查看ipvs,可安裝相應的管理工具《002.LVS管理工具的安裝與使用》。

2.6 安裝Docker

  1 [root@master ~]# yum -y update
  2 [root@master ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
  3 [root@master ~]# yum-config-manager \
  4 --add-repo \
  5 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  6 [root@master ~]# yum list docker-ce --showduplicates | sort -r		#查看可用版本
  7 [root@master ~]# yum -y install docker-ce-18.09.0-3.el7			#kubeadm當前不支持18.09以上版本
  8 [root@master ~]# mkdir /etc/docker
  9 [root@master ~]# cat > /etc/docker/daemon.json <<EOF
 10 {
 11   "exec-opts": ["native.cgroupdriver=systemd"],
 12   "log-driver": "json-file",
 13   "log-opts": {
 14     "max-size": "100m"
 15   },
 16   "storage-driver": "overlay2",
 17   "storage-opts": [
 18     "overlay2.override_kernel_check=true"
 19   ]
 20 }
 21 EOF								#配置system管理cgroup
 22 [root@master ~]# vi /usr/lib/systemd/system/docker.service	#更改docker鏡像路徑
 23 ExecStart=/usr/bin/dockerd-current --data-root=/data/docker	#修改成獨立的單獨路徑
 24 [root@master ~]# systemctl daemon-reload
 25 [root@master ~]# systemctl restart docker
 26 [root@master ~]# systemctl enable docker
 27 [root@master ~]# iptables -nvL		#確認iptables filter表中FOWARD鏈的默認策略(pllicy)爲ACCEPT
002
提示:全部節點均建議如上操做。

Kubernetes 1.13版本兼容docker版本等可參考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md。node

2.7 相關組件包

須要在每臺機器上都安裝如下的軟件包:
kubeadm: 用來初始化集羣的指令;
kubelet: 在集羣中的每一個節點上用來啓動 pod 和 container 等;
kubectl: 用來與集羣通訊的命令行工具。
kubeadm 不能 幫您安裝或管理 kubelet 或 kubectl ,因此得保證他們知足經過 kubeadm 安裝的 Kubernetes 控制層對版本的要求。若是版本沒有知足要求,可能致使一些意外錯誤或問題。
具體相關組件安裝見《附001.kubectl介紹及使用》。

2.8 正式安裝

  1 [root@master ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2 [kubernetes]
  3 name=Kubernetes
  4 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5 enabled=1
  6 gpgcheck=1
  7 repo_gpgcheck=1
  8 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9 EOF
 10 #配置yum源
 11 [root@master ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
002
說明:同時安裝了cri-tools, kubernetes-cni, socat三個依賴:
socat:kubelet的依賴;
cri-tools:即CRI(Container Runtime Interface)容器運行時接口的命令行工具。
  1 [root@master ~]# systemctl enable kubelet
提示:全部節點均建議如上操做。此時不須要啓動kubelet,初始化的過程當中會自動啓動的,若是此時啓動了會出現報錯,忽略便可。

2.9 其餘調整

Kubernetes 從1.8版本開始要求關閉系統的Swap,若是不關閉,默認配置下kubelet將沒法啓動。
  1 [root@master ~]# echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
  2 [root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
提示:同時須要注意fstba等系統掛載的swap。

三 初始化最簡集羣-Mater

3.1 Master上初始化

  1 [root@master ~]# kubeadm init --kubernetes-version=v1.14.0 --pod-network-cidr=10.244.0.0/16
003
  1 [root@master ~]# mkdir -p $HOME/.kube
  2 [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3 [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
提示:選擇flannel做爲Pod網絡插件,因此上面的命令指定–pod-network-cidr=10.244.0.0/16。
默認使用k8s.gcr.io拉取鏡像,國內用戶可經過如下命令使用阿里源:
kubeadm init --kubernetes-version=v1.14.0 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
  1 [root@master ~]# export KUBECONFIG=$HOME/.kube/config			#聲明配置文件
附加:初始化過程粗略解析:
004
初始化Kubernetes大體步驟以下:
  • [kubelet-start] 生成kubelet的配置文件」/var/lib/kubelet/config.yaml」
  • [certificates]生成相關的各類證書
  • [kubeconfig]生成相關的kubeconfig文件
  • [bootstraptoken]生成token記錄下來,後邊使用kubeadm join往集羣中添加節點時會用到
提示:若初始化異常可經過[root@master ~]# kubeadm reset && rm -rf $HOME/.kube重置。

3.2 查看集羣狀態

  1 [root@master ~]# kubectl get cs
  2 NAME                 STATUS    MESSAGE             ERROR
  3 controller-manager   Healthy   ok
  4 scheduler            Healthy   ok
  5 etcd-0               Healthy   {"health":"true"}

四 安裝flannel插件

4.1 NIC插件介紹

Calico 是一個安全的 L3 網絡和網絡策略提供者。
Canal 結合 Flannel 和 Calico, 提供網絡和網絡策略。
Cilium 是一個 L3 網絡和網絡策略插件, 可以透明的實施 HTTP/API/L7 策略。 同時支持路由(routing)和疊加/封裝( overlay/encapsulation)模式。
Contiv 爲多種用例提供可配置網絡(使用 BGP 的原生 L3,使用 vxlan 的 overlay,經典 L2 和 Cisco-SDN/ACI)和豐富的策略框架。Contiv 項目徹底開源。安裝工具同時提供基於和不基於 kubeadm 的安裝選項。
Flannel 是一個能夠用於 Kubernetes 的 overlay 網絡提供者。
Romana 是一個 pod 網絡的層 3 解決方案,而且支持 NetworkPolicy API。Kubeadm add-on 安裝細節能夠在這裏找到。
Weave Net 提供了在網絡分組兩端參與工做的網絡和網絡策略,而且不須要額外的數據庫。
CNI-Genie 使 Kubernetes 無縫鏈接到一種 CNI 插件,例如:Flannel、Calico、Canal、Romana 或者 Weave。
提示:本實驗使用flannel插件,附加演示了另外一種插件Weave的安裝。

4.2 下載flannel配置

  1 [root@master ~]# mkdir flannel
  2 [root@master ~]# cd flannel/
  3 [root@master flannel]# wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
  4 [root@master flannel]# kubectl apply -f kube-flannel.yml
  5 [root@master ~]# kubectl get pod --all-namespaces -o wide	#查看相關pod

005
延伸:
使用kubeadm初始化的集羣,出於安全考慮Pod不會被調度到Master Node上,其策略是由於當前的master節點node1被打上了node-role.kubernetes.io/master:NoSchedule的污點:
  1 [root@master ~]# kubectl describe node master | grep Taint
  2 Taints:             node-role.kubernetes.io/master:NoSchedule

附加:安裝weave插件
  1 [root@master ~]# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
提示:kubeadm 只支持基於容器網絡接口(CNI)的網絡並且不支持 kubenet。
  1 [root@master ~]# kubectl get pods --all-namespaces						#查看驗證
  2 [root@master ~]# kubectl get nodes

007
提示:更多Kubetcl使用參考:https://kubernetes.io/docs/reference/kubectl/kubectl/
https://kubernetes.io/docs/reference/kubectl/overview/
更多kubeadm使用參考:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

五 Node節點安裝

5.1 node節點準備

執行完全部2.2——2.9步驟。

5.2 加入集羣

  1 [root@node1 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
  2 [root@node1 ~]# kubeadm join 172.24.8.71:6443 --token v6xij5.cdhd5h5hspohf1kc \
  3     --discovery-token-ca-cert-hash sha256:94b9a19c3d4b9bd7b4f0ff86a882dad5fe4549b0365626e7f4d26831c9caa0c4
  4 [root@node2 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
  5 [root@node2 ~]# kubeadm join 172.24.8.71:6443 --token v6xij5.cdhd5h5hspohf1kc \
  6     --discovery-token-ca-cert-hash sha256:94b9a19c3d4b9bd7b4f0ff86a882dad5fe4549b0365626e7f4d26831c9caa0c4

008
注意:默認爲0,修改成1,則開啓IP轉發功能,修改後馬上生效,但重啓後失效。

5.3 確認驗證

  1 [root@master ~]# kubectl get nodes						#節點狀態
  2 [root@master ~]# kubectl get cs							#組件狀態
  3 [root@master ~]# kubectl get serviceaccount					#服務帳戶
  4 [root@master ~]# kubectl cluster-info						#集羣信息
  5 [root@master ~]# kubectl get pod -n kube-system -o wide				#全部服務狀態

009
提示:更多Kubetcl使用參考:https://kubernetes.io/docs/reference/kubectl/kubectl/
https://kubernetes.io/docs/reference/kubectl/overview/
更多kubeadm使用參考:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

六 開啓IPVS

6.1 修改ConfigMap

  1 [root@master ~]# kubectl edit cm kube-proxy -n kube-system		#模式改成ipvs
  2 ……
  3 mode: "ipvs"
  4 ……
  5 [root@master ~]# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
  6 [root@master ~]# kubectl get pod -n kube-system | grep kube-proxy	#查看proxy的pod
  7 [root@master ~]# kubectl logs kube-proxy-mgqfs -n kube-system		#查看任意一個proxy pod的日誌

010

七 集羣節點移除

7.1 master節點移除node2


  1 [root@master ~]# kubectl drain node2 --delete-local-data --force --ignore-daemonsets
  2 [root@master ~]# kubectl delete node node2
  3 [root@master ~]# kubectl get nodes

011

7.2 node2節點重置

  1 [root@node2 ~]# kubeadm reset
  2 [root@node2 ~]# ifconfig cni0 down
  3 [root@node2 ~]# ip link delete cni0
  4 [root@node2 ~]# ifconfig flannel.1 down
  5 [root@node2 ~]# ip link delete flannel.1
  6 [root@node2 ~]# rm -rf /var/lib/cni/

7.3 卸載(刪除)集羣

參考6.1+6.2刪除全部集羣節點,而後sudo kubeadm reset。

八 測試集羣

8.1 建立測試service

  1 [root@master ~]# kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=nginx --port=80
  2 [root@master ~]# kubectl expose deployment nginx --type=NodePort --name=example-service		#暴露端口
  3 [root@master ~]# kubectl get service								#查看服務狀態
  4 [root@master ~]# kubectl describe service example-service					        #查看信息

012

8.2 測試訪問

  1 [root@master ~]# curl 10.102.244.218:80
013
  1 [root@master ~]# kubectl get pod -o wide							#查看endpoint
014
  1 [root@master ~]# curl 10.244.3.2:80								#訪問endpoint,與訪問服務ip結果相同
  2 [root@master ~]# curl 10.244.1.2:80


附一:kubeadm init參數

做用:初始化一個Kubernetes master節點
語法:kubeadm init [flags]
參數:
  1 --apiserver-advertise-address string:API Server將要廣播的監聽地址。如指定爲`0.0.0.0` 將使用缺省的網卡地址。
  2 --apiserver-bind-port int32:API Server綁定的端口,缺省值: 6443
  3 --apiserver-cert-extra-sans stringSlice:可選的額外提供的證書的別名,(SANs)用於指定API Server的服務器證書。能夠是IP地址也能夠是DNS名稱。
  4 
  5 --cert-dir string:證書的存儲路徑,缺省值: "/etc/kubernetes/pki"
  6 --config string:kubeadm配置文件的路徑。
  7 --cri-socket string:指明要鏈接的CRI socket文件,缺省值: "/var/run/dockershim.sock"
  8 --dry-run:不會應用任何改變,只會輸出將要執行的操做,即測試運行。
  9 --feature-gates string:鍵值對的集合,用來控制各類功能的開關。可選項有:
 10 Auditing=true|false (當前爲ALPHA狀態 - 缺省值=false)
 11 CoreDNS=true|false (缺省值=true)
 12 DynamicKubeletConfig=true|false (當前爲BETA狀態 - 缺省值=false)
 13 -h, --help:獲取init命令的幫助信息。
 14 --ignore-preflight-errors stringSlice:忽視檢查項錯誤列表,列表中的每個檢查項如發生錯誤將被展現輸出爲警告,而非錯誤。例如: 'IsPrivilegedUser,Swap'. 如填寫爲 'all' 則將忽視全部的檢查項錯誤。
 15 --kubernetes-version string:爲control plane選擇一個特定的Kubernetes版本,缺省值: "stable-1"
 16 --node-name string:指定節點的名稱。
 17 --pod-network-cidr string:指明pod網絡可使用的IP地址段。若是設置了這個參數,control plane將會爲每個節點自動分配CIDRs。
 18 --service-cidr string:爲service的虛擬IP地址另外指定IP地址段,缺省值: "10.96.0.0/12"
 19 --service-dns-domain string:爲services另外指定域名, 例如: "myorg.internal",缺省值: "cluster.local"
 20 --skip-token-print:不打印出由 `kubeadm init` 命令生成的默認令牌。
 21 --token string:這個令牌用於創建主從節點間的雙向受信連接。格式爲 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef
 22 --token-ttl duration:令牌被自動刪除前的可用時長 (示例: 1s, 2m, 3h). 若是設置爲 '0', 令牌將永不過時。缺省值: 24h0m0s


附二:kubeadm init過程

  1. kubeadm init 命令經過執行下列步驟來啓動一個 Kubernetes master 節點。
  2. 在作出變動前運行一系列的預檢項來驗證系統狀態。一些檢查項目僅僅觸發警告,其它的則會被視爲錯誤而且退出 kubeadm,除非問題被解決或者用戶指定了 --ignore-preflight-errors=<list-of-errors> 參數。
  3. 生成一個自簽名的 CA證書 (或者使用現有的證書,若是提供的話) 來爲集羣中的每個組件創建身份標識。若是用戶已經經過 --cert-dir 配置的證書目錄(缺省值爲 /etc/kubernetes/pki)提供了他們本身的 CA證書 以及/或者 密鑰, 那麼將會跳過這個步驟。若是指定了 --apiserver-cert-extra-sans 參數, APIServer 的證書將會有額外的 SAN 條目,若是必要的話,將會被轉爲小寫。
  4. 將 kubeconfig 文件寫入 /etc/kubernetes/ 目錄以便 kubelet、controller-manager 和 scheduler 用來鏈接到 API server,它們每個都有本身的身份標識,同時生成一個名爲 admin.conf 的獨立的 kubeconfig 文件,用於管理操做。
  5. 若是 kubeadm 被調用時附帶了 --feature-gates=DynamicKubeletConfig 參數, 它會將 kubelet 的初始化配置寫入 /var/lib/kubelet/config/init/kubelet 文件中。 這個功能如今是默認關閉的,可是在將來的版本中頗有可能會默認啓用。
  6. 爲 API server、controller manager 和 scheduler 生成靜態 Pod 的清單文件。假使沒有提供一個外部的 etcd 服務的話,也會爲 etcd 生成一份額外的靜態 Pod 清單文件。
  7. 靜態 Pod 的清單文件被寫入到 /etc/kubernetes/manifests 目錄,kubelet 會監視這個目錄以便在系統啓動的時候建立 Pods。
  8. 一旦 control plane 的 Pods 都運行起來, kubeadm init 的工做流程就繼續往下執行。
  9. 若是 kubeadm 被調用時附帶了 --feature-gates=DynamicKubeletConfig 參數, 它將建立一份 ConfigMap 和一些便於 kubelet 訪問這份 ConfigMap 的 RBAC 規則,而且經過將 Node.spec.configSource 指向到新建立的 ConfigMap 來更新節點設置。這樣它就完成了對 Kubelet 的動態配置。 這個功能如今是默認關閉的,可是在將來的版本中頗有可能會默認啓用。
  10. 對 master 節點應用 labels 和 taints 以便不會在它上面運行其它的工做負載。
  11. 生成令牌以便其它節點之後可使用這個令牌向 master 節點註冊它們本身。 可選的,用戶能夠經過 --token 提供一個令牌。
  12. 爲了使得節點可以遵守 Bootstrap Tokens 和 TLS Bootstrap這兩份文檔中描述的機制加入到集羣中,kubeadm 會執行全部的必要配置:
    • 建立一份 ConfigMap 提供添加集羣節點所需的信息,併爲該 ConfigMap 設置相關的 RBAC 訪問規則。
    • 使得 Bootstrap Tokens 能夠訪問 CSR 簽名 API。
    • 對新的 CSR 請求配置爲自動簽發。
提示:經過 API server 安裝一個 DNS 服務器 (CoreDNS) 和 kube-proxy 附加組件。 在 1.11 版本以及更新版本的 Kubernetes 中 CoreDNS 是默認的 DNS 服務器。 若是要安裝 kube-dns 而不是 CoreDNS, 須要在調用 kubeadm 的時候附加 --feature-gates=CoreDNS=false 參數。請注意,儘管 DNS 服務器已經被部署了,它並不會被調度直到你安裝好了 CNI 網絡插件。

參考連接:
https://blog.csdn.net/fanren224/article/details/86573264
https://blog.frognew.com/2019/04/kubeadm-install-kubernetes-1.14.html
http://www.luyixian.cn/news_show_11429.aspx
https://www.kubernetes.org.cn/4956.html
相關文章
相關標籤/搜索