附003.Kubeadm部署Kubernetes
阿新 • • 發佈:2019-06-19
一 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節點——2.2 節點規劃
提示:本實驗使用單master部署,生產中可部署奇數個master以做高可用。
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 提示:所有節點均建議如上操作。 為了更好的管理和檢視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。提示:所有節點均建議如上操作。
Kubernetes 1.13版本相容docker版本等可參考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md。
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說明:同時安裝了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
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 #宣告配置檔案附加:初始化過程粗略解析: 初始化Kubernetes大致步驟如下:
- [kubelet-start] 生成kubelet的配置檔案”/var/lib/kubelet/config.yaml”
- [certificates]生成相關的各種證書
- [kubeconfig]生成相關的kubeconfig檔案
- [bootstraptoken]生成token記錄下來,後邊使用kubeadm join往叢集中新增節點時會用到
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延伸: 使用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提示:更多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注意:預設為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 #所有服務狀態提示:更多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的日誌
七 叢集節點移除
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
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 #檢視資訊
8.2 測試訪問
1 [root@master ~]# curl 10.102.244.218:80
1 [root@master ~]# kubectl get pod -o wide #檢視endpoint
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過程
- kubeadm init 命令通過執行下列步驟來啟動一個 Kubernetes master 節點。
- 在做出變更前執行一系列的預檢項來驗證系統狀態。一些檢查專案僅僅觸發警告,其它的則會被視為錯誤並且退出 kubeadm,除非問題被解決或者使用者指定了 --ignore-preflight-errors=<list-of-errors> 引數。
- 生成一個自簽名的 CA證書 (或者使用現有的證書,如果提供的話) 來為叢集中的每一個元件建立身份標識。如果使用者已經通過 --cert-dir 配置的證書目錄(預設值為 /etc/kubernetes/pki)提供了他們自己的 CA證書 以及/或者 金鑰, 那麼將會跳過這個步驟。如果指定了 --apiserver-cert-extra-sans 引數, APIServer 的證書將會有額外的 SAN 條目,如果必要的話,將會被轉為小寫。
- 將 kubeconfig 檔案寫入 /etc/kubernetes/ 目錄以便 kubelet、controller-manager 和 scheduler 用來連線到 API server,它們每一個都有自己的身份標識,同時生成一個名為 admin.conf 的獨立的 kubeconfig 檔案,用於管理操作。
- 如果 kubeadm 被呼叫時附帶了 --feature-gates=DynamicKubeletConfig 引數, 它會將 kubelet 的初始化配置寫入 /var/lib/kubelet/config/init/kubelet 檔案中。 這個功能現在是預設關閉的,但是在未來的版本中很有可能會預設啟用。
- 為 API server、controller manager 和 scheduler 生成靜態 Pod 的清單檔案。假使沒有提供一個外部的 etcd 服務的話,也會為 etcd 生成一份額外的靜態 Pod 清單檔案。
- 靜態 Pod 的清單檔案被寫入到 /etc/kubernetes/manifests 目錄,kubelet 會監視這個目錄以便在系統啟動的時候建立 Pods。
- 一旦 control plane 的 Pods 都執行起來, kubeadm init 的工作流程就繼續往下執行。
- 如果 kubeadm 被呼叫時附帶了 --feature-gates=DynamicKubeletConfig 引數, 它將建立一份 ConfigMap 和一些便於 kubelet 訪問這份 ConfigMap 的 RBAC 規則,並且通過將 Node.spec.configSource 指向到新建立的 ConfigMap 來更新節點設定。這樣它就完成了對 Kubelet 的動態配置。 這個功能現在是預設關閉的,但是在未來的版本中很有可能會預設啟用。
- 對 master 節點應用 labels 和 taints 以便不會在它上面執行其它的工作負載。
- 生成令牌以便其它節點以後可以使用這個令牌向 master 節點註冊它們自己。 可選的,使用者可以通過 --token 提供一個令牌。
- 為了使得節點能夠遵照 Bootstrap Tokens 和 TLS Bootstrap這兩份文件中描述的機制加入到叢集中,kubeadm 會執行所有的必要配置:
- 建立一份 ConfigMap 提供新增叢集節點所需的資訊,併為該 ConfigMap 設定相關的 RBAC 訪問規則。
- 使得 Bootstrap Tokens 可以訪問 CSR 簽名 API。
- 對新的 CSR 請求配置為自動簽發。